H.264实时流传输,NAL单元中的时间戳?

5
我正在尝试构建一个系统,可以通过安卓手机实时传输视频和音频。使用MediaRecorder在安卓端捕获视频和音频,然后直接将其推送到用Python编写的服务器上。客户端应该使用浏览器访问此实时视频流,因此我使用Flash实现了系统的流媒体部分。目前,客户端上同时出现了视频和音频内容,但问题是它们不同步。我确定这是由于Flash中错误的时间戳值引起的(目前,我为每帧视频增加60毫秒的时间戳,但显然这个值应该是可变的)。
音频在安卓手机上被编码成AMR格式,因此我知道每个AMR帧的持续时间为20毫秒。然而,视频不是这种情况,它被编码为H.264格式。为了使它们同步,我需要知道每个H.264帧持续的确切毫秒数,以便在使用Flash传递内容时稍后为它们打上时间戳。我的问题是:这种信息是否在H.264的NAL单元中可用?我试图在H.264标准中找到答案,但那里的信息令人不知所措。
请问有人能指点我正确的方向吗?谢谢。

嗨 Richard,我也在苦苦挣扎。你解决了这个问题吗? - Paul Kapustin
1个回答

2
时间戳不在NAL单元中,但通常是RTP的一部分。 RTP / RTCP 还负责媒体同步。 H.264的RTP有效载荷格式 也可能对您有用。
如果您没有使用RTP,那么您是否只是通过网络发送原始数据单元?

谢谢回复!是的,我正在通过网络发送原始NAL单元。我发现每帧视频的持续时间约为60毫秒,因此每次发送一帧时,我会在Flash中递增时间戳60毫秒。(似乎一个NAL单元对应于一帧图像)。我一定会查看RTP,但我想知道如何确切地处理同步? - richard
我认为也许在你的情况下,视频的演示时间并不是完全相隔60毫秒。我没有在Android上工作过:你的捕获设备(MediaRecorder)是否提供了时间戳? - Ralf
你说得对,演示时间并不是精确的60毫秒间隔。这不是固定值,而是在59到60之间变化。在实时流媒体过程中,没有关于时间戳的信息可用。RTP能否在没有此类信息的情况下完成同步? - richard
好的,我猜我真的很倒霉...还有其他的NAL单元信息可以使用吗?比如一个帧在屏幕上停留的时间以及被下一帧替换之前的时间。此外,原始的H.264视频能否播放? - richard
据我所知,没有这样的功能。您考虑使用捕获帧的时间吗?另外,您遇到了什么样的同步问题:是恒定偏移还是随着播放时间越来越严重? - Ralf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接