Gstreamer框架中使用gst-launch进行流媒体播放

Gstreamer框架中使用gst-launch进行流媒体播放

Gstreamer是一套开源的流媒体框架,用其也可以进行流媒体开发,Gstreamer是基于glib库编写的,需要将多个不同功能的元件(element)装进一个箱柜(bin)中,在进行程序编写前,我们可以使用Gstreamer提供的一个小工具gst-launch在终端中在验证我们的想法,验证我们选择的元件和配置的管道是否正确,如果验证正确,编码对于各位小伙伴们就是小case啦!

不用废话了,直接进入我们的主题,一下列出了我以前学习使用Gstreamer进行流媒体开发过程中的一些实例,都是使用gst-launch实现的。

一、RDP协议实现mp3播放

1、服务端

gst-launch filesrc location=/mnt/hgfs/fedshare/source/audio/test.mp3 ! mad! audioconvert \

! audio/x-raw-int,channels=1,depth=16,width=16, rate=44100 !rtpL16pay ! udpsink host=127.0.0.1 port=5000

2、接收端

gst-launch 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" ! gstrtpjitterbufferdo-lost=true ! rtpL16depay ! audioconvert ! alsasink sync=false

二、摄像头远程监控

1、发送端

gst-launch -v gstrtpbin name=rtpbin v4l2src device=/dev/video0 ! videorate! videoscale ! ffmpegcolorspace ! 'video/x-raw-yuv, width=(int)320,height=(int)240, framerate=(fraction)15/1' ! \ rtpvrawpay !rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! multiudpsinkclients="127.0.0.1:9996" rtpbin.send_rtcp_src_0 ! multiudpsinkclients="127.0.0.1:9997" sync=false async=false udpsrc port=10000 !rtpbin.recv_rtcp_sink_0

2、接收端

gst-launch udpsrc caps=" application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW,sampling=(string)YCbCr-4:2:0, depth=(string)8, width=(string)320,height=(string)240, colorimetry=(string)SMPTE240M, ssrc=(guint)4294234526,payload=(int)96, clock-base=(guint)520513122, seqnum-base=(guint)28177"port=9996 ! queue ! rtpvrawdepay ! queue ! tee name="splitter"! queue ! ffmpegcolorspace ! autovideosink splitter. ! queue ! ffmpegcolorspace! jpegenc ! avimux ! filesink location=osug-udp-2.avi

三、音频流媒体传输(

1、发送端

gst-launch -v gstrtpbin name=rtpbin latency=100 \

uridecodebin uri=file:///mnt/hgfs/fedshare/source/audio/test.mp3name=decoder \

decoder. ! tee name=tee0 \

tee0. ! queue2 ! audioconvert ! ffenc_aac ! rtpmp4apay pt=96 ! queue2 !rtpbin.send_rtp_sink_1 rtpbin.send_rtp_src_1 ! queue2 ! udpsink host=127.0.0.1port=5002 async=false

2、接收端

gst-launch -v gstrtpbin name=rtpbin latency=100 \

udpsrccaps="application/x-rtp,media=(string)audio,clock-rate=(int)44100,encoding-name=(string)MP4A-LATM,cpresent=(string)0,config=(string)40002420,ssrc=(uint)4204015526,payload=(int)96,clock-base=(uint)4274968681,seqnum-base=(uint)44368"\

port=5002 ! queue2 ! rtpbin.recv_rtp_sink_1 rtpbin. ! rtpmp4adepay ! teename=teeaudio \

teeaudio. ! queue2 ! ffdec_aac ! audioconvert ! autoaudiosink

四、视频文件只传输音频流

1、发送端

gst-launch -v gstrtpbin name=rtpbin latency=100 \

uridecodebin uri=file:///mnt/hgfs/fedshare/source/video/loveStyle.mp4name=decoder \

decoder. ! tee name=tee0 \

tee0. ! queue2 ! ffmpegcolorspace ! x264enc ! rtph264pay pt=96 ! queue2 !rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! queue2 ! udpsink host=127.0.0.1port=5000 async=false \

rtpbin.send_rtcp_src_0 ! queue2 ! udpsink host=127.0.0.1 port=5001async=false \

udpsrc port=5005 ! queue2 ! rtpbin.recv_rtcp_sink_0

2、接收端

gst-launch -v gstrtpbin name=rtpbin latency=100 \

udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,ssrc=(uint)340005641,payload=(int)96,clock-base=(uint)2625017333,seqnum-base=(uint)5894"port=5000 \

! queue ! rtpbin.recv_rtp_sink_0 rtpbin. ! rtph264depay ! teename=teevideo \

teevideo. ! queue ! ffdec_h264 ! videoscale ! ffmpegcolorspace !xvimagesink \

udpsrc port=5001 ! queue ! rtpbin.recv_rtcp_sink_0 rtpbin.send_rtcp_src_0! queue ! udpsink host=127.0.0.1 port=5005 sync=true async=false

五、音视频混合流媒体

1、发送端

gst-launch -v gstrtpbin name=rtpbin latency=100 \

uridecodebin uri=file:///mnt/hgfs/fedshare/source/video/loveStyle.mp4name=decoder \

decoder. ! tee name=tee0 \

tee0. ! queue2 ! ffmpegcolorspace ! x264enc ! rtph264pay pt=96 ! queue2 !rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! queue2 ! udpsink host=127.0.0.1port=5000 async=false \

rtpbin.send_rtcp_src_0 ! queue2 ! udpsink host=127.0.0.1 port=5001async=false \

udpsrc port=5005 ! queue2 ! rtpbin.recv_rtcp_sink_0 \

decoder. ! tee name=tee1 \

tee1. ! queue2 ! audioconvert ! ffenc_aac ! rtpmp4apay pt=96 ! queue2 !rtpbin.send_rtp_sink_1 rtpbin.send_rtp_src_1 ! queue2 ! udpsink host=127.0.0.1port=5002 async=false \

rtpbin.send_rtcp_src_1 ! queue2 ! udpsink host=127.0.0.1 port=5003async=false \

udpsrc port=5006 ! queue2 ! rtpbin.recv_rtcp_sink_1

2、接收端

gst-launch -v gstrtpbin name=rtpbin latency=100 \

udpsrccaps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,ssrc=(uint)340005641,payload=(int)96,clock-base=(uint)2625017333,seqnum-base=(uint)5894"port=5000 \

! queue2 ! rtpbin.recv_rtp_sink_0 rtpbin. ! rtph264depay ! teename=teevideo \

teevideo. ! queue2 ! ffdec_h264 ! videoscale ! ffmpegcolorspace ! xvimagesink\

udpsrc port=5001 ! queue2 ! rtpbin.recv_rtcp_sink_0 rtpbin.send_rtcp_src_0! queue2 ! udpsink host=127.0.0.1 port=5005 sync=true async=false \

udpsrccaps="application/x-rtp,media=(string)audio,clock-rate=(int)44100,encoding-name=(string)MP4A-LATM,cpresent=(string)0,config=(string)40002420,ssrc=(uint)4204015526,payload=(int)96,clock-base=(uint)4274968681,seqnum-base=(uint)44386"port=5002 ! queue2 ! rtpbin.recv_rtp_sink_1 rtpbin. ! rtpmp4adepay ! teename=teeaudio \

teeaudio. ! queue2 ! ffdec_aac ! audioconvert ! autoaudiosink \

udpsrc port=5003 ! queue2 ! rtpbin.recv_rtcp_sink_1 rtpbin.send_rtcp_src_1! queue2 ! udpsink host=127.0.0.1 port=5006 sync=true async=false

`gst-launch-1.0` 是 GStreamer 的一个命令行工具,可以用于快速构建和测试 GStreamer 管道。下面是一个使用 `weston-screenshooter` 和 `gst-launch-1.0` 进行屏幕录制的示例: ```bash #!/bin/bash # 使用 gst-launch-1.0 构建管道 gst-launch-1.0 \ v4l2src device=/dev/video0 ! \ video/x-raw,width=640,height=480 ! \ videoconvert ! \ x264enc ! \ mp4mux ! \ filesink location=output.mp4 \ -e & # 等待片刻,确保管道启动完成 sleep 1 # 启动 weston-screenshooter 并将截图数据写入管道 weston-screenshooter -f raw | \ gst-launch-1.0 \ fdsrc ! \ videoparse format=rgb,width=640,height=480 ! \ videoconvert ! \ queue ! \ x264enc ! \ queue ! \ mp4mux ! \ filesink location=output.mp4 # 等待一段时间,让GStreamer管道完成处理并写入文件 sleep 5 # 终止 GStreamer 管道 killall gst-launch-1.0 ``` 上面的代码使用 `gst-launch-1.0` 构建了一个简单的 GStreamer 管道,包括 `v4l2src` 插件(用于获取视频数据)、`videoconvert` 插件(用于转换视频格式)、`x264enc` 插件(用于进行 H.264 编码)、`mp4mux` 插件(用于将编码后的视频写入 mp4 文件)和 `filesink` 插件(用于指定输出文件)。然后,在启动 `weston-screenshooter` 后,将截图数据通过管道写入 GStreamer 管道进行处理和编码。 需要注意的是,由于 `weston-screenshooter` 产生的截图数据是 RGB 格式的,因此需要使用 `videoparse` 插件将其转换为 YUV 格式后再进行后续处理。同时,在使用 `gst-launch-1.0` 进行屏幕录制时,需要考虑系统资源占用和性能问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值