我有一堆RTP数据包,我想重新组装成一个音频流。对于每个数据包,我有序列号,SSRC,时间戳和表示数据本身的字节数组。
目前我正在通过其SSRC获取每个数据包子集,然后按时间戳对它们进行排序,并按顺序组合字节数组。之后,我正在混合字节数组。产生的音频数据听起来很棒(很棒,我的意思是一切都在及时),但我担心这是由于没有太多的数据包丢失。
所以,有几个问题......
对于丢失的数据包,丢失的序列号显示我需要添加一些空音频的位置。我相信序列号经常“包裹”,所以我需要使用时间戳将它们分解为子集。然后我可以在这些子集中查找缺失的序列号并根据需要添加。这听起来像是正确的事吗?
我还没弄清楚时间戳还有什么好处。由于我正在录制现有的数据包并填写丢失的数据包,我可能不需要担心这个问题吗?
答案 0 :(得分:1)
1)我不认为序列号很快“环绕”。这是16位值,因此它包装每个65536个消息,即使消息每10毫秒发送一次,也会传输超过10分钟。数据包丢失的可能性不大。所以在我看来你应该只检查序列号,检查时间戳是没有意义的。
2)我认为你不应该担心时间戳。我知道有些协议甚至没有填写这个值,只在序列号上进行中继。
答案 1 :(得分:1)
1)避免在算法中使用时间戳。如果您从坏客户端接收流(错误的时间戳),您的算法将失败。并且“timestamps increment”值随编解码器类型而变化。在这种情况下,您可能需要不同的编解码器的不同子集。序列号没有限制。序列号单调递增。使用序列号,您可以轻松跟踪丢失的数据包。
2)时间戳用于音频和视频之间的同步。主要用于唇形同步。建立音频和视频时间戳之间的关系以实现同步。在您的情况下,它是唯一的音频,因此您可以避免使用时间戳。
编辑:根据RFC 3389(舒适噪声的实时传输协议(RTP)有效负载(CN))
RTP允许任何不连续传输(静音抑制) 音频有效载荷格式接收器可以检测静音抑制 通过观察沉默后收到的第一个数据包 RTP时间戳与间隔结束不连续 即使是RTP序列号,也包含在前一个数据包中 仅增加了一个。 RTP标记位也正常 设置在这样的数据包上。
答案 2 :(得分:0)
我认为Zulijn在上面的回答中得到的结论是,如果您的数据包按照它们被捕获的顺序存储,那么您可以使用一些简单的规则来查找无序数据包 - 例如回顾50个数据包并转发50个数据包。如果它不存在那么它将被视为丢失的数据包。
这应该避免序列号缠绕的任何问题。要处理任何丢失的数据包,您可以使用许多技术,因此谷歌“音频数据包丢失”或“VOIP数据包丢失隐藏”非常有用。正如亚当所提到的,时间戳会因编解码器而异,所以如果要使用它,你需要了解它。
你没有提到实际的应用程序是什么,但是如果你试图理解接收到的音频听起来是什么样的,你真的需要更多信息,特别是抖动缓冲区大小 - 这有效地决定了接收器的长度在判断丢失之前等待一个无序数据包。这对您来说意味着您的文件中可能存在无序数据包,“真实世界”的接收器会放弃并且不会播放 - 即从文件重建可能会提供比'真实文件更高的质量时间'体验。
如果是双向传输,则延迟也非常重要(即使它是一个恒定的延迟,因此不会影响抖动和数据包丢失)。这是您在某些无线电话上使用的效果类型,但仍然可以在某些卫星电话(或VoIP电话)上使用,这会对用户体验产生重大影响。
最后,不同的编解码器和客户端可以应用不同的技术来纠正丢失的数据包,为音频中的任何间隙插入“静音”(例如,在会话中暂停),抑制背景噪声等。
为了正确感受用户体验,您必须尽可能准确地“重播”捕获的数据包,使用相同的编解码器,抖动缓冲区以及接收器使用的任何纠错/丢包技术。