1.YUV-H264编码
gst-launch-1.0 filesrc location=test.yuv blocksize=3110400 ! video/x-raw,format=I420, framerate=25/1,width=1920,height=1080,interlace-mode=progressive ! nvh264enc ! filesink location=out.264
2.自动探测解码播放
gst-launch-1.0 filesrc location=out.h264 ! decodebin ! d3dvideosink
3.指定解码器播放
gst-launch-1.0 filesrc location=out.h264 ! video/x-h264 ! h264parse ! avdec_h264 ! d3dvideosink
4.解码H264-YUV
gst-launch-1.0 filesrc location=out.h264 ! video/x-h264 ! h264parse ! avdec_h264 ! filesink location=1.yuv
5.H264-RGB
gst-launch-1.0 filesrc location=out.h264 ! video/x-h264 ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGRA ! filesink location=2.rgb
6.混视频流
/usr/local/bin/gst-launch-1.0 -vv -e videomixer name=mix background=2 \
sink_0::alpha=1.0 \
sink_0::ypos=0 \
sink_0::xpos=0 \
sink_1::alpha=1.0 \
sink_1::ypos=80 \
sink_1::xpos=40 \
sink_2::alpha=1.0 \
sink_2::ypos=80 \
sink_2::xpos=410 \
sink_3::alpha=1.0 \
sink_3::ypos=80 \
sink_3::xpos=780 \
sink_0::zorder=1 \
sink_1::zorder=3 \
sink_2::zorder=3 \
sink_3::zorder=4 \
! clockoverlay auto-resize=false draw-shadow=false draw-outline=false halignment=left valignment=top \
! timeoverlay auto-resize=false draw-shadow=false draw-outline=false halignment=left valignment=bottom \
! queue \
! nvh264enc preset=1 bitrate=1500 rc-mode=2 gop-size=10 \
! h264parse config-interval=-1 \
! mpegtsmux ! rtpmp2tpay pt=33 \
! udpsink host=239.255.42.61 port=5004 multicast-iface=10g-1 ttl=4 ttl-mc=4 \
multifilesrc location=/IMG/logo.jpg caps="image/jpeg,framerate=1/1" \
! jpegdec ! videoconvert ! videoscale \
! video/x-raw,width=1920,height=1080 \
! mix.sink_0 \
udpsrc multicast-group=239.255.42.60 address=239.255.42.60 port=5004 multicast-iface=eth0 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2T,payload=(int)33" \
! rtpjitterbuffer ! rtpmp2tdepay ! tsdemux ! h264parse config-interval=-1 \
! avdec_h264 skip-frame=1 output-corrupt=false ! videoconvert ! videoscale \
! video/x-raw,width=360,height=240 \
! mix.sink_1 \
udpsrc multicast-group=239.255.42.57 address=239.255.42.57 port=5004 multicast-iface=eth0 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2T,payload=(int)33" \
! rtpjitterbuffer ! rtpmp2tdepay ! tsdemux ! h264parse config-interval=-1 \
! avdec_h264 skip-frame=1 output-corrupt=false ! videoconvert ! videoscale \
! video/x-raw,width=360,height=240 \
! mix.sink_2 \
udpsrc multicast-group=239.255.42.62 address=239.255.42.62 port=5004 multicast-iface=eth0 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2T,payload=(int)33" \
! rtpjitterbuffer ! rtpmp2tdepay ! tsdemux ! h264parse config-interval=-1 \
! avdec_h264 skip-frame=1 output-corrupt=false ! videoconvert ! videoscale \
! video/x-raw,width=360,height=240 \
! mix.sink_3 \
4.转码将h265转码成h264
gst-launch-1.0 filesrc location=out2.h265 ! video/x-h265 ! h265parse ! avdec_h265 !openh264enc complexity=high bitrate=10000000 !filesink location=out3.h264
5.播放MP4
1)万能播放器播放
gst-play-1.0.exe 1.mp4
2)自动插件播放
gst-launch-1.0 filesrc location=t.mp4 ! qtdemux name=demux demux. ! queue ! decodebin ! autovideosink demux. ! queue ! decodebin ! audioconvert ! audioresample ! autoaudiosink
6 采集屏幕录像
采集并播放
gst-launch-1.0 dx9screencapsrc ! d3dvideosink
采集并保存RGB文件
gst-launch-1.0 dx9screencapsrc ! filesink location=D:\\videos\\capture.bgr
采集并保存YUV文件
gst-launch-1.0 dx9screencapsrc !videoconvert !video/x-raw,format=I420 !filesink location=capture.yuv
7.采集摄像头
gst-launch-1.0 ksvideosrc devicepath="\\\\\?\\usb\#vid_04f2\&pid_b604\&mi_00\#6\&31e07f50\&0\&0000\#\{6994ad05-93ef-11d0-a3cc-00a0c9223196\}\\global" ! d3dvideosink
Linux上采集设备为v4l2src。
8.摄像头采集并RTP串流
gst-launch-1.0 wrappercamerabinsrc !videoconvert !video/x-raw,format=I420 !openh264enc usage-type=camera complexity=high bitrate=10000000 ! rtph264pay config-interval=3 ssrc=12345 !queue !udpsink host="127.0.0.1" port=60002
9.音视频同步
gst-launch-1.0 udpsrc address=192.168.1.93 port=7890! typefind ! tsdemux name=d ! multiqueue name=q use-buffering=1 d. ! q. q. ! h264parse ! capsfilter caps=“video/x-h264, stream-format=\(string\)avc, alignment=\(string\)au” ! avdec_h264 ! d3dvideosink q. ! aacparse ! avdec_aac ! audioconvert ! audioresample ! autoaudiosink
gst-launch-1.0.exe udpsrc uri=”udp://192.168.1.93:7890” latency=200 ! tsdemux name=demuxer demuxer. ! queue max-size-time=0 ! h264parse ! d3d11h264dec ! d3dvideosink demuxer. ! queue max-size-time=0 ! avdec_aac ! audioconvert ! audioresample ! autoaudiosink
10.nvenc转推srt流
gst-launch-1.0 videotestsrc ! video/x-raw,width=1280,height=720 ! nvh264enc preset=1 bitrate=2000 rc-mode=2 gop-size=10 ! video/x-h264 ! mpegtsmux alignment=7 ! srtsink uri="srt://:1234" sync=false async=false
11.videotestsrc用nvcodec硬件编码,码率高的解决方式:
gst-launch-1.0 videotestsrc is-live=true ! videorate ! video/x-raw,width=1280,height=720,framerate=30/1 ! videorate max-rate=30 ! nvh264enc bitrate=2000 ! video/x-h264 ! mpegtsmux alignment=7 ! srtsink uri="srt://:12345" sync=false async=false
1. 播放视频、音频
音频:gst-launch-1.0 filesrc loaction=123.mp3 ! mad ! autoaudiosink
//补充说明:autoaudiosink可换成pulsesink或alsasink,需要使用gst-inspect查询是否存在这些sink插件,其实autoaudiosink是个壳,最终还是选择使用后两者之一。
视频:gst-launch-1.0 filesrc location=320_240.mp4 ! qtdemux ! sprdavcdec ! autovideosink
//补充说明:autovideosink默认使用ximagesink。ximagesink兼容性较好,但耗资源,xvimagesink兼容性差,因缺乏显卡支持会失败,但效率高。
其他:gst-launch-1.0 filesrc location=abc.mp4 ! qtdemux name=demux demux.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! autovideosink //只分离视频并播放
gst-launch-1.0 filesrc location=3.mp4 ! decodebin ! autovideoconvert ! autovideosink //只解码和显示视频部分,音频过滤掉,decodebin使用着最简单方便
//补充:gstreamer好像不能分离出可播的264裸码流,但是可以用ffmpeg转:ffmpeg.exe -i 320_240.mp4 -vcodec copy -an 320_240.h264
2. 视频、音频编码
视频:gst-launch-1.0 v4l2src device="/dev/video0" ! "video/x-raw, width=1920, height=1080" ! omxh264enc ! "video/x-h264, stream-format=byte-stream" ! h264parse ! qtmux ! filesink location=test.mp4
音频:gst-launch-1.0 audiotestsrc ! audioconvert ! "audio/x-raw,format=S16LE,channels=2,rate=8000" ! lamemp3enc ! filesink location=audio_conv.mp3
gst-launch-1.0 xxx.mp3 ! mad ! audioconvert ! lamemp3enc ! filesink location=xxx_mad_lame.mp3 //mad只解码出S32LE的格式,lame只支持S16LE的格式,因此必须通过audioconvert来转换
3. 摄像头预览
gst-launch v4l2src ! video/x-raw-yuv,width=320,height=240,framerate=20/1 ! autovideosink
说明:v4l2src即图形源,如果不带此插件,可以用videotestsrc替代
4. 转码(avc->yuv, mp3/aac->pcm)
avc->yuv:gst-launch-1.0 filesrc location=attachment.mkv ! matroskademux ! avdec_h264 ! filesink location=tmp.yuv //注意,生成的yuv的size会非常大,mkv中的视频为h264格式
avc->yuv->sink:gst-launch-1.0 filesrc location=dgld.mp4 ! qtdemux ! avdec_h264 ! videoconvert ! video/x-raw,format=I420 ! autovideosink
mp3->wav:gst-launch-1.0 filesrc location=1.mp3 ! mad ! wavenc ! filesink location=1.wav //mad解码出来是32bit的pcm数据,不是S16LE格式的,wavenc其实是对pcm数据编码+封装的过程,因为要有32->S16LE和加wave_header的过程
aac->wav->sink:gst-launch-1.0 filesrc location=out.aac ! aacparse ! avdec_aac ! audioconvert ! alsasink //aac文件到解码之间必须要有一个aacparse,而MP3没有,是因为AAC的ADTS、ADIF容器格式文件导致的吧
5. 常用的一些插件介绍
h265解码,社区提供了两个插件:avdec_h265,de265,前者为ffmpeg项目提供的,后者为德国一家公司提供的插件+解码库
avdec_xxx为ffmpeg项目组提供的解码插件方案,例如avdec_h264、avdec_aac
xxmux为文件封装插件,如qtmux(不要理解为做UI库的QT公司,而是mp4封装,即苹果公司推出的QuickTime符合mp4规范的)
xxdemux为解封装插件
6. filter相关
crop处理:gst-launch-1.0 -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink //videocrop——裁边,可以处理解码器将width/height强制32或64对齐而引入的右侧/底部的灰边,其值表示裁掉多少像素。
7. 网络推流/拉流(两个终端下执行)
gst-launch-1.0 tcpserversrc host="127.0.0.1" port=3000 ! decodebin ! autoaudiosink
gst-launch-1.0 filesrc location=./1.mp3 ! tcpclientsink host="127.0.0.1" port=3000
8. jpeg相关
mjpeg文件解码+显示:gst-launch-1.0 filesrc location=test_mjpeg.mp4 ! qtdemux ! jpegdec ! videoconvert ! autovideosink
mjpeg文件解码+多文件保存:gst-launch-1.0 filesrc location=test_mjpeg.mp4 ! qtdemux ! jpegdec ! multifilesink location=%02d.yuv
jpeg解码+显示:gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! videoconvert ! imagefreeze ! ximagesink //解码后显示,必须用imagefreeze和videoconvert插件,在PC上验证结果。imagefreeze——将图像冻结,否则很快消失。
//yuv的显示
//以下不知道为什么显示全黑色的图像——log中出现了error信息!
//把pixel-aspect-ratio和interlace-mod这两个属性去掉,因为videoconvert的SinkPad不带这些属性
gst-launch-1.0 filesrc location=xxx.yuv ! "video/x-raw,format=I420,width=1280,height=720,pixel-aspect-ratio=1/1,framerate=0/1,interlace-mod=progressive" ! videoconvert ! imagefreeze ! ximagesink //yuv图片的显示
//最终答案是,filesrc 添加文件大小的属性:blocksize=xxx,表示数据源多大,来确定读多少数据来作为一帧。
//videoconvert的sink_pad,有的gst版本要求带framerate的属性,否则报错
gst-launch-1.0 filesrc blocksize=xxx location=xxx.yuv ! "video/x-raw,format=I420,width=1280,height=720" ! videoconvert ! imagefreeze ! ximagesink
//yuv的jpeg编码,前半部分一样,后半部分进行编码+写文件
gst-launch-1.0 filesrc blocksize=xxx location=xxx.yuv ! "video/x-raw,format=I420,width=1280,height=720" ! videoconvert ! jpegenc ! filesink location=yyy.jpg
gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! imagefreeze ! glimagesink //解码+显示
gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! filesink location=test.yuv //解码+存本地文件
gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! imagefreeze ! glimagesink //yuv显示
gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! jpegenc ! filesink location=test_enc.jpg //利用yuv文件编码
//解码+显示
gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! imagefreeze ! glimagesink //可以指定文件大小,使用blocksize=xxx
//解码+存本地文件
gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! filesink location=test.yuv
//yuv文件显示
gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! imagefreeze ! glimagesink
说明:blocksize指定test.yuv文件的大小,width=900,height=800指定yuv文件的实际宽高,必须填对!
//利用yuv文件jpeg编码
gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! jpegenc ! filesink location=test_enc.jpg
说明:blocksize指定test.yuv文件的大小
9. 其他未归类命令
gst-launch-1.0 filesrc location=Capture001.png ! pngdec ! imagefreeze ! autovideosink
gst-launch-1.0 filesrc location=Capture001.png ! pngdec ! filesink location=png.yuv
gst-launch-1.0 filesrc location=320_240_hevc.mp4 ! qtdemux ! filesink location=320_240_gst_naked.hevc //跟ffmpeg分流后得到的不太一样,start_code中包含size信息
gst-launch-1.0 filesrc location=320_240_hevc.mp4 ! qtdemux ! sprdhevcdec ! filesink location=320_240_hevc.yuv
gst-launch-1.0 filesrc location=320_240_hevc.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
gst-launch-1.0 filesrc location=bigbuckbunny_1080p_4mbps.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
gst-launch-1.0 filesrc location=Movie_h265_NA.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
gst-launch-1.0 filesrc location=02_Naturally_720p_x265.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
gst-launch-1.0 filesrc location=bigbuckbunny_1080p_4mbps_ffmpeg.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
10. 其他未归类命令
用gstreamer的管道命令,太麻烦了,真不如ffmpeg用着方便啊!
当然,其存在必然有其合理性,这是linux平台下通用的多媒体中间件系统,多种播放器都是使用它来做的,它的一个很大特点是软件分层、解耦、抽象做的非常好。
如果要做一些插件,需要有一些基础知识,例如gobjec,glib库。
windows:
1.下载安装:
gstreamer-1.0-msvc-x86_64-1.20.2.msi
gstreamer-1.0-devel-msvc-x86_64-1.20.2.msi
默认安装到c盘,安装后在windows系统环境变量添加path路径:C:\1.0\msvc_x86_64\bin
再在dos命令里测试下:
gst-launch-1.0 filesrc location="C:/Users/test/Desktop/test.mp4" ! qtdemux name=demux demux. ! queue ! decodebin ! autovideosink demux. ! queue ! decodebin ! audioconvert ! audioresample ! autoaudiosink
#查看插件信息
gst-inspect-1.0 webrtc
gst-launch-1.0 -v filesrc location="D:/ffmpeg-20200831-win64-static/bin/1280x720.yuv" blocksize=4147200 ! videoparse format=yv12 width=1280 height=720 framerate=25/1 ! videoconvert ! video/x-raw,format=I420,width=1280,height=720,framerate=25/1 ! x264enc ! filesink location=nvenc.264
混音:audiomixer,audio/x-mulaw 表示pcmu, audio/x-alaw:pcma,audio/x-raw:pcm
把g711u 文件解码后混音,g711u解码用:mulawdec, g711a解码用:alawdec
gst-launch-1.0 -v filesrc location=src_37221.pcmu ! audio/x-mulaw, channels=1, rate=8000 ! mulawdec ! audiomixer name=mix ! filesink location=mix.pcm filesrc location=src_48020.pcmu ! audio/x-mulaw, channels=1, rate=8000 ! mulawdec ! mix.
xilinx低延时
#低延时udp发送
gst-launch-1.0 -v v4l2src device=/dev/video0 io-mode=4 ! 'video/x-raw, format=NV12, width=1920, height=1080, framerate=60/1,colorimetry=bt709'\
! omxh264enc num-slices=8 periodicity-idr=240 cpb-size=500 gdr-mode=horizontal initial-delay=250 control-rate=low-latency \
prefetch-buffer=true target-bitrate=8000 gop-mode=low-delay-p ! video/x-h264, alignment=nal ! \
rtph264pay pt=96 ! udpsink host=192.168.38.16 port=6000 async=false max-lateness=-1 qos-dscp=60 max-bitrate=120000000 -v
#H264码流解码显示,XLNXLL超低延时
gst-launch-1.0 udpsrc port=6000 buffer-size=60000000 caps="application/x-rtp, media=video, clock-rate=90000, payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! h264parse ! video/x-h264, alignment=nal ! omxh264dec low-latency=1 ! video/x-raw\(memory:XLNXLL\) ! queue max-size-bytes=0 ! fpsdisplaysink name=fpssink text-overlay=false fps-update-interval=1000 video-sink="kmssink driver-name=xlnx" sync=true -v