在使用ffmpeg封裝過程中發現,封裝成mp4文件音視頻是同步的,但是封裝成mpegts文件則有問題,視頻播放正常,但音頻播放異常,且不同步。所以猜測是封裝層的時間基準單位(timebase)在搞鬼。
在此,並沒有去深入的分析ffmepg中的源代碼,而是簡單的修改了一下ffmpeg中的av_dump_format函數,使之把音頻的tbn(即封裝層的timebase)也打印出來,分析瞭如下容器:mpegts, mp4, mov和flv共4中,結果如下:
test.ts
----------------------------------------------------------
Input #0, mpegts, from '/home/b1shen/Videos/test.ts': Duration: 00:01:00.02, start: 1.400000, bitrate: 763 kb/s
Program 1 Metadata: service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 640x480 [SAR 4:3 DAR 16:9] , 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 128 kb/s, 90k tbn
分析結果:
video: tbn:90k
audio: tbn:90k
所以video與audio的封裝層的timebase是一致的,均爲90k
test.mp4
----------------------------------------------------------
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/b1shen/Videos/test.mp4': Duration: 00:01:00.02, start: 0.000000, bitrate: 680 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 4:3 DAR 16:9], 557 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 115 kb/s, 44100 tbn, 44100 tbc ( default)
Metadata: handler_name : SoundHandler
分析結果:
video: tbn:12800
audio: tbn:44100
從結果來看,音頻及視頻的封裝層timebase不一致,視頻爲128000,音頻爲44100(與採樣率一致)
test.mov
----------------------------------------------------------
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/b1shen/Videos/test.mov': Metadata: major_brand : qt
minor_version : 512
compatible_brands: qt
encoder : Lavf56.40.101 Duration: 00:01:00.02, start: 0.000000, bitrate: 680 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 4:3 DAR 16:9], 557 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata: handler_name : DataHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 115 kb/s, 44100 tbn, 44100 tbc ( default)
Metadata: handler_name : DataHandler
分析結果: 與mp4格式的結果一致
test.flv
----------------------------------------------------------
Input #0, flv, from '/home/b1shen/Videos/test.flv': Metadata: major_brand : isom
minor_version : 1
compatible_brands: isomavc1
encoder : Lavf56.40.101 Duration: 00:01:00.02, start: 0.000000, bitrate: 686 kb/s
Stream #0:0: Video: h264 (High), yuv420p(progressive), 640x480 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 1k tbn, 44100 tbc
分析結果:
video: tbn: 1k
audio: tbn: 1k
audio與video的封裝層的timebase一致,均爲1k