一、安装gstreamer
方法1:
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
方法2:
sudo apt-get install -y libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
gstreamer1.0-doc \
gstreamer1.0-tools \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libqt5gstreamer-dev libgtk-3-dev
sudo apt-get install libpng12-0
sudo apt-get install build-essential cmake git pkg-config libjpeg8-dev libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libatlas-base-dev gfortran libhdf5-dev libjpeg-dev libtbb-dev libeigen3-dev
sudo apt-get install -y gstreamer1.0-tools gstreamer1.0-nice gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-plugins-good libgstreamer1.0-dev git libglib2.0-dev libgstreamer-plugins-bad1.0-dev libsoup2.4-dev libjson-glib-dev
二、常用网站
gstreamer资源:
gstreamerC++代码的博客:
gStreamer 官方教程资源大全_gstreamer教程-CSDN博客
7. GStreamer建议的学习步骤和网页链接汇总_gstreamer pdf-CSDN博客
Gstreamer从入门到放弃?_此心安处是吾鄕的博客-CSDN博客
三、基础知识
1. gstreamer知识
基础概念
类 | 概述 |
---|---|
elements | 元件,基本类 |
bin | 集合,有共同的状态 |
pipline | 管道,高级bin,gstreamer必须是pipline |
pads | 输入和输出接口,包括src和sink |
---例子 | name=d d.audio_0 指定使用audio_0 |
src | 元件的输出pads,一般作为下一级的源 |
sink | 元件的输入pads,一般作为上一级的输出 |
bus | 消息管道 |
caps | 过滤器 ,如 ! video/x-vp8 ! |
capsfilter | capsfilter caps="application/x-rtp,media=(string)video" |
tee | 分支,tee name=t ,t.就表示切换新分支 |
支持的uri链接:
file:///<path>/<file> http://<host>/<path>/<file> mms://<host>/<path>/<file> dvb://<CHANNEL> ...
2.音视频知识
图片常见格式:
【YUV420常见格式】: I420、YU12、YV12、NV12、NV21、YU12。YVU9、YUV9、YVU410、YUV410、YVU420、YUV420P、YUV420SP、YUV420P10、YUV420P12、YUV420P16、YUV420SP10、YUV420SP12、YUV420SP16、YUVJ420P、YV16
【YUV422常见格式】: I422、YV16、NV61、NV16、YUVY、VYUY、UYVY、YUY2(YUYV)、YVYU、Y41P、Y211、Y41T、Y42T、YUYV422、UYVY422、HDYC、CYUV、YUV422P、YUV422SP、YUV422I、YUV422A、YUV422P16、V216、V422、P422
【YUV444常见格式】: I444、YV24、NV24、NV42、YUV444。J2K YUV444、YUVA444、V308、V408、YUVP、YUV4、YV16、Y41B、YUV444P、YUV444P10、YUV444P12、AYUV、V410、YUV444P16、YUV444SP、YUV444I、YUV444A、NV24
【RGB常见格式】: RGB24、RGB32、RGB565、RGB555、RGB444、RGB888、RGB444LE、BGR24、BGR32、BGR565、BGR555、BGR888、ARGB、RGBA、ABGR、BGRA、RGBX、XRGB、XBGR、BGRX
按照 YUV 的排列方式,再次将 YUV 分成三个大类,Planar,Semi-Planar 和 Packed。
Planar YUV 三个分量分开存放
Semi-Planar Y 分量单独存放,UV 分量交错存放
Packed YUV 三个分量全部交错存放
具体排布和区分,参考文章:YUV 格式详解,只看这一篇就够了 - 简书 (jianshu.com)
RGB和YUV和YCbCr的转换关系
Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16 Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128 Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128 R' = 1.164*(Y’-16) + 1.596*(Cr'-128) G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128) B' = 1.164*(Y’-16) + 2.017*(Cb'-128) Y'= 0.299*R' + 0.587*G' + 0.114*B' U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y') V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y') R' = Y' + 1.140*V' G' = Y' - 0.394*U' - 0.581*V' B' = Y' + 2.032*U'
码率计算
分辨率 × 位深 × 帧速率 ÷ 1024 ÷ 1024
例如1080P@25: (1920×1080)×(8×3)×25fps÷1024÷1024 = 1186.52Mbps
四、常用命令:
初始测试
播放网络视频流:
gst-launch-1.0 playbin uri=<stream_url>
捕获相机并显示:
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
播放本地MP4视频文件
gst-launch-1.0 -v filesrc location=./1080p_60fps_h264.mp4 ! qtdemux name=demux demux.video_0 ! h264parse ! avdec_h264 ! videoconvert ! videoscale ! video/x-raw, width=640,height=480 ! autovideosink
测试流:
gst-launch-1.0.exe videotestsrc ! autovideosink
可移动的彩条:
gst-launch-1.0 videotestsrc num-buffers=3600 pattern=13 horizontal-speed=10 ! 'video/x-raw, format=(string)NV12, width=(int)1920, height=(int)1080,framerate=60/1' ! videoconvert ! autovideosink
将视频流保存为文件:
gst-launch-1.0 videotestsrc ! x264enc ! mp4mux ! filesink location=output.mp4 -e
gst-launch-1.0 videotestsrc ! 'video/x-raw, format=(string)NV12, width=(int)1920, height=(int)1080,framerate=60/1' ! x264enc ! mp4mux ! filesink location=output.mp4 -e
实时录制摄像头视频到文件:
gst-launch-1.0 v4