By Toradex 秦海
1). 簡介隨著ARM平台性能的日益強大和嵌入式設備的發展,對於多媒體處理如音視頻播放,攝像頭,流媒體處理等需求也日益增多,本文就通過幾個基於嵌入式Linux下多媒體應用的示例來簡單展示下使用Gstreamer框架進行多媒體處理的方法.
Gstreamer是一個基於Pipeline的多媒體框架,基於GObject,以C語言寫成,目前是嵌入式Linux最為常用的處理多媒體應用框架. Element是Gstreamer最重要和基本的對象類,通過Plugin的形式提供,多個Elements可以組合為bin,並進一步聚合形成一個Pipeline完成一個多媒體應用處理.
2). 硬件准備./ 本文測試所使用平台為Toradex Colibri i.MX6 ARM計算機核心板模塊, 基於NXP i.MX6 SoC, 配合Colibri開發板.
./ 攝像頭作為多媒體輸入源使用Logitech 720P USB攝像頭
3). 軟件准備./ OS為Toradex官方Ycoto project兼容嵌入式Linux發布 V2.5 beta3.
./ Gstreamer-0.10, 系統自帶
./ 安裝gstreamer相關插件包
----------------
root@colibri-imx6:~# opkg update
root@colibri-imx6:~# opkg install gst-plugins-base-meta gst-plugins-good-meta
root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavcodec54_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavutil52_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavformat54_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# opkg install libavutil52_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# opkg install libavcodec54_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# opkg install libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# opkg install libavformat54_9.16-r0.9_armv7ahf-vfp-neon.ipk
root@colibri-imx6:~# opkg install gst-ffmpeg
----------------
4). 測試gstreamerGstreamer提供了兩個非常方便的工具gst-launch和gst-inspect,在真正將Gstreamer pipeline集成到你的程序裡面前,可以使用這兩個工具在命令行下面進行pipeline的准備和測試,本文也主要基於這種模式進行演示,而詳細的關於Gstreamer在程序中使用方法請參考這裡.
gst-inspect可以用來查看當前系統已經安裝的plugin或者具體查看某個element的屬性來判定pipeline中elements互聯兼容性,詳細說明請見這裡.
gst-launch 用於編譯和運行一個pipeline,可以方便的對pipeline進行不同組合嘗試並測試,如下面用來顯示一個視頻測試圖案.
----------------
root@colibri-imx6:~# gst-launch videotestsrc ! 'video/x-raw-rgb, width=(int)640,height=(int)480' ! ximagesink
----------------
5). 應用示例a). 播放攝像頭使用v4l2src元件采集攝像頭視頻,視頻格式為YUY2/幀率30/分辨率640x480; 使用imxv4l2sink元件利用GPU加速播放采集的視頻; 如果使用ximagesink元件來播放則沒有硬件加速.
----------------
root@colibri-imx6:~# gst-launch v4l2src device=/dev/video0 ! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)YUY2' ! imxv4l2sink disp-width=640 disp-height=480
----------------
目標板CPU占用率: 37.5%
b). 采集攝像頭保存為文件同樣使用v4l2src元件采集攝像頭視頻; ffmpegcolorspace元件轉換顏色格式為I420; vpuenc元件調用硬件VPU進行H.264編碼; matroskamux元件進行mkv mux; filesink元件輸出到文件
----------------
root@colibri-imx6:~# gst-launch -v v4l2src device=/dev/video0 ! ffmpegcolorspace ! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)I420' ! queue max-size-buffers=2 ! vpuenc codec=6 ! matroskamux ! filesink location=output.mkv
----------------
目標板CPU占用率: 40%
c). 回放視頻文件使用filesrc元件讀取視頻文件; aiurdemux元件進行demux; vpudec元件通過硬件VPU進行H.264解碼; imxv4l2sink元件播放.
----------------
root@colibri-imx6:~# gst-launch filesrc location=/home/root/output.mkv typefind=true ! aiurdemux ! queue ! vpudec ! imxv4l2sink disp-width=640 disp-height=480
----------------
目標板CPU占用率: 3.5%
d). RTP攝像頭流媒體到遠程主機使用v4l2src元件采集攝像頭; ffmpegcolorspace轉換顏色格式; vpuenc元件調用硬件VPU進行H.264編碼;rtph264pay元件進行h264流rtp封裝; udpsink元件進行udp傳輸.
----------------
//Ubuntu主機IP: 10.20.1.116
//Colibri i.MX6目標板IP: 10.20.1.122
/* Colibri i.MX6 */
gst-launch -v v4l2src device=/dev/video0 ! ffmpegcolorspace! 'video/x-raw-yuv, framerate=30/1, width=(int)640, height=(int)480, format=(fourcc)I420' ! vpuenc codec=6 ! rtph264pay ! udpsink host=10.20.1.116 port=5000
/* Ubuntu 主機 */
//Ubuntu 14.04, 安裝gstreamer-ffmpeg
wgethttp://ppa.launchpad.net/mc3man/gstffmpeg-keep/ubuntu/pool/main/g/gstreamer0.10-ffmpeg/gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb && sudo dpkg -i gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb
//播放流媒體, caps設置從目標板獲得
gst-launch-0.10 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z0JAHqaAoD2QAA\\=\\=\\,aM44gAA\\=\", payload=(int)96, ssrc=(uint)1172839120, clock-base=(uint)784846202,
seqnum-base=(uint)58343" ! rtph264depay ! ffdec_h264 ! ximagesink
----------------
目標板CPU占用率: 35%
6). Gstreamer1.0應用示例Colibri i.MX6 最新Linux發布版本V2.6beta1已經支持gstreamer1.0,升級方法請見這裡
./ 軟件准備
安裝相關插件包
----------------
opkg update
opkg install gstreamer1.0-plugins-base-meta
opkg install gstreamer1.0-plugins-good-meta
opkg remove --force-depends libgstimxcompositor0 //目前版本中需要移除否則無法使用gstreamer
----------------
./ 應用示例
a). 播放攝像頭----------------
root@colibri-imx6:~# gst-launch-1.0 imxv4l2src device=/dev/video0 ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)YUY2' ! imxv4l2sink overlay-width=640 overlay-height=480
----------------
目標板CPU占用率: 30%
b). 采集攝像頭保存為文件----------------
root@colibri-imx6:~# gst-launch-1.0 imxv4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2 ! vpuenc_h264 ! matroskamux ! filesink location=output.mkv
----------------
目標板CPU占用率: 16%
c). 回放視頻文件----------------
root@colibri-imx6:~# gst-launch-1.0 filesrc location=/home/root/output.mkv typefind=true ! matroskademux ! queue ! vpudec ! imxv4l2sink overlay-width=640 overlay-height=480
----------------
目標板CPU占用率: 4%
d). RTP攝像頭流媒體到遠程主機----------------
//Ubuntu主機IP: 10.20.1.116
//Colibri i.MX6目標板IP: 10.20.1.122
/* Colibri i.MX6 */
gst-launch-1.0 imxv4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2 ! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5000
/* Ubuntu 主機 */
//Ubuntu 14.04, 安裝libav (同0.10 ffmpeg)
sudo apt-get install gstreamer1.0-libav
//播放流媒體
gst-launch-1.0 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink
----------------
目標板CPU占用率: 13%
e). 攝像頭連接到遠程主機tcp視頻流到目標版再rtp回遠程主機播放----------------
//Ubuntu主機IP: 10.20.1.116
//Colibri i.MX6目標板IP: 10.20.1.122
/* Ubuntu 主機 */
//采集攝像頭並建立tcp server
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480, format=(string)I420' ! jpegenc ! tcpserversink host=10.20.1.116 port=5000
/* Colibri i.MX6 */
//從tcp server獲取攝像頭視頻流,並進行H.264壓縮後rtp回遠程主機
gst-launch-1.0 tcpclientsrc host=10.20.1.116 port=5000 ! jpegdec ! queue max-size-buffers=2 ! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5001
/* Ubuntu 主機 */
//播放rtp視頻流
gst-launch-1.0 udpsrc port=5001 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink
----------------
目標板CPU占用率: 31%
7). 總結由上面示例可見Gstreamer是一個非常強大且配置靈活的多媒體處理框架,並且配合相應的plugin,也可以充分調用硬件GPU/VPU加速,使其能夠在嵌入式設備上面利用有限的資源高效的實現廣泛的多媒體應用.