记录音视频不同步的问题及解决过程

背景

在做国标级联,模块输入rtmp流,输出rtp+ps,视频H264, 音频转码aac →g711A.

现象

1、单视频流播放正常

2、单音频服务器保存输出G711A文件播放正常

3、音视频复合流播放音频拉慢了视频,大概1s视频播放了1.5-2s.同时音频也变慢了.

4、ffprobe 发现音频的pts+ pkt_duration 大于下一个音频packet pts.

尝试解决过程

1、改变封装格式,

rtp+ ps header + ps system header + ps map + pesv + rtp + ps header + pesa

-------------→

rtp + ps header + ps system header + ps map + pesv + pesa.

封装格式符合gb28181文档标准,但是对音视频同步没有效果.

2、aac转g711过程中,发现一个rtmp的aac音频msg,经过ffmpeg转码输出3-5个g711a音频packet, 再把这三个音频packet分别封装成pes, 三个pes使用同一个pts.pts是透传的rtmp msg的timestamp.格式为:

rtp + ps header + ps system header + ps map + pesv(with PTS V) + pesa1(with PTS A) + pesa2(with PTS A)  + pesa3(with PTS A) 

做了改动把三个相同pts的音频pes合并为同一个pes, 最后的格式为:

rtp + ps header + ps system header + ps map + pesv(with PTS V) + pesa(with PTS A) 

竟然音视频不同步的问题解决了!!!

分析

g711是固定的采样率、通道数和采样位数, 在封装rtp/ps的时候并没有对这些参数进行传递,仅仅对pts进行了设置.而pts又是透传rtmp的时间戳(ts * 90), 所以这个时间不会出错.所以想到了合并音频pes的问题.

原文地址:https://www.cnblogs.com/micoblog/p/15425560.html