记一次录制mp4音视频不同步问题的排查过程

记一次录制mp4音视频不同步问题的排查过程

现象:录制系统中收录rtmp流,并用mp4v2写mp4文件。视频采用的是rtmp包里的时间戳,但是音频若使用rtmp包里时间戳则同步,而采用自行计算的时间戳则不同步。

  • 录制系统主要收录实时RTC的音视频数据,在这种情况下,音频时间戳采用自行计算的值。后
    面加入rtmp流的收录,没有调整音频时间戳的逻辑。
  • 所谓自行计算是:若音频采样率为44100Hz,编码为aac,因为一帧aac包含1024个采样,则一帧aac音频的时长为 1024 ∗ 1000 / 44100 ≈ 23 m s 1024*1000/44100 \approx 23ms 10241000/4410023ms。(当然,我们要处理余数的情况,累加到之后音频帧时间戳的计算)

现在有对应的两个mp4文件,分别对应tb.mp4(采用rtmp时间戳,同步)、btb.mp4(采用自行计算时间戳,不同步)。

分析视频文件是否同步的一般步骤:(以tb.mp4为例进行分析)

  • 使用工具将视频文件中每一个音频/视频帧的时间戳打印出来
    这里使用flvpusher这个工具 https://github.com/dengxiayehu/flvpusher.git,里面包含解析flv、mp4文件的模块,简单修改下代码,可将每一帧音视频时间戳打印至日志文件。格式如下:

^[[37;0m2019-01-02-15:50:00.958 123132 [rtmp_sink.cpp:96] [INFO] Connect to rtmp server with url “rtmp://127.0.0.1/live/va” ok^[[0m
^[[33;1m2019-01-02-15:50:00.966 123132 [mp4_parser.cpp:104] [WARN] AudioSpecificConfig in |esds| is different from |mp4a|^[[0m
^[[37;0m2019-01-02-15:50:00.966 123132 [mp4_pusher1.cpp:60] [INFO] Pushing file “/root/Videos/rec.mp4” …^[[0m
^[[37;0m2019-01-02-15:50:00.967 123132 [rtmp_sink.cpp:126] [DEBUG] @@@@@@@@@@@@@@@VIDEO TS=0, GAP=0, size = 84626^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:126] [DEBUG] @@@@@@@@@@@@@@@VIDEO TS=0, GAP=0, size = 2769^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:293] [DEBUG] AUDIO TS=0, GAP=0^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:293] [DEBUG] AUDIO TS=0, GAP=0^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:293] [DEBUG] AUDIO TS=29, GAP=0^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:126] [DEBUG] @@@@@@@@@@@@@@@VIDEO TS=40, GAP=0, size = 4317^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:293] [DEBUG] AUDIO TS=69, GAP=40^[[0m
^[[37;0m2019-01-02-15:50:00.968 123132 [rtmp_sink.cpp:126] [DEBUG] @@@@@@@@@@@@@@@VIDEO TS=80, GAP=40, size = 4887^[[0m

  • 分析前后两帧音频的时间戳是否异常
grep 'AUDIO TS=' flvpusher_log_123132.txt | cut -d= -f3 | sort -n | uniq
输出:
0
5
6
... 此处省略
30
... 此处省略
440
450
550
580
860
发现有音频帧间隔过大的情况
  • 分析前后两帧视频的时间戳是否异常
grep 'VIDEO TS=' flvpusher_log_123132.txt | cut -d= -f3 | cut -d, -f 1 | sort -n | uniq
输出:
0
... 此处省略
40
... 此处省略
320
400
560
发现有视频帧间隔过大的情况
  • 分析整体的音频/视频时间戳是否偏移过大
    音频起始时间戳:0
    音频终止时间戳:2869939
    视频起始时间戳:0
    视频终止时间戳:2869828
    发现整体的偏移情况还好(2869939-2869828=111ms)
    而不同步的视频文件偏移则过大:(2869828-2865152=4676ms)
    音频起始时间戳:0
    音频终止时间戳:2865152
    视频起始时间戳:0
    视频终止时间戳:2869828


我们继续对比tb.mp4和btb.mp4文件里面的音频流:
使用ffmpeg命令将两者的音频流解码为pcm并dump到文件,发现时长完全一致。


对此,这个问题的结论如下:
因为输入流rtmp本身存在音频少的情况,但宏观上出来的音视频流还是同步的(rtmp时间戳基本同步)。若是自行计算音频时间戳,则音频会被缩短至媒体文件的头部,导致越来越出现不同步,直至最后出现只有画面没有声音的情况。

你可能感兴趣的:(音视频问题排查)