一、背景
在當前全民直播時代,我們每天刷著五花八門的抖音短視頻,看著各式各樣電視劇、電影以及隨時映入眼簾的各類視頻廣告等等,每天有無數的視頻文件被生成、播放。我們的眼球被花里胡哨的視頻瘋狂的沖擊,或無腦搞笑、或夸張諷刺、或雞湯淋頭、或無效科普等等,與此同時我們是否也可以想一想這些個撩人的視頻是怎么在我們眼前設備播放出來的??播放一個視頻文件對于OpenHarmony 3.1(以下簡稱OH)來說自然不在話下,這篇文章將告訴你一個視頻文件(本文以MP4封裝格式、H264壓縮格式的的視頻文件為例)是怎么在OH的設備上播放出來的。
二、OpenHarmony3.1媒體能力全景
OH技術架構如下圖所示,完成視頻文件播放功能的是多媒體子系統。
多媒體子系統框架如下圖所示:
OH拉起了一個叫mediaserver的服務來處理媒體事務,并且封裝了接口層包括JS接口、native接口提供給APP調用,mediaserver的核心則是引入了gstreamer(以下簡稱gst)框架來完成媒體功能。gstreamer是一套功能強大、兼容性好、結構清晰的開源媒體框架,這里不做贅述,后面有專文解析。OH也在gst的基礎上開發了player engine來實現播放,同時也利用的gst豐富的插件資源實現幾乎所有的媒體功能,當前已移植進來的開源插件包括file source、demuxer、video decoder、libav插件等等,當然也包括OH自研的video sink、memsink、Codec hdi插件等等。
三、H264視頻播放道路
大象裝進冰箱分幾步,我們來看視頻播放流程:
播放一個視頻大致分為4步:
解協議->解封裝->解壓縮->送顯
播放pipeline
根據視頻播放的步驟,我們在OH上每一個環節都能找到對應的插件來完成:
1、對于一個本地視頻文件(比如uri=file:///data/h264-640x480.mp4),對應的filesrc插件來完成文件的解析,拿到MP4文件流;
2、拿到MP4文件流后,對應的qtdemux插件來解封裝,完成音視頻分流,輸出H264裸碼流和音頻流;
3、拿到H264碼流后,h264parse插件開始切片,輸出H264幀數據;
4、處理H264幀數據,就由avdec_h264插件來完成,一般情況會輸出NV12的像素數據,當然這個解碼器是基于ffmpeg的軟解插件,相信不久各個芯片廠商的硬件加速解碼器都會加進來;
5、至此解碼的工作已經完成,后面就要根據顯示的像素格式、size來對解碼輸出數據進行后處理(轉換、縮放、裁剪等),會有Converter、Scaler、Clip插件來完成;
6、滿足顯示要求后就會使用suRFacesink插件完成送顯。
再加上audio的插件解碼出音頻數據,OH的player會完成音視頻同步,至此一個視頻文件就會播放顯示在屏幕上。
在OH為了更好的用戶體驗,同時也引入了一些解決性能問題的插件,比如multiqueue插件來實現buffer隊列,也使用decodebin高級插件來完成解碼element的選擇。
最終我們可以梳理出來一條播放的pipeline:
通過播放OH自帶的圖庫播放本地H264視頻,抓取log,搜索OnElementSetuPCB關鍵字也可以得到播放的pipeline,也進一步驗證了本文的分析。
我們也可以使用gst-launch手動創建pipeline來驗證:
gst-launch --gst-plugin-path=/system/lib/media/plugins filesrc location=/data/media/h264.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! videoscale ! video/x-raw,width=640,height=480 ! surfacememsink
審核編輯 :李倩
-
視頻
+關注
關注
6文章
1947瀏覽量
72950 -
開源
+關注
關注
3文章
3363瀏覽量
42545 -
OpenHarmony
+關注
關注
25文章
3725瀏覽量
16375 -
潤和軟件
+關注
關注
1文章
272瀏覽量
883
原文標題:OpenHarmony 3.1 H264 視頻播放之路
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論