背景
在做國標級聯,模塊輸入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的問題.
