gstreamer选择一个频道并转换为mono(deinterleave)

时间:2013-05-09 22:34:35

标签: c++ audio-streaming gstreamer

我正在从音频服务器创建音频流并将其流式传输到接收器,我希望接收器选择一个频道并将其转换为单声道。

下面的代码是我的接收器的管道。它正在接收rtp流。

gst-launch-0.10 -v \
udpsrc multicast-group=224.0.0.7 port=5000 \
! "application/x-rtp,media=audio, clock-rate=44100, width=16, height=16, encoding-name=L16, encoding-params=2, payload=96" \
! gstrtpjitterbuffer latency=200 ! rtpL16depay ! audioconvert ! deinterleave name=d    interleave name=i ! alsasink \
d.src_0 ! queue ! audioconvert !"audio/x-raw-int,channels=1"! i.sink1 \
d.src_0 ! queue ! audioconvert !"audio/x-raw-int,channels=1"! i.sink0 

它会一直监听,但是当流通过时,它会抛出一个错误。

ERROR: from element /GstPipeline:pipeline0/GstUDPSrc:udpsrc0: Internal data flow error.

1 个答案:

答案 0 :(得分:0)

您无法连接d.src_0两次。

相反,您可以放弃交错部分,只专注于播放单声道流(我希望我可以用udpsrc替换您的uribin,但管道更容易阅读):

gst-launch-0.10 -v uridecodebin uri=file://file.ogg ! audioconvert ! \
  deinterleave name=d  d.src0 ! queue ! audioconvert ! alsasink

这将像您的管道一样,对立体声流进行解交织,然后只取左声道(d.src0,另一个使用d.src1),它提供单声道流并将其提供给alsasink。

ALSA不介意您是否向其提供单声道或立体声数据,但如果您明确需要立体声流/文件,该怎么办?只需添加audiopanorama即可。它需要一个音频流并将其置于左右扬声器之间(panorama参数默认为0,这是中心)并产生一个立体声流:

gst-launch-0.10 -v uridecodebin uri=file://file.mp3 ! audioconvert ! \
  deinterleave name=d d.src0 ! queue ! audioconvert ! audiopanorama ! alsasink

但正如我所说,ALSA(以及大多数其他声音服务器,如pulse,osd,......)并不关心你是否将单声道或立体声输入其中,它会在两个声道上播放。