資源簡介
C++ MP4v2獲取rtsp流并保存為MP4文件,ffmpeg版本為4.0.1,其中的dll,lib,include在程序中已經提供,編譯環境為vs2012
代碼片段和文件信息
#pragma?once
#include?“MP4Encoder.h“
#define?DEFAULT_VIDEO_TRACK_NUM?3
#define?DEFAULT_VIDEO_PROFILE_LEVEL?1
#define?DEFAULT_AUDIO_PROFILE_LEVEL?2
MP4Encoder::MP4Encoder(void)
:?m_hFile(MP4_INVALID_FILE_HANDLE)
?m_videoTrack(MP4_INVALID_TRACK_ID)
?m_audioTrack(MP4_INVALID_TRACK_ID)
{
}
MP4Encoder::~MP4Encoder(void)
{
}
int?MP4Encoder::MP4CreateFile(const?char?*sFileNameint?Movie_Time_Scale)
{
m_hFile?=?MP4Create(sFileName);
if?(m_hFile?==?MP4_INVALID_FILE_HANDLE)
{
printf(“create?mp4?file?error!\n“);
return?-1;
}
if?(!MP4SetTimeScale(m_hFile?Movie_Time_Scale))
{
printf(“set?time?Scale?error!\n“);
return?-1;
}
return?0;
}
int??MP4Encoder::MP4AddH264Track(const?uint8_t?*sData?int?nSize
int?nWidth?int?nHeight?int?nframeRate?int?Video_Time_Scale)
{
int?sps?pps;
for?(sps?=?0;?sps? if?(sData[sps++]?==?0x00?&&?sData[sps++]?==?0x00?&&?sData[sps++]?==?0x00
&&?sData[sps++]?==?0x01)
break;
for?(pps?=?sps;?pps? if?(sData[pps++]?==?0x00?&&?sData[pps++]?==?0x00?&&?sData[pps++]?==?0x00
&&?sData[pps++]?==?0x01)
break;
if?(sps?>=?nSize?||?pps?>=?nSize)
return?-1;
m_videoTrack?=?MP4AddH264VideoTrack(m_hFile?Video_Time_Scale
Video_Time_Scale?/?nframeRate?nWidth?nHeight
sData[sps?+?1]?sData[sps?+?2]?sData[sps?+?3]?DEFAULT_VIDEO_TRACK_NUM);//sps?后面的三個字節
if?(MP4_INVALID_TRACK_ID?==?m_videoTrack)
{
printf(“add?video?track?error!\n“);
return?-1;
}
MP4SetVideoProfileLevel(m_hFile?DEFAULT_VIDEO_PROFILE_LEVEL);
MP4AddH264SequenceParameterSet(m_hFile?m_videoTrack?sData?+?spspps?-?sps?-?4);//sps??內容??起始位置+長度??
MP4AddH264PictureParameterSet(m_hFile?m_videoTrack?sData?+?ppsnSize?-?pps);//?pps?內容??起始位置+長度
return?0;
}
int???MP4Encoder::MP4AddAACTrack(const?uint8_t?*sData?int?nSizeint?Audio_Time_Scale)
{
m_audioTrack?=?MP4AddAudioTrack(m_hFile?Audio_Time_Scale1024?MP4_MPEG4_AUDIO_TYPE);
if?(MP4_INVALID_TRACK_ID?==?m_audioTrack)
{
printf(“add?audio?track?error!\n“);
return?-1;
}
MP4SetAudioProfileLevel(m_hFile?DEFAULT_AUDIO_PROFILE_LEVEL);
if?(!MP4SetTrackESConfiguration(m_hFile?m_audioTrack?sData?nSize))
{
printf(“set?track?ESConfiguration?error!\n“);
return?-1;
}
return?0;
}
int?MP4Encoder::MP4WriteH264Data(uint8_t?*sData?int?nSize)
{
bool?result?=?false;
sData[0]?=?(nSize?-?4)?>>?24;
sData[1]?=?(nSize?-?4)?>>?16;
sData[2]?=?(nSize?-?4)?>>?8;
sData[3]?=?nSize?-?4;
if(nSize<0||sData==NULL)
return?-1;
if?((sData[4]?&?0x1F)?==?5)//判斷I幀
result?=?MP4WriteSample(m_hFile?m_videoTrack?sData?nSizeMP4_INVALID_DURATION0true);
else
result?=?MP4WriteSample(m_hFile?m_videoTrack?sData?nSizeMP4_INVALID_DURATION0false);
if?(!result)
{
printf(“write?h264?frame?error!\n“);
return?-1;
}
return?0;
}
int??MP4Encoder::MP4WriteAACData(const?uint8_t?*sData?int?nSize)
{
bool?result?=?false;
if(nSize<0||sData==NULL)
ret
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-08-06?17:29??MP4Recorder\
?????目錄???????????0??2019-08-06?16:45??MP4Recorder\Debug\
?????文件????31476736??2018-07-25?16:07??MP4Recorder\Debug\avcodec-58.dll
?????文件?????5897216??2018-07-25?16:07??MP4Recorder\Debug\avformat-58.dll
?????文件??????671232??2018-07-25?16:07??MP4Recorder\Debug\avutil-56.dll
?????目錄???????????0??2019-08-06?16:45??MP4Recorder\Debug\include\
?????文件????????7976??2015-02-13?01:38??MP4Recorder\Debug\include\_mingw.h
?????文件????????5721??2015-02-13?01:38??MP4Recorder\Debug\include\inttypes.h
?????目錄???????????0??2019-08-06?16:45??MP4Recorder\Debug\include\libavcodec\
?????文件????????1207??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\ac3_parser.h
?????文件????????1354??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\adts_parser.h
?????文件??????211684??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\avcodec.h
?????文件????????2570??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\avdct.h
?????文件????????3111??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\avfft.h
?????文件????????2853??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\d3d11va.h
?????文件????????4044??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\dirac.h
?????文件????????3715??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\dv_profile.h
?????文件????????2361??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\dxva2.h
?????文件????????1650??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\jni.h
?????文件????????2825??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\mediacodec.h
?????文件????????3763??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\qsv.h
?????文件????????2297??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\vaapi.h
?????文件????????5796??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\vdpau.h
?????文件????????4785??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\version.h
?????文件????????4029??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\videotoolbox.h
?????文件????????2285??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\vorbis_parser.h
?????文件????????6062??2018-07-25?16:07??MP4Recorder\Debug\include\libavcodec\xvmc.h
?????目錄???????????0??2019-08-06?16:45??MP4Recorder\Debug\include\libavformat\
?????文件??????117558??2018-07-25?16:07??MP4Recorder\Debug\include\libavformat\avformat.h
?????文件???????31557??2018-07-25?16:07??MP4Recorder\Debug\include\libavformat\avio.h
?????文件????????3781??2018-07-25?16:07??MP4Recorder\Debug\include\libavformat\version.h
............此處省略283個文件信息
- 上一篇:C程序設計高級教程周立功完整版
- 下一篇:MFC界面美化之SkinMagic典型
評論
共有 條評論