如何通过互联网传输半实况音频

时间:2008-12-23 21:33:51

标签: macos audio audio-streaming

我想写一些类似Skype的东西,即我在一台计算机上有一个恒定的音频流,然后以适合潜在互联网连接的格式重新压缩,在另一端收到它,发挥它。

让我们假设互联网连接相当现代和快速,即DSL或类似的,没有通过电话等的缓慢连接。涉及的计算机也将非常现代(2GHz或更高的双核Intel CPU)。

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

挑战是:

  1. 我想在整个系列中获得良好的音质。

  2. 应该在没有丢弃的情况下接收流。然而,可以稍微延迟地接收流(可接受第二延迟)。我想传输软件可以首先确定平均(和最大)延迟,然后启动流并告诉接收器在开始播放音频之前等待最大延迟。有了这个,如果延迟没有变得更高,整个流将可以在另一边播放而不会出现口吃或掉落。

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

  4. 如果我想使用现成的软件进行压缩和传输,我有哪些选择?我真的无意写自己的音频压缩引擎。 OTOH,我打算在垂直市场上销售这个解决方案,这意味着每份可以支付几美元的许可费,但不是100美元。

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

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

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

要通过互联网传输音频,您应该考虑使用RTP。它用于SIP,H.323,还有许多其他人用它来传输音频内容。您甚至可能只想使用SIP lirbary。它已经拥有了你想要的大部分内容。如果你有一个好的编解码器和足够的带宽,SIP可以有很好的质量。

答案 2 :(得分:1)

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

使用PING到主机无法确定TCP的延迟。 TCP的问题在于,当您连接并且接受以某种延迟生活时,连接的任何问题都会缩小TCP窗口,所有收到的数据都将被丢弃,底层协议将不得不处理它。此时,您将失去实时的1秒优势,并且流将被丢弃。

TCP适用于可接受大延迟(例如10秒或更长)的情况,这样您就可以在重新建立连接之前始终拥有足够的数据来播放和播放。

如果我在你的鞋子里,我会尝试以下方法:

  • UDP for transport
  • 一些低延迟编码 - 例如AAC-LD,但mp3也可以
  • 在UDP上设置了一些数学开销,因此如果一个数据包丢失,音频流就可以恢复。
BTW,mp3的帧长40毫秒。使用一些“魔法”你可以掩盖几个丢帧。

答案 3 :(得分:1)

ShoutCAST + SAM Broadcaster或Winamp。会轻易做到这一点。

答案 4 :(得分:1)

如果您想使用icecast2开始自己的网络电台 你可以:

  • 在您的VPS上安装icecast
    #sudo apt-get install icecast
  • 也在您的VPS上安装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

config.xml中

#!/usr/bin/env zsh

MANIFEST=${0:h}/../../platforms/android/AndroidManifest.xml
[[ -e $MANIFEST ]] || { print "Manifest not found at $MANIFEST." ; exit 1; }

grep -q HANDLE_MOOZVINE_NOTIFICATION $MANIFEST && { print "Manifest already modified. Nothing to do."; exit 0; }

AFTER_LINE='android:name="MainActivity"'
ADDITION='\
        <intent-filter>\
            <action android:name="HANDLE_MOOZVINE_NOTIFICATION" />\
            <category android:name="android.intent.category.DEFAULT" />\
        </intent-filter>
';

sed -i -e "/${AFTER_LINE}/a${ADDITION}" $MANIFEST

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