999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Gstreamer框架的ffmpeg流媒體編解碼設計

2019-01-30 07:49:04王鋒陸凱
電子技術與軟件工程 2019年1期

文/王鋒 陸凱

把采集的yuv格式通過ffmpeg編解碼庫編碼成h264格式,再通過網絡傳輸到室內播放終端,在室內機終端設備再通過ffmpeg解碼器轉換為yuv420p格式,最終轉換為RGB格式,并在Linux系統的ARM平臺上利用QT圖形化界面顯示。最終實現了數字可視對講系統功能實現的整個流程。

Gstreamer是一個基于管道Pipeline的多媒體應用框架,采用C語言編程,但是通過gObject,將各插件封裝成面向對象編程的工具。元件 Element是Gstreamer最重要和基本的對象類,通過插件Plugin的形式提供,多個元件Elements可以組合為箱柜bin,并進一步聚合形成一個管道Pipeline完成一個多媒體應用處理。目前是嵌入式Linux最為常用的處理多媒體應用框架。我們主要是在ffmpeg多媒體編解碼的過程中加入Gstreamer 的應用框架。

1 基于gstreamer的流媒體可視對講系統開發過程

Gstreamer框架中使用gst-launch命令進行流媒體播放,我們在開發過程中,主要使用gst-launch 在終端編譯和運行一條pipeline用于播放多媒體。gst-launch-0.10 或gst-launch-1.0一般ubuntu系統自帶,相關插件包可通過wget下載opky安裝。由于是基于嵌入式ARM芯片的流媒體開發,還需交叉編譯相關gstreamer動態庫移植到下位機平臺,如glib庫、gstreamer插 件 庫libgstqt5videosink.so、qt5lib庫libQt5GLib-2.0.so、libQt5GStreamer-1.0.so等。 開發過程中調用的gst代碼有gstffmpeg-0.11.2、gst-libav-1.14.4等。

1.1 用GStreamer作v4l2攝像頭采集和輸出到YUV文件

由于需要做攝像頭的視頻采集,所以首先在內核中添加視頻采集模塊Video4Linux2,它是一種內核設備驅動,主要為Linux 下的應用程序編程提供視頻設備接口函數,同時,由于我們是基于GStreamer 框架開發,故在v4l2攝像頭采集中加入GStreamer 插件的方式進行開發。其中 Video4Linux2插件是一個用于捕捉和播放視頻的API和驅動框架,支持一般的攝像頭設備。

v4l2本身不僅僅是支持視頻采集功能,它還支持其他的視頻功能,元件v4l2src屬于Video4Linux2插件,用于讀取Video4Linux2設備的視頻幀,這里即為攝像頭。v4l2src是使用v4l2接口的視頻源插件,只是用來做視頻采集的,支持多種格式的視頻采集,例如rgb格式和yuv格式。

在Linux系統中V4L2驅動的攝像頭數據采集我們采用內存映射方式(mmap)進行圖像采集。數據的采集從/dev/video0設備文件。

視頻采集過程如下:

(1)創建一條名為pipe的新管道 pipe=gst_pipeline_new("pipe");管 道 在GStreamer框架中是用來容納和管理元件的。

(2)調用gst_element_factory_make函數,創建v4l2src、jpegenc、f ilesink插件,分別作為輸入數據源元件、過濾器元件、輸出數據源元件,并調用g_object_set設置元件的屬性,輸入源v4l2src的device屬性設置一下,指定采集設備的名稱:并對輸入源指定幀數量,最后創建f ilesink插件后設置文件的保存路徑。如圖1所示。

(3)判斷管道與元件創建無問題,調用gst_bin_add_many()函數添加已創建好的三個元件到pipe管道中,并按順序連接起來,可以更好的讓數據流動。如圖2所示。

(4)調用gst_pipeline_get_bus()獲取管道的消息總線,并添加消息總線監視器,釋放線資源。如圖3所示。

(5) 在管道創建完成并添加消息監視器后,切換管道狀態PLAYING狀態,來啟動整個管道的數據傳輸處理流程,處理完成停止管道并釋放占用的資源。在創建管道之前先創建了一個 loop=g_main_loop_new(NULL,FALSE);循環體,g_main_loop_run()則是進入主循環在這里我們調用啟動它。有事件時,它就處理事件,沒事件時就睡眠狀態。如圖4所示。

1.2 用GStreamer作Ffmpeg視頻編碼和解碼

V4l2攝像頭視頻采集完成后生成的yuv格式數據量很大,便于傳輸我們需要把YUV422的像素數據編碼為H.264的壓縮編碼數據,傳輸完成后再進行數據的解碼。在此采取Gstreamer管道的方式進行Ffmpeg編解碼,所以需要安裝ffmpeg庫、x264庫之外,還需安裝Gstreamer ffmpeg插件等。

1.2.1 插件的初始化

圖1

圖2

圖3

圖4

圖5

ffpmepg插件的初始化直接就是通過plugin_init()函數注冊到Gstreamer中的,每個plugin都是在plugin_init()函數中通過gst_element_register()函數將plugin的相應信息注冊到gstreamer中。首先調用av_register_all()函數注冊編碼器,該函數是所有使用編碼器、復用器的基礎,在所有基于ffmpeg的應用程序中幾乎都是第一個被調用的。

接著調用ffmepeg編解碼注冊函數gst_ffmpegenc_register (plugin); gst_ffmpegdec_register (plugin)等。通過gst_element_register()函數將plugin的相應信息注冊到gstreamer中。通過該函數,可以創建一個名稱為name、優先級為rank的type類型elementfactory,并將elementfactory添加到registry。在我們自己編寫的插件中,將元件等級rank的值設置為比GST_RANK_PRIMARY大即大于256就可,這樣就將會優先選擇我們編寫的plugin。

1.2.2 gst-ffmpeg視頻編碼

(1)pad的定義創建、連接、流動設置。

首先調用gst_ffmpegenc_init()函數進行gst-ffmpeg編碼的初始化,主要完成對pad的定義創建、連接、流動設置。指定元件對外接口sink pad 和src pad,創建pad 的作用是使數據流通過這些接口流入流出元件,它相當于element的接口,是element間傳輸數據的通道。

指 定sinkpad接 口 后,調 用gst_ffmpegenc_getcaps()從sink pad 中獲取Gstcaps信息,這個函數的作用就是產生一個新的caps,并設置這個caps。并調用avcodec_alloc_context()為編解碼器上下文分配空間。并設置分辨率、像素格式、波特率等幀參數。 gst_ffmpeg_avcodec_open()初始化一個視音頻編解碼器的AVCodecContext。Gstcaps代表pad能處理的媒體類型,調用caps插件的作用是協商caps所支持的格式。

(2)Sinkpad的調度模式設置。

指定pad初始化視音頻編解碼完成。調用Chain鏈條函數對sinkpad調度模式進行設置,我們采用推送模式,推送模式是實現把src pad產生的數據“推送”給下游元件即sink pad。推送模式下,源元件發起數據傳輸,是管道中的驅動力量;下游元件在chain函數中接收buffer。這樣,就完成了從上游元件到下游元件的buffer傳遞。

緊接著給初始化ffmpeg x264參數賦值給ffmpegenc指針,賦值參數有編碼輸出比特率、GOP關鍵幀的最大間隔幀數、幀大小、rtp負載尺寸、運動偵測的方式等。參數賦值完成調用g_object_set_property()函數把參數信息寫入object結構體。在創建pad、調度模式設計級從參數的配置完成后,調用gst_element_add_pad(),添加srcpad、sinkpad到元件中。所有流程完成為element間的數據傳輸鑒定了基礎。

(3)element的注冊。

在上面pad添加完成后,下面進行element的注冊。首先調用gst_ffmpeg_cfg_init()構建ffmpeg參數信息,聲明AVCodec類型的結構體指針in_plugin,主要用于存儲編碼器的信息。通過判斷in_plugin結構體成員如類型、ID、name從而判斷是否是初始化的編碼信息,如不符合,調用av_codec_next()函數傳入相關編碼信息。緊接著調用g_type_register_static()相關的類型GType衍生一個新的glib靜態類型。g_type_add_interface_static()實現接口,并通過gst_element_register()注冊插件支持的所有element類型。

上面完成gst-ffmpeg元件的注冊,采用同樣的方法對ffmpegmux整流器進行注冊。在對ffmpegmux的注冊過程中,調用gst_element_add_pad()添加mux的src pad,并配置videopads、audiopads、preload等參數。

(4)Pipe管道運行。

在所有視音頻初始化信息完成后,pad指定配置完成,調用gst_element_factory_make ()完成element的創建,將多個不同功能的元件(element)裝進一個箱柜(bin)中來管理元件,再通過gst_bin_iterate ()函數運行管道。

1.2.3 gst-ffmpeg視頻解碼

gst-ffmpeg視頻解碼主要是調用gst_ffmpegdemux_loop()函數來完成的。原始數據流的獲取我們首先可以通過libavformat來實現對各種文件的分離,libavformat能夠依次讀取數據包,過濾掉所有那些視頻流中不需要的部分。后gst-ffmpeg調用ffmpeg的API即 av_read_frame()來讀取一個完整的幀數據 ffmpeg,av_read_frame()的好處是可以從一個簡單的包里返回一個包含所有數據的視頻幀。

文件系統的讀操作由ffmpeg調用gstf ilesrc插件的read操作來實現 。一幀數據讀出以后,調用avcodec_send_packet()和avcodec_receive_frame()函數進行解碼,解碼器解碼完,調用dec->callbacks.FillBufferDone通知gst-omx插件。通知gst-omx插件是采用pad push機制進行完成的,實質上采用異步的方式 ,gst-omx的優勢是在不同的硬件下支持不同的編解碼。完成解碼解碼H264視頻數據成YUV2格式。

1.3 視音頻傳輸與媒體播放

傳輸視音頻利用tcpclientsink和udpsink插件主動發送編碼后的數據到播放端。gst_element_factory_make()函數創建插件,g_object_set()方法來設置插件網絡屬性。并使用gst-launch-0.10工具完成管道的創建。如圖5所示。

視頻解碼后是YUV空間的,我們采用兩種方式進行顯示播放,一種是QT GUI的方式,而QT GUI需要RGB空間的數據,所以需要用sws_scale轉換顏色格式到RGB,采用paintEvent(QPaintEvent *)函數進行繪制事件,視頻顯示可以簡單的通過videoout元素來完成視頻顯示。

另外一種方式是用imxv4l2sink元件進行播放,由于我們硬件平臺采用了Freescale的i.MX,是基于Linux下的開發,所以可以采用imxv4l2sink 進行視頻的播放。QtGStreamer可以通過overlay嵌入到其他窗口中。imxv4l2sink元件播放視頻利用GPU加速器。所以顯示速度及效果更加顯著。

4 總結

Gsteramer流媒體的ffmpeg編解碼開發主要還是基于插件的開發,通過插件的形式把各個元件連接起來,形成管道的方式便于數據的傳輸。首先需要創建基本元件,v4l2src、pipeline,f ilesrc,encoder,imxv4l2sink等,然后把這些元件加入到pipeline中,并鏈接起來,最后改變pipeline的狀態,就可以啟動對媒體數據的處理了。

主站蜘蛛池模板: 国产青青操| 91精品网站| 国产亚洲精| 国产精品亚洲精品爽爽| 久久久久夜色精品波多野结衣| 国产美女在线免费观看| 国产精品真实对白精彩久久| 欧美综合激情| 午夜影院a级片| 亚洲欧美日韩中文字幕在线一区| 国产小视频在线高清播放| 色欲不卡无码一区二区| 国产91丝袜在线播放动漫 | 亚洲综合18p| 国产成人精品男人的天堂| 精品国产黑色丝袜高跟鞋| 国产成年女人特黄特色毛片免| 天天做天天爱夜夜爽毛片毛片| 永久天堂网Av| 亚洲人成网站在线观看播放不卡| 国产精品一区二区无码免费看片| 四虎永久在线精品影院| 国产区91| 思思99思思久久最新精品| 婷婷99视频精品全部在线观看| 亚洲天堂区| 中文字幕久久精品波多野结| 全色黄大色大片免费久久老太| 成年网址网站在线观看| 亚洲中文字幕久久精品无码一区| 国产成人a在线观看视频| 无码aaa视频| 狼友视频一区二区三区| 成人无码区免费视频网站蜜臀| 久久午夜夜伦鲁鲁片不卡| 91九色最新地址| 国产欧美高清| 青草精品视频| 精品少妇人妻av无码久久| 亚洲制服丝袜第一页| 国产欧美精品专区一区二区| 国产亚洲精品va在线| 久久久久亚洲AV成人网站软件| 亚洲三级色| 成年av福利永久免费观看| 性视频一区| 中文字幕欧美日韩| 欧美一级黄色影院| 亚洲天堂网在线视频| 亚洲女同欧美在线| 91免费国产高清观看| 国内精品九九久久久精品| 国产九九精品视频| 国产门事件在线| AV在线天堂进入| 综合亚洲网| 成人精品免费视频| 中国美女**毛片录像在线| 天堂网亚洲系列亚洲系列| 亚洲欧美精品一中文字幕| 亚洲精品在线影院| 欧美区一区| 日本91在线| 国产swag在线观看| 国产导航在线| 亚洲VA中文字幕| 国产麻豆福利av在线播放| 青青热久免费精品视频6| 国产丝袜91| 伊人激情综合网| 91免费片| 亚洲天堂高清| 国产精品55夜色66夜色| 91外围女在线观看| 久久这里只有精品2| 亚洲乱码在线播放| 人人91人人澡人人妻人人爽 | 国产精品三级专区| 精品久久久无码专区中文字幕| 高清亚洲欧美在线看| 国产免费好大好硬视频| 欧美中文字幕无线码视频|