常用命令
gstreamer
数据采集
- 采集USB摄像头
gst-launch-1.0 -v v4l2src device=/dev/video0 ! autovideoconvert ! video/x-raw, format=I420, width=1280, height=720 ! glimagesink- 采集 rtsp 流
gst-launch-1.0 rtspsrc location=rtsp://192.168.1.217/main-live ! rtph264depay ! h264parse ! video/x-h264 ! avdec_h264 ! xvimagesink- 采集视频文件
gst-launch-1.0 uridecodebin uri=file:///home/cup.mp4 ! videoconvert ! autovideosink- tcp 接收数据
gst-launch-1.0 tcpserversrc host=192.168.1.228 port=12345 ! gdpdepay ! glimagesink- udp 接收数据 (未压缩数据udp包 > 65507,会失败 )
gst-launch-1.0 udpsrc port=5200 ! application/x-rtp, encoding-name=H264, payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! glimagesink- 采集测试数据
gst-launch-1.0 videotestsrc pattern=“snow” ! video/x-raw, format=NV12, width=1280, height=720 ! glimagesink- 采集音频
gst-launch-1.0 alsasrc device=hw:0,1 ! audio/x-raw, rate=16000, channels=2, layout=interleaved, format=S16LE ! audioconvert ! alawenc ! fakesink sync=false enable-last-sample=false
数据输出
- tcp 发送USB摄像头数据
gst-launch-1.0 -v v4l2src device=/dev/video0 ! autovideoconvert ! video/x-raw, format=I420, width=1280, height=720 ! gdppay ! tcpclientsink host=192.168.1.228 port=12345- tcp 发送rtsp数据
gst-launch-1.0 rtspsrc location=rtsp://192.168.1.217/main-live ! rtph264depay ! h264parse ! video/x-h264 ! avdec_h264 ! gdppay ! tcpclientsink host=192.168.1.228 port=12345- tcp 发送测试数据
gst-launch-1.0 videotestsrc ! video/x-raw, format=I420, width=1280, height=720 ! gdppay ! tcpclientsink host=192.168.1.228 port=12345
注:❤️ 不加gdppay和gdpdepay会失败,Payloads GStreamer Data Protocol buffers- udp 发送rtsp数据
gst-launch-1.0 rtspsrc location=rtsp://192.168.1.217/main-live ! udpsink port=5200- udp 发送测试数据
gst-launch-1.0 videotestsrc ! x264enc ! video/x-h264, stream-format=byte-stream ! rtph264pay ! udpsink port=5200
数据处理
- 多路拼接
gst-launch-1.0 videotestsrc ! video/x-raw,format=AYUV,framerate=(fraction)10/1,width=200,height=200 ! videobox border-alpha=0 top=-0 bottom=-200 right=-200 ! videomixer name=mix sink_0::alpha=0.9 sink_1::alpha=0.9 sink_2::alpha=0.9 sink_3::alpha=0.9 ! queue leaky=downstream ! videoconvert n-threads=2 ! xvimagesink videotestsrc ! video/x-raw,format=AYUV,framerate=(fraction)10/1,width=200,height=200 ! videobox border-alpha=0 top=-200 bottom=-0 right=-200 ! mix.
- 画中画指定位置
gst-launch-1.0 -v videotestsrc name=src1 videotestsrc name=src2 videomixer name=mix sink_0::xpos=0 sink_0::ypos=0 sink_1::xpos=640 sink_1::ypos=360 ! autovideosink src1. ! queue ! videoscale ! video/x-raw,width=1280,height=720 ! videoconvert ! mix.sink_0 src2. ! queue ! videoscale ! video/x-raw,width=640,height=360 ! videoconvert n-threads= 4 ! mix.sink_1- 画中画默认位置
gst-launch-1.0 -e videotestsrc ! video/x-raw,format=NV12,framerate=10/1, width=200, height=150 ! videomixer name=mix ! autovideoconvert ! xvimagesink videotestsrc ! video/x-raw, format=NV12, framerate=10/1, width=640, height=360 ! mix.
- 文字叠加
gst-launch-1.0 videotestsrc ! video/x-raw,width=1280,height=720 ! textoverlay text=“好的” ! autovideosink
- 格式过滤
gst-launch-1.0 -e videotestsrc pattern=“snow” ! capsfilter caps=“video/x-raw,width=1024,height=768,format=RGB” ! glimagesink
- 图像 resize
gst-launch-1.0 -e videotestsrc pattern=“snow” ! capsfilter caps=“video/x-raw,width=1024,height=768,format=RGB” ! videoscale ! video/x-raw,width=640,height=360 ! glimagesink
- 分离视频文件的音视频播放
gst-launch-1.0 -v uridecodebin uri=file:///视频/cup.mp4 name=decoder ! videoconvert ! autovideosink decoder. ! audioconvert ! autoaudiosink
- tcp 接收音视频保存文件
(1)保存avi:gst-launch-1.0 tcpserversrc host=10.18.9.254 port=12345 ! gdpdepay ! videoconvert ! jpegenc ! avimux name=mux ! filesink location=“test.avi” tcpserversrc host=10.18.9.254 port=12346 ! gdpdepay ! audioconvert ! avenc_aac ! aacparse ! mux.
(2)保存mkv:gst-launch-1.0 matroskamux name=smux ! filesink location=“video.mkv” tcpserversrc host=10.18.9.254 port=12345 ! gdpdepay ! videoconvert ! jpegenc ! smux.video_0 tcpserversrc host=10.18.9.254 port=12346 ! gdpdepay ! audioconvert ! avenc_aac ! aacparse ! smux.audio_0
(3)发送:gst-launch-1.0 uridecodebin uri=file:///视频/Megamind.avi name=decoder ! videoconvert ! gdppay ! tcpclientsink host=10.18.9.254 port=12345 decoder. ! audioconvert ! gdppay ! tcpclientsink host=10.18.9.254 port=12346
ffmpeg
查看信息
- 查看本地的视频信息
ffmpeg -i file.avi
分离视频音频流
- 分离视频流
ffmpeg -i input_file -vcodec copy -an output_file_video- 分离音频流
ffmpeg -i input_file -acodec copy -vn output_file_audio
视频格式转换
- ts 转 mp4
ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 output.mp4- h264 转 ts
ffmpeg -i test.h264 -vcodec copy -f mpegts output.ts- h264 转 mp4
ffmpeg -i test.h264 -vcodec copy -f mp4 output.mp4- mp4 转 flv
ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv- flv 转 mp4
ffmpeg -i test.flv -b:v 640k output.mp4- mkv 转 avi
ffmpeg -i test.mkv -vcodec copy -acodec copy output.avi- mkv 转 mp4
ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4
图像处理
- 截取指定时间的缩略图
(1) ffmpeg –i test.mp4 -y -f image2 -ss 8 -t 0.001 -s 350x240 testImage.jpg
(2) ffmpeg -s 640x480 -pix_fmt nv21 -i nv21_118.yuv -f image2 -pix_fmt bgr24 1.jpg- 添加图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay test1.mp4- 添加GIF
ffmpeg -y -i test2.mp4 -ignore_loop 0 -i test.gif -filter_complex overlay=0:H-h test_out2.mp4- 添加文字水印
ffmpeg -i input.flv -vf “drawtext=fontfile=simhei.ttf: text=‘test’:x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2” drawtext.mp4- 旋转90°
ffmpeg -i test.mp4 -vf “transpose=0” out.mp4
注释:0, 逆时针旋转90°再水平翻转; 1, 顺时针90°; 2, 逆时针90°; 3, 顺时针90°再水平翻转;- 水平翻转
ffmpeg -i test.mp4 -vf hflip out.mp4- 垂直翻转
ffmpeg -i test.mp4 -vf vflip out.mp4- 提取图片
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg- 截取指定时间的视频
(1) ffmpeg -ss 1:05 -i input.mp4 -t 10 -c:v copy -c:a copy output.mp4
注释:-r,频率;-ss,开始时间;-t,持续时间;
(2) ffmpeg -i ./plutopr.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 ./cutout1.mp4 -y- 视频倒放,音频不变
ffmpeg -i inputfile.mp4 -vf reverse reversed.mp4//视频倒放,音频不变- 视频加速
ffmpeg -i inputfile.mp4 -vf setpts=PTS/2 -af atempo=2 output.mp4
备注:帧速率变为2倍,调整倍速范围【0.25,4】- 视频减速
ffmpeg -i input.mkv -an -filter:v “setpts=0.5*PTS” output.mkv- 视频拼接 mpeg
(1) ffmpeg -i 1.mp4 -qscale 4 1.mpg
(2) ffmpeg -i 2.mp4 -qscale 4 2.mpg
(3) cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 6 -vcodec mpeg4 output.mp4
注释:mpeg是支持简单拼接的,所以 mp4 --> mpeg --> mp4.- 视频拼接 ts
(1) ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
(2) ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
(3) ffmpeg -i “concat:1.ts|2.ts” -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
注释: ts流可以 concate,所以 mp4 --> ts --> concate ts --> mp4.- 视频合并
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4
(1)hstack/vstack 代表水平和垂直方向
(2)xstack 用户自己排版
备注:视频output.mp4只会保留input1的音频- 把mp3文件合并到mp4
ffmpeg -i output.mp4 -i audio3.mp3 -c:v copy -c:a aac -strict experimental success.mp4- 其它参数用法: ffmpeg 官网参数简介
ffplay
- 播放yuv视频
ffplay -pixel_format yuv420p -video_size 720x480 -framerate 25 yuv420p_test.yuv
ffplay -f rawvideo -pixel_format nv12 -s 3840*2160 test-4k-night-1.nv12
注释:rgb24,nv21等格式- 播放rgb视频
ffplay -i nv21_118.rgb -pix_fmt rgb24 -s 640x480- 循环播放
ffplay pm.mp4 -loop 10
ffprobe
- 主要用于检测多媒体信息(时长、分辨率、帧率、音频采样率、声道数等)
- ffprobe -i input.mp4 -show_streams -show_format -print_format json
(1)print_format支持:json和xml
mplayer
- 播放yuv视频
mplayer -demuxer rawvideo -rawvideo w=1280:h=720 v4l2.yuv
V4L2
查看信息
- 查看设备信息
v4l2-ctl -d /dev/video2 --all
UVC
查看信息
- 打开视频并配置图像参数
guvcview -d /dev/video2
YUV 测试文件下载
- http://trace.eas.asu.edu/yuv/
- http://media.xiph.org/video/derf/