我正在尝试通过 RTSP 发送 L16 格式的原始音频。我分别为服务器和客户端使用以下管道。我最终也计划将视频添加到这些管道中。
服务器:
./test-launch.out "filesrc location=L16.raw ! audioconvert ! audio/x-raw,format=S16BE,channels=2,rate=44100 ! rtpL16pay pt=96 name=pay0"
客户:
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/test latency=150 ! queue ! rtpL16depay ! autoaudiosink
当我尝试使用这些管道时遇到以下错误。
错误:来自元素 /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:未处理的错误
附加调试信息:
../gst/rtsp/gstrtspsrc.c(6795): gst_rtspsrc_send (): /GstPipeline:pipeline0/GstRTSPSrc:rtspsrc0:
服务不可用 (503)
错误:管道不想预卷。
将管道设置为 NULL ...
释放管道...
这里有一个非常奇怪的地方:如果我将服务器更改为使用audiotestsrc而不是filesrc,如下所示,一切正常。
服务器:
./test-launch.out "audiotestsrc ! audioconvert ! audio/x-raw,format=S16BE,channels=2,rate=44100 ! rtpL16pay pt=96 name=pay0"
客户:
不变
我最初认为这可能是由于我正在读取的文件以某种方式损坏,但我已经验证事实并非如此。为什么从文件读取会破坏一切?
我真的很感激任何帮助。我是 GStreamer 的新手,不知道如何开始解决这个问题。任何帮助将不胜感激!
感谢 Florian Zwoch 富有洞察力的评论,我似乎已经找到了答案。我在服务器和客户端上缺少一个
rawaudioparse
元素。我更新的管道如下:
服务器
./test-launch.out "filesrc location=L16.raw ! rawaudioparse use-sink-caps=false format=pcm pcm-format=s16be sample-rate=44100 num-channels=2 ! audioconvert ! rtpL16pay pt=96 name=pay0"
客户
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/test latency=150 ! queue ! rtpL16depay ! rawaudioparse use-sink-caps=false format=pcm pcm-format=s16be sample-rate=44100 num-channels=2 ! audioconvert ! audioresample ! autoaudiosink
说实话,我不确定为什么 filesrc 需要这个,而 audiotestsrc 不需要,但它有效,所以我将停止质疑它。