封装h264,/mpeg4 为MP4文件

时间:2016-01-11 09:07:39
【文件属性】:

文件名称:封装h264,/mpeg4 为MP4文件

文件大小:246KB

文件格式:RAR

更新时间:2016-01-11 09:07:39

MP4,h264

封装了开源工程, mp4v2, mpeg4ip代码, /******************************************/ /* Name:Mp4Interface.h /* Mark:mp4封装解析接口 /* author: machh /* date:2012.5.12. /******************************************/ #ifndef _MP4_INTERFACE_ #define _MP4_INTERFACE_ #include "MP4Writer.h" #include "MP4Reader.h" typedef struct _tagPACKET_HEADER_ { _tagPACKET_HEADER_() { nType = 0; nLen = 0; nTime = 0; } unsigned long nTime; // 不依赖于I帧的参考时间 int nLen; // 不包括该头结构本身大小 int nType; }PACKET_HEADER; enum FILE_OPEN_MODEL { OPEN_MODEL_W, // 写文件 OPEN_MODEL_R // 读文件 r+b }; class Mp4Interface { public: Mp4Interface(void); ~Mp4Interface(void); public: /* * @mark 打开文件 * @param[in] nModel文件打开方式,如果nModel为OPEN_MODEL_W 则创建文件 * @param[in] nMediaType 值为 MP4_VIDEOTYPE_H264/MP4_VIDEOTYPE_MPEG4 * @return 操作结果 */ int OpenFile(const char* strPath, FILE_OPEN_MODEL nModel, int nMediaType ); /* * @Name:Close * @mark: 读写操作结束之后,必须调用此函数 */ int Close(); public: //写操作 /* * @mark: 添加视频轨道 * @param[out] nTrackId 轨道ID * @param[in] nWidth,nHeight 画面宽高 * @param[out] fps 帧率 */ int AddVideoTrack (int& nTrackId, const int nWidth, const int nHeight, const double fps ); /* * @mark: 写一帧数据 * @param[in] lpData 要写入的数据 * @param[in] nSize 要写入的数据大小 * @param[in] nTimestamp 时间戳 */ BOOL WriteFrame( const int nTrackId, const uint8_t* const lpData, const int nSize, const MP4Timestamp nTimestamp, const MP4Duration nDuration = -1 ); /* * @mark: 添加音频轨道 aac * @param[out] nTrackId * @param[in] nSamplePerSec (timescale) */ int AddAudioTrack( int& nTrackId, const int nSamplePerSec, const int nSamplePerFrame = -1 ); public: //读操作 /* * @mark : 全局函数,读取整个MP4文件结构信息, * 函数内部会fopen/fclose,该函数应当在OpenFile之前调用 * @param[in] strFile 文件路径 * @param[out] lsTrackInfo 输出文件信息结构 */ bool static GetMP4FileInfo( const char* strFile, MP4_TRACKINFO_LIST& lsTrackInfo ); /* * @mark:SetReadTrackId设置轨道ID, */ int SetReadTrackId( int nTrackID ); /* * @mark:获取轨道信息,该函数必须在OpenFile(……)之后调用才有效 */ int GetTrackInfo( MP4_TRACK_INFO* pstTrackInfo ); /* * @mark: 读取一帧数据 */ int ReadFrameData( DWORD nSampleId, BYTE** ppFrame, DWORD* pnBufSize,int& nFrameType ); protected: int m_nOpenModel; int m_nMediaType; CMP4Writer * m_pMp4Writer; CMP4Reader * m_pMp4Reader; }; #endif// end


网友评论

  • 不会用,感觉不怎地
  • 非常實用, 感謝提供
  • 最后还是用M,P4V2
  • 没有什么用,直接用mp4v2就行了!
  • 使用c++,嵌入式下用又一定限制
  • 用着有些问题,修改了不少地方,勉强可用。
  • 很不错的资源 学习中 谢谢
  • 只是一个lib,没有调用的例子。这个lib封装的很好,要自己研究一下怎么用
  • 很不错的资源,写得很全面。可以运行,正在学习中
  • 希望可以用啊~
  • 用着有些问题,修改了不少地方,勉强可用,但是还是有问题。视频在某些播放器播放不了,音视频同步问题,哎
  • 一大堆接口,不知从何调用起,最好有个示例代码。
  • 不知道如何用,很可惜,封装的东西很好很重要
  • 感觉很复杂,但是有些东西还是有参考价值的
  • 直接可以用,谢谢!
  • 还是有学习的地方 ,谢谢分享
  • 有参考价值的
  • 挺好的,多少有点帮助
  • 太复杂了~~
  • 多谢分享,内容很多,有待深入理解
  • 看不太明白,没用上
  • 谢谢分享,还是有点用的!
  • 代码值得借鉴
  • 多谢分享,内容很多,有待深入理解
  • 谢谢分享。但是这个要怎么编译啊?