C++ gstreamer选择一个通道并转换为单声道(解交织)
我正在从音频服务器创建一个音频流,并将其传输到接收器,我希望接收器选择一个频道并将其转换为单声道 下面的代码是我的接收器的管道。它正在接收rtp流C++ gstreamer选择一个通道并转换为单声道(解交织),c++,audio-streaming,gstreamer,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,
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.
您不能连接
d.src\u 0
两次
相反,您可以放弃交错部分,只专注于播放单声道流(我希望我可以用uribin
替换您的udpsrc
,但管道更易于阅读):
这将像您的管道一样,对立体声流进行逐行扫描,只取左侧通道(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等)不在乎你是在它里面输入单声道还是立体声,它会在两个频道上播放。你不能连接
d.src\u 0
两次
相反,您可以放弃交错部分,只专注于播放单声道流(我希望我可以用uribin
替换您的udpsrc
,但管道更易于阅读):
这将像您的管道一样,对立体声流进行逐行扫描,只取左侧通道(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等)不在乎你是在它里面输入单声道还是立体声,它会在两个频道上播放