OpenHarmony3.1 H264视频播放之路 原创
作者:润和软件 张汉孟
一、背景
在当前全民直播时代,我们每天刷着五花八门的抖音短视频,看着各式各样电视剧、电影以及随时映入眼帘的各类视频广告等等,每天有无数的视频文件被生成、播放。我们的眼球被花里胡哨的视频疯狂的冲击,或无脑搞笑、或夸张讽刺、或鸡汤淋头、或无效科普等等,与此同时我们是否也可以想一想这些个撩人的视频是怎么在我们眼前设备播放出来的??播放一个视频文件对于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
::: hljs-center
附录:
:::
<1> OH标准系统media组件介绍
https://gitee.com/openharmony/multimedia_media_standard
<2> MP4封装格式介绍:
https://wenku.baidu.com/view/b4f52a376ddb6f1aff00bed5b9f3f90f76c64dbd.html
<3> gst介绍:
https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-language=c
https://blog.csdn.net/qq_45662588/article/details/120763198
<4> OH 3.1release 版本路书:
https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v3.1-release.md
<5> OH媒体子系统框架介绍:
https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/媒体子系统.md
<6> OH视频播放应用开发指导:
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/video-playback.md
您好,您的截图里没有看到video相关的sink,我这边播放mp4的时候,qtdumex也报错了。您可以提供一下完整的log吗?
2080883448@qq.com。如果可以,麻烦您发一下log,我这边参考一下。
你的qtdemux 具体报什么错呢
学习中、、、、、、、、、、
demux链接错误。gst-inspect 的时候明明有demux插件,但是gst-luanch的时候解复用就报错了。提示没有qtdemux。
感觉应该是sink的问题,这个pipeline是可以的:
gst-launch --gst-plugin-path=/system/lib/media/plugins filesrc location="/data/media/h264.mp4" ! qtdemux ! h264parse ! decodebin
您好,您这边的gst-launch和gst-inspect的版本号是哪个呀?
OpenHarmony 3.1 Release自带的,对应的应该是gst-launch-1.0
输入这个指令后貌似还是一样的错误。
会不会跟源有关系。我的是video(1920*1080)audio(aac)的。您那边的源是什么样的呢?