媒體控制器
現代的片上系統(SoC)設備之內部硬件模塊的方式支持普遍的功能,這致使採用多種方式互連SoC中的功能,從而改變了V4L設備的內容。html
媒體控制器內核API旨在將有關媒體設備和捕獲設備的詳細信息公開給用戶空間,以使它們能夠在運行時以動態和複雜的方式互連。linux
媒體控制器設備將實體公開給媒體控制器框架。每一個實體具備一個或多個源極焊盤和一個或多個匯聚焊盤。您可使用媒體控制器內核API(即經過media-ctl
)來查詢實體,將源填充連接到接收填充,以及設置填充格式。git
請注意,IMX6媒體控制器驅動程序是在4.13內核中添加到Linux的。此頁面適用於Linux 4.13及更高版本。若是您使用的內核早於基於Ventana IMX6的主板的內核(例如Gateworks 3.14內核),則須要使用Yocto GStreamer頁面:github
- Yocto / gstreamer
- Yocto / gstreamer /合成
- Yocto / gstreamer / latency
- Yocto / gstreamer /多媒體
- Yocto / gstreamer /流媒體
- Yocto / gstreamer /視頻
media-ctl(v4l-utils軟件包)
在media-ctl
從爲v41-utils軟件包的應用程序是使用Linux的媒體控制器API來配置管道用戶空間應用程序。ubuntu
media-ctl
沒有幫助頁,但查看源代碼:後端
- --device <dev>(默認爲/ dev / media0)
- --entity <名稱>打印與給定實體關聯的設備名稱
- --set-v4l2 <v4l2>逗號分隔要設置的格式列表
- --get-v4l2 <pad>在給定的pad上打印活動格式
- --set-dv <pad>在給定的打擊墊上配置DV時序
- --interactive交互式修改連接
- --links <linux>逗號分隔要設置的連接描述符列表
- --known-mbus-fmts列出已知格式及其數值
- --print-topology打印設備拓撲
- --reset將全部連接重置爲非活動狀態
可視化可用於互連的硬件組件的最佳方法是使用打印拓撲並將其轉換爲圖形圖像:api
media-ctl --print-topology media-ctl --print-dot> graph.dot 點-Tpng graph.dot> graph.png
- 虛線表示可能的鏈接;用這些來肯定可能性
- 實線表示活動鏈接
- 綠色框顯示媒體實體
- 黃色框顯示video4linux端點
例如,如下是GW5404的圖形: 服務器
你能夠找到視頻捕獲設備存在各類gateworks板在圖表http://dev.gateworks.com/docs/linux/media/:併發
用於media-ctl --links
將實體源填充板連接到實體接收板:app
media-ctl --links 「 <實體>:<srcpadn>-> <實體b>:<sinkpadn> [<flags>]
- 標誌:0 =無效1 =有效
硬件媒體管道的基本配置步驟爲:
- 重置全部連接
media-ctl --reset
- 配置連接
media-ctl --links
- 配置填充格式
media-ctl --set-v4l2
- 用如下命令配置subdev屬性
v4l2-ctl
- 捕獲
/dev/video*
設備 上的幀
有關Video4Linux2的更多信息,請參見此處。
IMX6媒體捕獲
該IMX媒體控制器文件在Linux內核可能用於解釋什麼是SoC中的哪些每一個組件均可以作的最好的文檔:
飛思卡爾i.MX5 / 6包含一個圖像處理單元(IPU),用於處理往返於捕獲設備和顯示設備的圖像幀。
對於圖像捕獲,IPU包含如下內部子單元:
- 圖像DMA控制器(IDMAC)
- 相機串行接口(CSI)
- 圖像轉換器(IC)
- 傳感器多FIFO控制器(SMFC)
- 圖像旋轉器(IRT)
- 視頻去隔行或合併塊(VDIC)
IDMAC是DMA控制器,用於在內存之間傳輸圖像幀。存在用於視頻捕獲和顯示路徑的各類專用DMA通道。在傳輸過程當中,IDMAC還可以在相同的顏色空間內進行垂直圖像翻轉,8x8塊傳輸(請參閱IRT描述),像素份量重排序(例如,從UYVY到YUYV)以及打包的<->平面轉換。IDMAC還能夠經過在傳輸過程當中對偶數行和奇數行進行交織來執行簡單的去隔行(無需運動補償,這須要VDIC)。
CSI是後端捕獲單元,可經過Parallel,BT.656 / 1120和MIPI CSI-2總線直接與攝像機傳感器鏈接。
該IC可處理色彩空間轉換,調整大小(縮小和放大),水平翻轉和90/270度旋轉操做。
IC中有三個獨立的「任務」能夠同時執行轉換:預處理編碼,預處理取景器和後處理。在每一個任務中,轉換分爲三個部分:縮小部分,主要部分(放大,翻轉,色彩空間轉換和圖形平面合併)和旋轉部分。
IPU分時執行IC任務操做。時間片粒度是在縮小區域中的八個像素的一連串,在主處理部分中的一圖像線,在旋轉部分中的一圖像幀。
SMFC由四個獨立的FIFO組成,每一個FIFO能夠同時經過四個IDMAC通道將捕獲的幀從傳感器直接直接傳輸到內存。
IRT執行90度和270度圖像旋轉操做。旋轉操做一次在8x8像素塊上執行。IDMAC支持此操做,它與垂直翻轉配合處理8x8塊傳輸以及塊從新排序。
VDIC支持將隔行視頻轉換爲逐行視頻,並支持不一樣的運動補償模式(低,中和高運動)。VDIC的去隔行輸出幀能夠發送到IC預處理取景器任務,以進行進一步的轉換。VDIC還包含一個組合器,該組合器經過alpha混合和色彩鍵組合兩個圖像平面。
除了IPU內部子單元外,IPU以外還有兩個單元也參與i.MX上的視頻捕獲:
- MIPI CSI-2接收器,用於帶有MIPI CSI-2總線接口的攝像機傳感器。這是Synopsys DesignWare的核心。
- 兩個視頻多路複用器,用於在多個傳感器輸入中進行選擇以發送到CSI。
這些實體將根據處理器而有所不一樣:IMX6D / Q具備兩個IPU,而IMX6S / DL僅具備一個IPU,所以實體和焊盤的數量不一樣。另外,某些實體將具備基於設備樹端點的固定配置。adv7180模擬媒體控制器驅動程序還與tda1997x HDMI接收器媒體控制器驅動程序同樣,提供了一個實體。
參考文獻:
內核驅動程序
須要爲IMX6捕獲啓用如下內核驅動程序:
- CONFIG_MEDIA_CONTROLLER = y-用於媒體控制器驅動程序和框架
- CONFIG_VIDEO_V4L2_SUBDEV_API = y-用於V4L2 subdev框架
- CONFIG_VIDEO_IMX_MEDIA = y-用於IMX6媒體控制器
- CONFIG_VIDEO_MUX = y-視頻多路複用器
- CONFIG_VIDEO_ADV7180 = m-用於Ventana模擬CVBS視頻捕獲(模塊)
- CONFIG_VIDEO_TDA1997X = m-用於Ventana Digital HDMI視頻捕獲(模塊)
內核將顯示以下消息:
root @ ventana:〜#dmesg | grep媒體 [ 0 .343835 ]媒體:Linux媒體接口:v0.10 [ 6 .189587 ] imx-media:已註冊的subdev ipu2_csi1_mux [ 6 .195114 ] imx-media:已註冊的subdev ipu1_csi0_mux [ 6 .200928 ] imx-media:已註冊subdev ipu1_vdic [ 6 .206251 ] imx-media:已註冊的subdev ipu2_vdic [ 6 .211493 ] imx-media:已註冊的subdev ipu1_ic_prp [ 6 .216580 ]IMX媒體:註冊subdev ipu1_ic_prpenc [ 6 0.230109 ] IMX媒體:註冊subdev ipu1_ic_prpvf [ 6 0.242937 ] IMX媒體:註冊subdev ipu2_ic_prp [ 6 0.248023 ] IMX媒體:註冊subdev ipu2_ic_prpenc [ 6 0.261065 ] imx-媒體:已註冊的subdev ipu2_ic_prpvf [ 6 .273972 ] imx-media:已註冊的subdev ipu1_csi0 [ 6 .292605 ] imx-media:已註冊的subdev ipu1_csi1 [ 6 .304263 ]imx-media:已註冊的subdev ipu2_csi0 [ 6 .315870 ] imx-media:已註冊的subdev ipu2_csi1 [ 6 .327352 ] imx-media:imx_media_create_link:ipu1_csi0:1-> ipu1_ic_prp:0 [ 6 .334307 ] imx-media:imx_media1_create_link :1-> ipu1_vdic:0 [ 6 .341128 ] imx-media:imx_media_create_link:ipu1_csi0_mux:2-> ipu1_csi0:0 [ 6 .348200 ] imx-media:imx_media_create_link:ipu1_csi1:1-> ipu1_ic_prp:0 [ 6 .355253 ]imx-media:imx_media_create_link:ipu1_csi1:1-> ipu1_vdic:0 [ 6 .362026 ] imx-media:imx_media_create_link:ipu2_csi0:1-> ipu2_ic_prp:0 [ 6 .368924 ] imx-media:imx_media_create_link:ipu2_csi0 :0 [ 6 .375717 ] imx-media:imx_media_create_link:ipu2_csi1:1-> ipu2_ic_prp:0 [ 6 .382661 ] imx-media:imx_media_create_link:ipu2_csi1:1-> ipu2_vdic:0 [ 6 .389419 ] imx-media:imx_media_create_link :ipu2_csi1_mux:2-> ipu2_csi1:0 [ 6 .396529 ]imx-media:imx_media_create_link:ipu1_vdic:2-> ipu1_ic_prp:0 [ 6 .403487 ] imx-media:imx_media_create_link:ipu1_ic_prp:1-> ipu1_ic_prpenc:0 [ 6 .410858 ] imx-media:imx_media_create_link- ipu1p :0 [ 6 .418104 ] imx-media:imx_media_create_link:ipu2_vdic:2-> ipu2_ic_prp:0 [ 6 .425095 ] imx-media:imx_media_create_link:ipu2_ic_prp:1-> ipu2_ic_prpenc:0 [ 6 .432764 ] imx-media:imx :ipu2_ic_prp:2-> ipu2_ic_prpvf:0
/dev/media
設備受媒體控制器框架做用-即便imx-media驅動程序註冊了子/dev/media
設備,設備也要等到端點(adv7180,tda1997x)驅動程序加載後纔會顯示,由於那是devicetree中的端點(兩個端點都必須存在才能夠顯示)可用)
媒體控制器管道
經過以Linux v4l2捕獲芯片開始並以Linux v4l2捕獲節點(即/ dev / video4)結束的方式將它們連接在一塊兒,能夠建立各類媒體控制器實體管道。
您建立的媒體管道取決於:
- 主板型號和CPU
- 您追求的功能和性能
Ventana底板具備如下視頻捕獲功能:
- GW54xx:
- CVBS(模擬)視頻捕獲(ADV7180)
- HDMI(數字)視頻捕獲(TDA1997X)
- GW551x:
- HDMI(數字)視頻捕獲(TDA1997X)
- GW51xx / GW52xx / GW53xx / GW553x:
- CVBS(模擬)視頻捕獲(ADV7180)
每一個捕獲設備的IPU和CSI端口不只取決於電路板型號,並且還取決於IMX6 SoC型號。
下表顯示了每一個板和SoC的每一個捕獲設備的各類IPU / CSI組合:
板 | 片上系統 | ADV7180模擬CVBS | TDA1997x數字HDMI |
---|---|---|---|
GW5404 | IMX6Q | IPU2_CSI1 | IPU1_CSI0 |
GW5304 / GW5204 | IMX6Q | IPU2_CSI1 | 不適用 |
GW5300 / GW5200 | IMX6DL | IPU1_CSI1 | 不適用 |
GW5104 / GW5534 | IMX6Q | IPU1_CSI0 | 不適用 |
GW5100 / GW5530 | IMX6DL | IPU1_CSI0 | 不適用 |
GW5514 | IMX6Q | 不適用 | IPU1_CSI0 |
GW5510 | IMX6S | 不適用 | IPU1_CSI0 |
您構造的管道media-ctl
會有所不一樣,這取決於您要完成的工做,由於不一樣的硬件塊(在媒體控制器圖中轉換爲實體)能夠執行不一樣的轉換,例如色彩空間轉換,縮放,旋轉或逐行掃描。在某些狀況下,能夠經過多種折衷來實現某種翻譯。
該IMX6媒體驅動寄存器,採起IMX6硬件的優點幾個實體(見文檔/媒體/ V4L司機/ IMX):
- ipu_csi_mux-IPU CSI多路複用器:將並行捕獲總線和MIPI捕獲總線複用到攝像機傳感器接口(CSI)
- ipu_csi-IPU捕獲傳感器接口(IDMAC)(在總線上鎖存並行數據,或從總線反序列化MIPI數據)。除了原始幀捕獲外,它還支持:
- 使用做物選擇subdev API進行做物
- 使用compose selection subdev API在寬度和高度上固定固定的二分之一縮小比例
- 經過設置接收器和源極墊上的幀間隔來指定跳幀
- 無需運動補償的簡單去隔行掃描(若是接收盤焊盤的場類型是隔行類型且源極盤場類型設置爲無,則激活)
- 同一顏色空間內的像素從新排序:即:UYVY2X8-> YUYV2X8
- 像素平面轉換:YUV-> YUV420(平面)
- 幀間隔監視器:對於諸如adv718x之類的解碼器,在NTSC / PAL信號從新同步期間(視頻行太少或太多),偶爾發送損壞的字段,IPU能夠觸發一種機制,方法是在每一次添加一條虛擬行時從新創建垂直同步幀致使圖像到圖像甚至永久性分割圖像的滾動效果。此機制可用於檢測損壞的字段併發送V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR,能夠捕獲該錯誤以發出從新啓動以更正滾動/分割圖像。ipu_csi子開發程序包含用於配置此「幀間隔監視器」或FIM的自定義控件。V4L FIM控件是V4L2_CID_IMX_FIM_NUM_SKIP,V4L2_CID_IMX_FIM_ICAP_CHANNEL和V4L2_CID_IMX_FIM_ICAP_EDGE。
- ipu_vdic-將隔行視頻轉換爲逐行視頻,並支持不一樣的運動補償模式(低/中/高運動)。該模式由V4L2_CID_DEINTERLACING_MODE菜單控件指定。該實體具備來自ipu_csi實體的直接鏈接墊(只能使用高速模式),可是具備能夠與其餘輸出或mem2mem設備節點(其中高,低或中等運動模式可使用)一塊兒使用的附加源極板。使用)。
- ipu_ic_prp-IC預處理實體:充當在源焊盤和宿焊盤之間路由數據的路由器。若是該實體從ipu1_vdic下沉,則它能夠向ipu_ic_prpenc或ipu_ic_prpvff供電,或者能夠直接從ipu_csi下沉並同時提供兩個輸出焊盤。
- ipu_ic_prpenc-IC預處理編碼實體提供:
- 色彩空間轉換
- 調整大小(縮小和放大)
- 使用標準V4L2控件進行水平和垂直翻轉以及90/270度旋轉
- 無需運動補償的簡單去隔行
- 像素從新排序
- ipu_ic_prpvf-IC預處理取景器實體:這與ipu_ic_prpenc實體相同,支持:
- 色彩空間轉換
- 使用標準V4L2控件進行水平和垂直翻轉以及90/270度旋轉
- 無需運動補償的簡單逐行掃描(除非管道中包含了ipu_vdic,由於具備運動補償的vdic已經完成了逐行掃描)
- 像素從新排序
忽略輸入和輸出填充編號以及IPU和CSI索引,如下僞管道頗有用:
- 輸入分辨率的原始捕獲:
傳感器-> ipu_csi_mux-> ipu_csi-> ipu_csi捕獲
- 使用
tda19971
數字HDMI的adv7180
源和模擬CVBS的源 - 在上面的IPU和CSI上使用正確的索引,具體取決於板/ SOC /輸入(請參見上表)
- 經過在ipu_csi_mux和ipu_csi實體上使用'field:seq-tb'指定格式,能夠將IDMAC用於從源開始的隔行視頻的簡單去隔行。
- 使用
- 經過VDIC高速補償去隔行:
傳感器-> ipu_csi_mux-> ipu_csi-> ipu_vdic-> ipu_ic_prp-> ipu_ic_prpvf-> ipu_ic_prpvf捕獲
- 使用
tda19971
數字HDMI的adv7180
源和模擬CVBS的源 - 在上面的IPU和CSI上使用正確的索引,具體取決於板/ SOC /輸入(請參見上表)
- 在ipu_ic_prp和ipu2_ic_prpvf的ipu_csi_mux,ipu_csi,ipu_vdic和'field:none'的格式上指定「 field:interlaced」(由於ipu_ic_prp是能夠與IDMAC進行去隔行的實體)
- 使用
- IC直接轉換:
- 使用預處理編碼實體將幀直接從CSI路由到IC,以進行最大1024x1024分辨率,CSC,翻轉和圖像旋轉的縮放:
傳感器-> ipu_csi_mux-> ipu_csi-> ipu_ic_prp-> ipu_ic_prpenc-> ipu_ic_prpenc捕獲
- 使用預處理編碼實體將幀直接從CSI路由到IC,以進行最大1024x1024分辨率,CSC,翻轉和圖像旋轉的縮放:
- 運動補償去隔行:
- 將幀從CSI直接路由到VDIC,以進行運動補償(高模式)去隔行,縮放至1024x1024,CSC,翻轉和旋轉:
傳感器-> ipu_csi_mux-> ipu_csi-> ipu_vdic-> ipu_ic_prp-> ipu_ic_prpvf-> ipu_ic_prpvf捕獲
- 將幀從CSI直接路由到VDIC,以進行運動補償(高模式)去隔行,縮放至1024x1024,CSC,翻轉和旋轉:
請注意,爲了幫助使用控件的V4L2應用程序進行配置並向後兼容,捕獲設備接口將從當前管道中的活動實體繼承控件,所以能夠經過實體子開發人員或活動的捕獲設備接口訪問這些控件。例如,能夠從ipu_csi子開發工具或活動的捕獲設備得到FIM控件。
安裝腳本
因爲傳感器,cpu和電路板的組合不少,所以咱們建立了一種建立適當的管道配置腳本的方法,該腳本只須要知道您要使用的傳感器便可。
安裝:
如下腳本要求安裝GStreamer,有關說明,請參見此處。
腳本下載:
wget https://raw.githubusercontent.com/Gateworks/media-ctl-setup/master/media-ctl-setup chmod + x media-ctl-setup
例子:
- 模擬CVBS NTSC捕獲
v4l2-ctl --device / dev / v4l-subdev14-設置標準NTSC ./media-ctl-setup adv7180>設置 源 ./setup
- 模擬CVBS PAL捕獲
v4l2-ctl --device / dev / v4l-subdev14-設置標準PAL ./media-ctl-setup adv7180>設置 源 ./setup
- 數字HDMI捕獲
./media-ctl-setup tda1997x>設置 源 ./setup
請注意,在以上示例中,咱們「獲取」設置腳本而不是執行該腳本,以便它能夠將諸如視頻捕獲設備之類的變量導出到DEVICE env變量,該變量可在下面的其餘示例中使用。
請注意,media-ctl-setup
每當輸入源發生變化(即模擬NTSC-> PAL或HDMI輸入格式(分辨率/色彩空間/幀速率))時,都須要從新運行腳本及其生成的輸出命令。
請注意,對於許多模擬解碼器芯片(例如Ventana上使用的adv7180),若是丟失或得到信號鎖定(例如,在流開始後模擬視頻輸入已斷開鏈接並從新鏈接或只是鏈接),則必須中止並從新啓動流。這是由於許多模擬視頻解碼器在鎖定後當即產生一些不完整的幀,所以必須丟棄這些幀,不然它們會使IMX6感到困惑。還有在這個時候放棄在主流Linux前幾幀不支持,可是你可使用包含在Gateworks媒體內核下面的補丁:https://github.com/Gateworks/linux-imx6/commit/fcab532
爲了檢測當捕獲源輸入的變化,你能夠遇上V4L2_EVENT_SOURCE_CHANGE
經過事件VIDIOC_DQEVENT
的ioctl -見https://www.linuxtv.org/downloads/v4l-dvb-apis-old/vidioc-dqevent.html
IMX6 IPU MEM2MEM(硬件CSC /縮放/裁剪/旋轉/翻轉)
存在一個Linux V4L2 MEM2MEM imx-media驅動程序,該驅動程序容許利用IMX6 IPU圖像轉換器硬件模塊(IC)執行硬件色彩空間轉換(CSC),縮放,裁剪,旋轉和翻轉操做。
GStreamer video4linux2
插件提供了一個元素,該元素使用此驅動程序將這些功能公開給GStreamer應用程序。
筆記:
- 對於GStreamer-1.14,元素的名稱取決於驅動程序向內核註冊的視頻設備(即,若是mem2mem驅動程序註冊了/ dev / video8,則v4l2video8convert)
- 對於GStreamer主設備(正在開發中),元素的名稱始終爲「 v4l2videoconvert」
kmssink
下面的示例須要一個can-scale=false
屬性來告訴GStreamer不要經過KMS驅動程序進行縮放(由於IMX6 KMS驅動程序不支持縮放)- 確保輸入格式與輸出格式不一樣,不然GStreamer將徹底繞過轉換;請注意,GStreamer沒法將翻轉或旋轉理解爲格式的一部分。Gstreamer主設備(正在開發中)向v4l2videoconvert實體添加了「禁用直通」屬性,該屬性能夠設置爲強制進行轉換,而與輸入和輸出格式無關
- 使用imx實體(即捕獲,編碼/解碼,mem2mem,顯示)時,您能夠指定「 output-io-mode = dmabuf-import」以共享零拷貝管道的dmabuf指針,可是若是使用非imx實體(即videotestsrc)您必須忽略這些,由於您不能確保緩衝區共享共享dmabuf指針所需的對齊方式/跨度
例子:
- 確保mem2mem在您的內核中:
〜#dmesg | grep mem2mem [ 18 .356023 ] imx-media:將ipu_ic_pp mem2mem註冊爲/ dev / video8
請參閱下面的Gstreamer示例
IMX6尾隨編碼/解碼驅動程序
Linux CODA驅動程序提供對IMX6硬件編碼/解碼編解碼器的訪問,而GStreamer video4linux2
插件提供了可利用此功能的編碼/解碼元素。
例子:
- 確保CODA在您的內核中:
〜#dmesg | grep的結尾 [ 16 0.721698 ]結尾2040000 .vpu:直接固件負載爲 vpu_fw_imx6q.bin失敗,錯誤-2 [ 16 0.721724 ]結尾2040000 .vpu:落回syfs回退爲:vpu_fw_imx6q.bin [ 18 0.381136 ]尾2040000 .vpu:使用備用固件vpu / vpu_fw_imx6q.bin [ 18 .433648 ]尾碼2040000 .vpu:固件代碼修訂版:570363 [ 18 .433683] coda 2040000 .vpu:已初始化的CODA960。 [ 18 .433706 ] coda 2040000 .vpu:固件版本:3 .1.1 [ 18 .442312 ] coda 2040000 .vpu:編解碼器註冊爲/ dev / video [ 9 -10 ]
請參閱下面的Gstreamer示例
捕獲的例子
假設您已經配置了捕獲設備(請參見上文),並將其設置爲DEVICE
env變量,則如下示例對於捕獲和流傳輸很是有用:
例子:
- 基本原始幀捕獲
v4l2-ctl
:#1個捕捉幀 用v412-CTL --device的/ dev / VIDEO4 --stream-MMAP --stream到= x.raw --stream計數= 1個 #轉換與ImageMagick的(假設你捕獲的480p的YUV幀) 轉換-尺寸720x480-深度16 uyvy:x.raw frame.png
GStreamer捕獲,顯示和流示例
假設您已經配置了捕獲設備(請參閱上文),並將其設置爲DEVICE
env變量,如下示例是使用GStreamer進行捕獲和流傳輸的有用示例。有關更明確的示例,請參見咱們的GStreamer頁面。
首先,請確保您已安裝gstreamer。您能夠選擇所需的內容,可是如下內容將在Ubuntu系統上安裝幾乎全部內容:
#安裝gstreamer: apt-get install 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 gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
捕獲/顯示
- 顯示捕獲源:
#顯示kmssink gst-launch-1.0 v4l2src 設備= $ DEVICE!kmssink #display fbdevsink gst-launch-1.0 v4l2src 設備= $ DEVICE!v4l2video10convert output-io-mode = dmabuf-import!fbdevsink
捕獲/編碼
- 確保GStreamer編碼元素存在:
〜#gst-inspect-1.0 | grep -e 「 v4l2。* enc」 video4linux2:v4l2h264enc:V4L2 H.264編碼器 video4linux2:v4l2mpeg4enc:V4L2 MPEG4編碼器
- 編碼爲JPEG(基於軟件的編碼)並經過RTP / UDP進行流傳輸:
#stream JPEG / RTP / UDP gst-launch-1.0 v4l2src 設備= $ DEVICE!jpegenc!rtpjpegpay!udpsink 主機= $ SERVER 端口= $ PORT #$ SERVER上的客戶端:$ PORT能夠經過'gst-launch-1.0 udpsrc port = 5000查看!application / x-rtp,payload = 96!rtpjpegdepay!jpegdec!autovideosink'
- 編碼爲H264(基於硬件的編碼)並經過RTP / UDP進行流傳輸:
#流H264 / RTP / UDP gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video10convert output-io-mode = dmabuf-import!\ v4l2h264enc output-io-mode = dmabuf-import!\ rtph264pay!udpsink 主機= $ SERVER 端口= $ PORT #$ SERVER上的客戶端:$ PORT能夠經過'gst-launch-1.0 udpsrc port = 5001 caps = application / x-rtp,payload = 96查看!rtph264depay!解碼器!autovideosink'
流
- 「GST-cariable-RTSP服務器」是使用流媒體視頻推薦的方法,你能夠從咱們的下載PPA。
add-apt-repository ppa:gateworks-軟件/軟件包 apt-get安裝gst-gateworks-apps
- 使用如下命令安裝此測試:
#on SBC gst-variable-rtsp-server -p 9001 -u 「 videotestsrc!jpegenc!rtpjpegpayname = pay0 pt = 96」#在 此示例中,使用測試源,該源能夠是任何源。也可使用其餘編碼方法。
#on工做站 gst-launch-1.0 rtspsrc 位置= rtsp://192.168.1.1:9001 / stream 延遲= 10!解碼器!自動視頻接收器
- 注意:gst-variable-rtsp-server啓動時將顯示IP 127.0.0.1,該IP被硬編碼到程序中的print語句中,而且徹底是任意的-忽略它。
轉換
GStreamer video4linux2
插件提供了一個元素,該元素使用此驅動程序將這些功能公開給GStreamer應用程序。
筆記:
- 對於GStreamer-1.14,元素的名稱取決於驅動程序向內核註冊的視頻設備(即,若是mem2mem驅動程序註冊了/ dev / video8,則v4l2video8convert)
- 對於GStreamer主設備(正在開發中),元素的名稱始終爲「 v4l2videoconvert」
kmssink
下面的示例須要一個can-scale=false
屬性來告訴GStreamer不要經過KMS驅動程序進行縮放(由於IMX6 KMS驅動程序不支持縮放)- 確保輸入格式與輸出格式不一樣,不然GStreamer將徹底繞過轉換;請注意,GStreamer沒法將翻轉或旋轉理解爲格式的一部分。Gstreamer主設備(正在開發中)向v4l2videoconvert實體添加了「禁用直通」屬性,該屬性能夠設置爲強制進行轉換,而與輸入和輸出格式無關
- 使用imx實體(即捕獲,編碼/解碼,mem2mem,顯示)時,您能夠指定「 output-io-mode = dmabuf-import」以共享零拷貝管道的dmabuf指針,可是若是使用非imx實體(即videotestsrc)您必須忽略這些,由於您不能確保緩衝區共享共享dmabuf指針所需的對齊方式/跨度
例子:
- 確保mem2mem在您的內核中:
〜#dmesg | grep mem2mem [ 18 .356023 ] imx-media:將ipu_ic_pp mem2mem註冊爲/ dev / video8
- 確保GStreamer元素存在:
〜#gst-inspect-1.0 | grep -e 「 v4l2。* convert」 video4linux2:v4l2video8轉換:V4L2視頻轉換器
- 請注意,對於GStreamer-1.14,該元素的名稱取決於驅動程序向內核註冊的視頻設備(上例中爲video8)。這會在GStreamer-1.16中更改成始終爲「 v4l2videoconvert」
- 縮放/旋轉/翻轉使用
videotestsrc
(不能使用dmabufs,由於它是非imx實體)#高檔 gst-launch-1.0 videotestsrc!video / x-raw,寬度= 320,高度= 240!\ v4l2video8convert!\ video / x-raw,寬度= 640,高度= 480!kmssink can-scale = false #縮減 gst-launch-1.0 videotestsrc!video / x-raw,寬度= 640,高度= 480!\ v4l2video8convert!\ video / x-raw,寬度= 320,高度= 240!kmssink能夠大規模= 假 #旋轉 gst-launch-1.0 videotestsrc!video / x-raw,寬度= 320,高度= 240!\ v4l2video8convert extra-controls = cid,rotate = 90!\ video / x-raw,寬度= 240,高度= 320!kmssink can-scale = false #hflip gst-launch-1.0 videotestsrc!video / x-raw,寬度= 320,高度= 240!\ v4l2video8convert extra-controls = cid,horizontal_flip = 1!\ video / x-raw,寬度= 640,高度= 480!kmssink can-scale = false #vflip gst-launch-1.0 videotestsrc!video / x-raw,寬度= 320,高度= 240!\ v4l2video8convert extra-controls = cid,vertical_flip = 1!\ video / x-raw,寬度= 640,高度= 480!kmssink能夠大規模= 假
- 請注意,上面的示例會強制輸入格式(在這種狀況下爲分辨率)不一樣於輸出格式,不然gstreamer會認爲v沒必要要的是v4l2convert實體,由於gstreamer不瞭解翻轉/旋轉屬性。GStreamer主機(正在開發中)添加了「 disable-passthrough」屬性,能夠啓用該屬性來強制禁用passthrough
- 使用imx-media捕獲設備和KMS顯示驅動程序縮放/旋轉/翻轉(可使用dmabufs,由於它們都是imx硬件實體):
#比例傳感器輸入到720p顯示屏 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import!\ video / x-raw,寬度= 1280,高度= 720!\ kmssink can-scale = false #比例傳感器輸入到1080p顯示屏 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import!\ video / x-raw,width = 1920,height= 1080!\ kmssink can-scale = false #縮放/翻轉 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,horizontal_flip = 1!\ video / x-raw,寬度= 1920,高度= 1080!\ kmssink can-scale = false #縮放/旋轉 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,rotate = 90!\ video / x-raw,寬度= 720,高度= 1280!\ kmssink能夠大規模= 假
- 使用imx媒體捕獲設備mem2mem設備和coda設備捕獲,縮放,旋轉,翻轉和編碼(可使用dmabufs進行零複製)
#編碼 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import!\ v4l2h264enc output-io-mode = dmabuf-import!\ rtph264pay!udpsink host = $ SERVER 端口= $ PORT #縮放/編碼 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import!\ video / x-raw,width = 1440,height =960!\ v4l2h264enc output-io-mode = dmabuf-import!\ rtph264pay!udpsink host = $ SERVER 端口= $ PORT #scale / flip / encode gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,horizontal_flip = 1!\ video / x-raw,寬度= 1440,高度= 960!\ v4l2h264enc output-io-mode =dmabuf-import!\ rtph264pay!udpsink host = $ SERVER 端口= $ PORT #縮放/旋轉/編碼 gst-launch-1.0 v4l2src 設備= $ DEVICE!\ v4l2video8convert output-io-mode = dmabuf-import extra-controls = cid,rotate = 90!\ video / x-raw,寬度= 1440,高度= 960!\ v4l2h264enc output-io-mode = dmabuf-import!\ rtph264pay!udpsink 主機=$ SERVER 端口= $ PORT
EDID
HDMI源要求HDMI接收器(即監視器/捕獲設備)提供EDID,以瞭解容許的格式。這是在v4l2捕獲設備(例如tda1997x)上完成的,方法是在捕獲設備的子設備上使用'v4l2-ctl --set-edid'。而後,捕獲設備會將其提供給HDMI源(它擺動其HPD線,至關於熱插拔),而後HDMI源將向接收器(捕獲設備)提供兼容的內容,而後您能夠進行查詢。您能夠提供原始的EDID二進制文件,也能夠提供一種類型,它將致使內核從中自動生成兼容的EDID。
例子:
- 顯示設置edid的選項:
v4l2-ctl --help-edid
- 經過描述向tda1997x提供EDID:
v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 ) -- set -edid = 類型= hdmi
- 經過二進制文件提供EDID
v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 ) -- set -edid = file = edid.hex #hex v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 ) -- set -edid = file = edid.bin,format = raw #二進制
- 清除EDID:
v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 )-- clear-edid
- 急躁
#以十六進制格式顯示它 v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 ) -- get -edid = format = hex #將其保存到文件 v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 ) -- get -edid pad = 0,file = edid.hex,format = hex #hex v4l2-ctl -d $( media-ctl -e 「 tda19971 2-0048」 ) - get-edid 文件= edid.bin,格式=原始#二進制
筆記:
- 上面的命令沒有提供可選的'pad'參數,由於它默認爲pad 0,這是tda1997x的惟一pad