实时采集摄像头图像,转码然后RTMP实时推流,发现音视频不同步,该怎么解决?

qingfeng_happy7 2016-05-27 04:03:23
先说下背景:正在开发一个转码软件,实时接收编码器输出的TS流(H264+AAC),然后对H264和AAC再进行一次转码,转码后输出的视频流格式还是H264,音频流格式还是AAC,只是分辨率、码率、采样率会有变化。最后将转码后的音视频一份保存成MP4文件,另一份用RTMP实时推送给流媒体服务器进行直播。

现在遇到的问题是发现推送出去的RTMP流音视频严重不同步,图像卡顿严重,不正常播放,声音也没法听。我做了一个实验,我自己将转码后的H264压缩数据单独保存成文件是可以正常播放的,将AAC单独保存成文件也可以正常播放。保存MP4的功能还没有做。

我将RTMP推送出去的数据保存成了FLV,用工具软件分析了一下,发现很多视频tag、音频tag都是连续的,有时连续超过10多帧。按说音视频tag应该是交错式的。我觉得自己编码后的视频帧和音频帧时间戳生成机制有问题,导致的音视频不同步,播放异常。

H264编码使用的是X264,AAC编码使用的是FAAC。我现在设定的音视频编码前和编码后的时间戳相同,都设置为该帧TS中音视频解码后的那个值。我想请教一下,在编码前和编码后,时间戳该怎么生成,怎么才能做到播放时同步呢?请教了。
...全文
15079 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
F_Reading 2018-06-17
  • 打赏
  • 举报
回复
你好,你的推流延时多少
xiaogang2567 2017-04-14
  • 打赏
  • 举报
回复
楼主,你好,最近也在做rtmp推流直播,但是不太会,能参考下您的代码吗?不胜感激,我邮箱:xiaogang2567@163.com
小羽1 2017-03-19
  • 打赏
  • 举报
回复
楼主,您是怎么实时的将转码后的视频直接推出去的?
靑笺画卿颜 2016-08-02
  • 打赏
  • 举报
回复
楼主你好我最近在做 模拟拉流时,分别把音视频流写入本地文件,能留个联系方式么 QQ? 不尽感谢
qingfeng_happy7 2016-05-30
  • 打赏
  • 举报
回复
对于RTMP推流,我现在编码后的音视频帧的时间戳生成机制如下: 视频:__int64 nTimeStamp = (m_nVideoTimeStamp++)*1000/m_nFrameRate; 音频:__int64 nTimeStamp = (m_nAudioTimeStamp++) * 1024*1000 / m_nSamplerate; 其中m_nFrameRate=25,m_nSamplerate=48000. m_nVideoTimeStamp和m_nAudioTimeStamp初始值都为0. 在RTMP推流时使用的是LibRtmp库,具体使用方法就是比较音视频帧的时间戳大小,哪个小先发送哪个。 运行时发现推出去的流播放时音视频有些轻微不同步,大约差了1秒左右。该怎么解决呢?
twtldn 2016-05-30
  • 打赏
  • 举报
回复
MP4跟FLV的timebase是不一样的,MP4的stream的timebase是个很大的数,可变,而且音频跟视频的timebase是不一样的。flv的音频和视频timebaes都是1000。你在保存mp4和推送rtmp之前分别计算一下时间戳就行了。
qingfeng_happy7 2016-05-30
  • 打赏
  • 举报
回复
哪位大侠给指点一下啊。
twtldn 2016-05-30
  • 打赏
  • 举报
回复
引用 5 楼 qingfeng_happy7 的回复:
[quote=引用 4 楼 twtldn 的回复:] [quote=引用 3 楼 qingfeng_happy7 的回复:] 对于RTMP推流,我现在编码后的音视频帧的时间戳生成机制如下: 视频:__int64 nTimeStamp = (m_nVideoTimeStamp++)*1000/m_nFrameRate; 音频:__int64 nTimeStamp = (m_nAudioTimeStamp++) * 1024*1000 / m_nSamplerate; 其中m_nFrameRate=25,m_nSamplerate=48000. m_nVideoTimeStamp和m_nAudioTimeStamp初始值都为0. 在RTMP推流时使用的是LibRtmp库,具体使用方法就是比较音视频帧的时间戳大小,哪个小先发送哪个。 运行时发现推出去的流播放时音视频有些轻微不同步,大约差了1秒左右。该怎么解决呢?
因为音频和视频编码器缓冲的帧数不一样,音频编码比视频编码快,你这样直接赋值肯定会不同步。编码器编码的时候会自动计算PTS的,只要编码之后自己转到对应的timebase上就可以了。[/quote] 谢谢您的热心回复。您的意思是说对于编码操作,只需要给编码前的帧设置好PTS和DTS,编码完成后使用av_rescale_q_rnd函数对编码后帧的PTS做转换,即可得到想要的PTS值?[/quote] 是的。可以参考一下这里的回复http://bbs.csdn.net/topics/391942974
qingfeng_happy7 2016-05-30
  • 打赏
  • 举报
回复
引用 4 楼 twtldn 的回复:
[quote=引用 3 楼 qingfeng_happy7 的回复:] 对于RTMP推流,我现在编码后的音视频帧的时间戳生成机制如下: 视频:__int64 nTimeStamp = (m_nVideoTimeStamp++)*1000/m_nFrameRate; 音频:__int64 nTimeStamp = (m_nAudioTimeStamp++) * 1024*1000 / m_nSamplerate; 其中m_nFrameRate=25,m_nSamplerate=48000. m_nVideoTimeStamp和m_nAudioTimeStamp初始值都为0. 在RTMP推流时使用的是LibRtmp库,具体使用方法就是比较音视频帧的时间戳大小,哪个小先发送哪个。 运行时发现推出去的流播放时音视频有些轻微不同步,大约差了1秒左右。该怎么解决呢?
因为音频和视频编码器缓冲的帧数不一样,音频编码比视频编码快,你这样直接赋值肯定会不同步。编码器编码的时候会自动计算PTS的,只要编码之后自己转到对应的timebase上就可以了。[/quote] 谢谢您的热心回复。您的意思是说对于编码操作,只需要给编码前的帧设置好PTS和DTS,编码完成后使用av_rescale_q_rnd函数对编码后帧的PTS做转换,即可得到想要的PTS值?
twtldn 2016-05-30
  • 打赏
  • 举报
回复
引用 3 楼 qingfeng_happy7 的回复:
对于RTMP推流,我现在编码后的音视频帧的时间戳生成机制如下: 视频:__int64 nTimeStamp = (m_nVideoTimeStamp++)*1000/m_nFrameRate; 音频:__int64 nTimeStamp = (m_nAudioTimeStamp++) * 1024*1000 / m_nSamplerate; 其中m_nFrameRate=25,m_nSamplerate=48000. m_nVideoTimeStamp和m_nAudioTimeStamp初始值都为0. 在RTMP推流时使用的是LibRtmp库,具体使用方法就是比较音视频帧的时间戳大小,哪个小先发送哪个。 运行时发现推出去的流播放时音视频有些轻微不同步,大约差了1秒左右。该怎么解决呢?
因为音频和视频编码器缓冲的帧数不一样,音频编码比视频编码快,你这样直接赋值肯定会不同步。编码器编码的时候会自动计算PTS的,只要编码之后自己转到对应的timebase上就可以了。

2,543

社区成员

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

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