我正在尝试创建一个直播音频和视频的RTSP客户端。我在链接http://www.gdcl.co.uk/downloads.htm修改了iOS代码,并能够正确地将视频广播到服务器。但现在我在广播音频部分方面遇到了问题。在链接示例中,代码的编写方式是将视频数据写入文件,然后从文件中读取数据并将NALU的视频数据包上传到RTSP服务器。
对于音频部分,我不知道如何继续。现在我所尝试的是从麦克风获取音频缓冲区,然后通过添加RTP标头和ALU直接将其广播到服务器..但这种方法不能正常工作,因为音频开始滞后,滞后随着时间的推移而增加。如果有更好的方法来实现这一目标并使用唇形音频/视频,有人可以告诉我。
答案 0 :(得分:4)
您是否丢失了客户端上的任何数据包?如果是这样,你需要离开"空间。"如果收到数据包1,2,3,4,6,7,则需要为丢失的数据包留出空间(5)。
另一种可能性是所谓的时钟漂移问题。客户端和服务器上的时钟(水晶)彼此不完全同步 这可能是由环境,温度变化等引起的。
让我们说在一个完美的世界中,您的服务器正在以48000赫兹生成音频样本20毫秒音频样本。您的客户正在使用48000赫兹的采样率播放它们。实际上,您的客户端和服务器并不完全是48000hz。您的服务器可能是48000.001,您的客户端可能是47999.9998。因此,您的服务器可能比您的客户端提供更快的速度,反之亦然。您要么过快地使用数据包,要么在运行缓冲区或滞后太远并且溢出客户端缓冲区。在你的情况下,听起来客户端播放速度太慢而且慢慢落后于服务器。你可能每分钟只会落后几毫秒,但这个问题会继续存在,看起来就像20世纪70年代的嘴唇同步功夫电影。
在其他设备中,通常会有一条公共时钟线来保持同步。例如,摄像机时钟,midi时钟。多轨录音机时钟。
通过IP传送数据时,客户端和服务器之间不共享通用时钟。因此,您的问题涉及在不同设备之间同步时钟。我已经使用这种通用方法成功地解决了这个问题:
因此,您的客户要求您调整播放的采样率。所以是的,你玩得更快或更慢。请注意,播放速率的变化将非常微妙。您可以将采样率设置为48000.0001 hz而不是48000 hz。音调的差异是人类无法察觉的,因为它只会导致音高差异百分之几。我解释了一种非常简化的方法。在开发这样的控制系统时,必须考虑许多其他细微差别和边缘情况。你不要只是设置并忘记它。您需要一个控制系统来管理播放。
一个有趣的测试来证明这一点是将两个设备与完全相同的文件。长录音(比如3小时)是最好的。同时启动它们。播放3小时后,您会注意到一个先于另一个。