2008-12-23 32 views
2

我想写一些像Skype,即我有一台计算机上的一个不断的音频流,然后重新压缩它在一个适合于一个潜在的互联网连接的格式,接收它另一端并播放它。我们还假设互联网连接是相当现代和快速的,即DSL或类似的,通过电话等的连接速度不慢。涉及的计算机也将是相当现代的(2GHz或更高频率的双核英特尔CPU)。如何通过互联网流半音视频

我知道如何处理机器上的音频。我不知道的是如何以有效的方式传输音频。

的挑战是:

  1. 我想获得跨线良好的音频质量。

  2. 流应该被接收而没有丢弃。然而,该流可能会稍微延迟接收(第二个延迟是可以接受的)。我想运输软件可以首先确定平均(和最大)延迟,然后启动流并告诉接收器在开始播放音频之前等待最大延迟。因此,如果等待时间没有变得更高,那么整个数据流将在另一侧播放而不会出现口吃或掉落。

  3. 如果由于意外IP延迟或堵塞,流得到切断,我希望能够注意到这一点,这样我可以采取行动(如中止流),并最终启动一个新的传输。

如果我想要使用现成的软件进行压缩和传输,我的选择是什么?我真的无意编写我自己的音频压缩引擎。 OTOH,我打算在一个垂直市场上出售这个解决方案,这意味着我可以承受每个拷贝几美元的许可费,但不是100美元。

我想最简单的解决方案是打开一个TCP流,来回发送几个包来确定它们的运行时间(或者甚至使用UDP),然后使用结果作为我的最大延迟值,然后简单地以原始形式(未压缩的16位立体声)播放音频数据,以及通过TCP连接的时间码。接收器读取数据并以预定延迟播放。这可能只适用于我期望的快速连接类型。

我只是想知道是否有更好的解决方案来达到这个目标,具有更好的性能(更低的延迟)和更少的数据(压缩)。

顺便说一句,我首先尝试在OS X上实现这一点,但如果它证明是成功的,也可能希望在Windows上实现。

回答

1

对于通过互联网传输音频,你应该看看使用RTP。它用于SIP,H.323,以及许多其他用于流式传输音频内容的软件。你甚至可能只想使用SIP lirbary。它已经有很多听起来像你想要的。如果你有一个好的编解码器和足够的带宽,SIP可以有很好的质量。

+0

谢谢,这应该让我开始更多地了解我的选择 – 2008-12-23 23:25:58

1

VLC支持各种类型的音频和视频转码。可能是你想要的check out

+0

流媒体arcticle看起来很有趣,谢谢。 – 2008-12-23 23:27:41

1

我知道,线程是一种-一个老人,但是,一个见解,我想与大家分享的是这样的:你不能这样使用TCP那你试图做的是因为你需要的延迟 - 你说1秒是可以接受的,并且我认为1秒以上不是。

您的TCP等待时间不是用PING来确定的。 TCP的问题在于,当您连接并且您接受某些延迟时,任何连接问题都会缩小TCP窗口,所有接收到的数据将被丢弃,底层协议将不得不处理它。此时,你将失去1秒的实时优势,并且该流将被丢弃。

TCP适用于可以接受大延迟(比如10秒或更长时间)的情况,这将允许您在连接重新建立之前始终拥有足够的数据进行吃饭和播放。

如果我是你的鞋子,我会尝试以下方法:用于运输

    • UDP一些低延迟编码 - AAC-LD的例子,但MP3也将是OK
    • 在UDP上有一些数学开销设置,所以如果一个数据包丢失,音频流可以恢复。

    顺便说一句,在mp3的帧是40毫秒长。有了一些“魔力”,你可以掩盖掉几个丢失的帧。

  • 1

    ShoutCAST + SAM广播或Winamp。将很容易地做到这一点。

    1

    如果你正在寻找使用icecast2 就可以开始自己的互联网电台:

    • 你的VPS还你VPS安装的Icecast
     
        #sudo apt-get install icecast 
    
    • 安装ezstream
     
        #sudo apt-get install ezstream 
    
    • 创建播放列表文件,文件

    playlist.m3u(你可以阅读更多形式wikipedia

     
        #EXTM3U 
    
        #EXTINF:123, Sample artist - Sample title 
        Sample.mp3 
    
        #EXTINF:321,Example Artist - Example title 
        Example.ogg 
    
    • 创建ezstream配置文件的XML

    配置。XML

    <ezstream> 
        <url>http://localhost:8000/stream</url> 
        <!-- 
         If a different user name than "source" should be used, set it in 
         <sourceuser/>: 
        --> 
        <!-- <sourceuser>mr_stream</sourceuser> --> 
        <sourcepassword>hackme</sourcepassword> 
        <format>MP3</format> 
        <filename>playlist.m3u</filename> 
        <stream_once>1</stream_once> 
        <svrinfoname>My Stream</svrinfoname> 
        <svrinfourl>http://www.oddsock.org</svrinfourl> 
        <svrinfogenre>RockNRoll</svrinfogenre> 
        <svrinfodescription>This is a stream description</svrinfodescription> 
        <svrinfobitrate>128</svrinfobitrate> 
        <svrinfochannels>2</svrinfochannels> 
        <svrinfosamplerate>44100</svrinfosamplerate> 
        <svrinfopublic>0</svrinfopublic> 
    </ezstream> 
    

    或者你可以试试这个:nodejs application