用MP4V2库封装MP4时,时间戳怎么转换呢?

qingfeng_happy7 2016-05-31 09:10:28
使用场景是软件实时采集摄像机信号,然后将视频编码为H.264,音频编码为AAC,然后用MP4V2库将音视频封装成MP4文件保存。现在遇到的问题是调用MP4V2的接口时,时间戳不知道该怎么转换。不做转换的话我试了一下,播放出来音视频严重不同步。

编码完的H.264和AAC数据帧的时间基应该都是基于90000的,有资料上说封装MP4时音视频是采用不同的时间基,分别是什么?在写入H264和AAC数据时,写入规则是什么样的,是哪个时间戳小就先写入哪个吗?
...全文
732 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
boy_going 2018-07-17
  • 打赏
  • 举报
回复
能否指教一下音频怎么播放的,我用mp4v2转换的mp4无法播放音频,查了很多资料都没看出哪有问题
chenchao_shenzhen 2016-06-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/chenchao_shenzhen/article/details/51720005
chenchao_shenzhen 2016-06-21
  • 打赏
  • 举报
回复
所有问题的答案都在这里有详尽解答: http://edu.csdn.net/course/detail/2314
rightorwrong 2016-06-01
  • 打赏
  • 举报
回复
视频设置的是帧率,音频那个字段是什么,设置的多少
qingfeng_happy7 2016-05-31
  • 打赏
  • 举报
回复
自己顶一下。
qingfeng_happy7 2016-05-31
  • 打赏
  • 举报
回复
引用 2 楼 rightorwrong 的回复:
好像是有个文件头,设置个时间信息,然后数据直接写就可以了
我试过了,那样做音视频都可以正常播放,但不同步。
rightorwrong 2016-05-31
  • 打赏
  • 举报
回复
好像是有个文件头,设置个时间信息,然后数据直接写就可以了
封装了开源工程, 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

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧