Resample and depayload audio rtp using gstreamer

2019-07-22 15:16发布

I am developing an application where I am using a wave file from a location at one end of a pipeline and udpsink at the other end of it.

gst-launch-1.0 filesrc location=/path/to/wave/file/Tornado.wav ! wavparse ! audioconvert ! audio/x-raw,channels=1,depth=16,width=16,rate=44100 ! rtpL16pay  ! udpsink host=xxx.xxx.xxx.xxx port=5000

The Above wave file is having sampling rate = 44100 Hz and single-channel(mono)

On the same PC I am using a c++ program application to catch these packets and depayload to a headerless audio file (say Tornado.raw)

The pipeline I am creating for this is basically

gst-launch-1.0 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 ! filesink location=Tornado.raw

Now This works fine. I get the headerless data and when I play it using the Audacity It plays great!

I am trying to resample this audio file while it is in pipeline from 44100 Hz to 8000 Hz

Simply changing the clock-rate=(int)44100 to clock-rate=(int)8000 is not helping (also absurd logically) I am looking for how to get the headerless file at the pipeline output with 8000 Hz sampling.

Also the data that I am getting now is Big-endian, but I want Little-endian as output. how do I set that in the pipeline?

You might relate this to one of my earlier question.

1条回答
不美不萌又怎样
2楼-- · 2019-07-22 15:23

First, you have some weird caps in your pipeline - width and height are for video here. They probably will be just ignored.. but still.. not sure on others there as well but meh..

For the actual question. Just use audioresample and audioconvert elements of Gstreamer to transfer in your desired format.

E.g.

[..] ! rtpL16depay ! audioresample ! audioconvert ! \
audio/x-raw, rate=8000, format=S16LE ! filesink location=Tornado.raw
查看更多
登录 后发表回答