我正在从音频服务器创建音频流并将其流式传输到接收器,我希望接收器选择一个频道并将其转换为单声道。
下面的代码是我的接收器的管道。它正在接收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.
答案 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,......)并不关心你是否将单声道或立体声输入其中,它会在两个声道上播放。