3

我需要在两台 Linux 机器之间移动实时音频,它们都运行基于 Gstreamer 构建的自定义软件(我的)。(该软件已经通过单独的基于 TCP 的协议在机器之间进行了其他通信 - 我提到这一点是为了防止可靠的带外数据对解决方案产生影响)。

音频输入将是发送机器上的麦克风/线路输入,而正常音频输出将作为目的地上的接收器;alsasrc 和 alsasink 是最有可能的,尽管为了测试我一直在使用 audiotestsrc 而不是真正的麦克风。

GStreamer 提供了多种通过网络传输数据的方法——RTP、RTSP、GDP 负载、UDP 和 TCP 服务器、客户端和套接字等等。网络上也有很多流式传输音频和视频的例子——但实际上,它们似乎都不适合我;要么目标管道无法协商上限,要么我听到一个数据包然后管道停止,或者目标管道立即退出而没有可用数据。

在所有情况下,我都在命令行上进行测试,只是 gst-launch。无需压缩音频数据 - 原始音频或普通 WAV、uLaw 或 aLaw 编码都可以;更重要的是低延迟。

4

3 回答 3

5

要调试这种问题,我会尝试:

  1. 运行gst-launch audiotestsrc ! alsasink以检查声音是否有效
  2. 使用fakesinkorfilesink来查看是否有缓冲区
  3. 尝试使用 查找管道问题GST_DEBUG,例如检查上限GST_DEBUG=GST_CAPS:4或检查使用*:2以获取所有错误/警告
  4. 使用wireshark查看是否发送了数据包

这些管道对我有用:

使用 RTP:

gst-launch-0.10 -v udpsrc port=5000 ! "application/x-rtp,media=(string)audio, clock-rate=(int)44100, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96" ! rtpL16depay ! audioconvert ! alsasink sync=false

gst-launch-0.10 audiotestsrc ! audioconvert ! audio/x-raw-int,channels=1,depth=16,width=16,rate=44100 ! rtpL16pay  ! udpsink host=localhost port=5000

使用 TCP: :

gst-launch-0.10 tcpserversrc host=localhost port=3000 ! audio/x-raw-int, endianness="(int)1234", signed="(boolean)true", width="(int)16", depth="(int)16", rate="(int)44100", channels="(int)1" ! alsasink

gst-launch-0.10 audiotestsrc ! tcpclientsink host=localhost port=3000
于 2010-04-27T21:50:11.977 回答
1

我的解决方案与tilljoel 非常相似,但我使用麦克风(这是您需要的)作为源 - 因此在 gstreamer 管道中进行了一些调整。

使用 TCP 从麦克风解码音频:

gst-launch-0.10 tcpserversrc host=localhost port=3000 !  audio/x-raw-int, endianness="(int)1234", signed="(boolean)true", width="(int)16", depth="(int)16", rate="(int)22000", channels="(int)1" ! alsasink

使用 TCP 对来自麦克风的音频进行编码:

gst-launch-0.10 pulsesrc ! audio/x-raw-int,rate=22000,channels=1,width=16 ! tcpclientsink host=localhost port=3000

使用 RTP 从麦克风解码音频:

gst-launch-0.10 -v udpsrc port=5000 ! "application/x-rtp,media=(string)audio, clock-rate=(int)22000, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96" ! rtpL16depay ! audioconvert ! alsasink sync=false

使用 RTP 对来自麦克风的音频进行编码:

gst-launch-0.10 pulsesrc ! audioconvert ! audio/x-raw-int,channels=1,depth=16,width=16,rate=22000 ! rtpL16pay  ! udpsink host=localhost port=5000
于 2012-07-15T04:19:45.350 回答
0

您可以发布一些您尝试过的 gst-launch 管道吗?这可能有助于理解您遇到问题的原因。一般来说,RTP/RTSP 应该很容易工作。

编辑:我能想到的几个项目是 1. 将 host=localhost 更改为 host= 其他 linux 机器的实际 IP 地址在哪里 2. 将 caps="application/x-rtp, media=(string)audio 添加到接收器中的 udpsrc 元素。

于 2010-04-27T08:22:04.953 回答