我目前正在使用 RTP 流式传输音频(8kHz 的 AAC-HBR)和视频(H264)。两个提要单独工作都很好,但是当它们放在一起时,它们很快就会不同步(不到 15 秒)。
我不确定如何增加音频 RTP 标头上的时间戳,我认为它应该是两个 RTP 数据包之间的时间差(大约 127 毫秒)或 1/8000(0.125 毫秒)的恒定增量。但两者都不起作用,相反,我设法找到了一个甜蜜点。当我为每个数据包将时间戳增加 935 时,它会保持同步大约一分钟。
我目前正在使用 RTP 流式传输音频(8kHz 的 AAC-HBR)和视频(H264)。两个提要单独工作都很好,但是当它们放在一起时,它们很快就会不同步(不到 15 秒)。
我不确定如何增加音频 RTP 标头上的时间戳,我认为它应该是两个 RTP 数据包之间的时间差(大约 127 毫秒)或 1/8000(0.125 毫秒)的恒定增量。但两者都不起作用,相反,我设法找到了一个甜蜜点。当我为每个数据包将时间戳增加 935 时,它会保持同步大约一分钟。
AAC 帧大小为 1024 个样本。尝试增加 (1/8000) * 1024 = 128 毫秒。如果您的数据包有多个 AAC 帧,则为该倍数。
这有帮助吗?
恕我直言,Android 中的视频和音频不同步如果取自不同的媒体记录器,则很难与之抗争。他们只是捕获不同的起始帧,并且没有办法(看起来)找出不同步的大小并在飞行中使用音频或视频时间戳对其进行调整。
有点晚了,但想到提出我的答案。
音频 RTP 数据包的时间戳 == RTP 数据包中包含的音频样本数。
对于 AAC,每帧由 1024 个样本组成,因此 RTP 数据包上的时间戳应增加 1024。
2个RTP包的时钟时间差= (1/8000)*1024 = 128ms,即发送者发送的rtp包应该相差128ms。
来自其他采样率的更多信息:
现在以 44100hz 采样的 AAC 意味着 1 秒内有 44100 个信号样本。所以 1024 个样本意味着 (1000ms/44100)*1024 = 23.21995 ms 所以 2 个 RTP 数据包之间的时间戳 = 1024,但是 rtp 会话中 2 个 RTP 数据包之间的时钟时间差应该是 23.21995ms。
尝试与其他示例相关联:
例如对于 G711 系列(PCM、PCMU、PCMA),采样频率 = 8k。所以20ms的数据包应该有样本== 8000/50 == 160。因此RTP时间戳增加160。2个RTP数据包之间的时钟时间差应该是20ms。