2

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

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

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

挑战是:

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

  2. 应无丢包地接收流。然而,接收流可能会有一点延迟(第二个延迟是可以接受的)。我想传输软件可以首先确定平均(和最大)延迟,然后启动流并告诉接收器在开始播放音频之前等待最大延迟。这样,如果延迟没有变得更高,整个流将可以在另一侧播放而不会出现卡顿或掉线。

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

如果我想使用现成的软件进行压缩和传输,我有什么选择?我真的没有打算编写自己的音频压缩引擎。OTOH,我计划在垂直市场上销售该解决方案,这意味着我可以负担每份几美元的许可费,但不是 100 美元。

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

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

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

4

5 回答 5

1

VLC支持各种类型的音视频转码。可能是您想要查看的内容。

于 2008-12-23T21:42:03.890 回答
1

要通过 Internet 传输音频,您可能应该考虑使用 RTP。它用于 SIP、H.323 和许多其他将其用于流式传输音频内容。您甚至可能只想看看使用 SIP 库。它已经拥有你想要的很多东西。 如果你有一个好的编解码器和足够的带宽,SIP可以有相当好的质量。

于 2008-12-23T22:46:49.217 回答
1

我知道线程有点老了,但是,我想与您分享的一个见解是:由于您需要延迟,您不能为此使用 TCP 来尝试执行此操作-您说 1 秒是可以接受,因此我认为超过 1 秒不是。

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

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

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

  • UDP传输
  • 一些低延迟编码 - 例如 AAC-LD,但 mp3 也可以
  • 在 UDP 上设置了一些数学开销,因此如果丢失一个数据包,音频流可以恢复。

顺便说一句,mp3 的帧长 40 毫秒。使用一些“魔法”,您可以掩盖一些丢帧。

于 2011-07-18T09:12:20.423 回答
1

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

于 2011-08-18T14:40:14.087 回答
1

如果您希望使用 icecast2 创建自己的网络广播电台,您可以:

  • 在你的 VPS 上安装 icecast
    #sudo apt-get install icecast
  • 在你的 VPS 上安装 ezstream
    #sudo apt-get install ezstream
  • 使用您的文件创建播放列表文件

playlist.m3u(您可以阅读更多形式的维基百科

    #EXTM3U

    #EXTINF:123,示例艺术家 - 示例标题
    示例.mp3

    #EXTINF:321,示例艺术家 - 示例标题
    例子.ogg
  • 创建 ezstream 配置文件 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

于 2016-02-24T08:58:17.687 回答