本文将基于 OpenHarmony 3.2 Beta1 版本的媒体能力,为你详细解读一个视频文件(本文以 MP4 封装格式、H264 压缩格式的视频文件为例)是怎么在基于 OpenHarmony 标准系统的设备上播放出来的。同时也带你一窥“播放一个视频文件”这件对 OpenHarmony 3.2 Beta1 版本系统能力很轻松的事,是由多少服务层、功能接口、工具、插件、命令行及代码等共同协作完成的。
OpenHarmony 3.2媒体能力全景
OpenHarmony 技术架构如下图所示,完成视频文件播放功能的是多媒体子系统。
下图所示为多媒体子系统框架图
如图所示,OpenHarmony 多媒体子系统拉起了一个叫 mediaserver 的服务来处理媒体事务,并且封装了接口层包括JS接口、native 接口提供给 APP 调用,mediaserver 的核心则是引入了 gstreamer(以下简称 gst)框架来完成媒体功能(注:gstreamer 是一套功能强大、兼容性好、结构清晰的开源媒体框架,这里不做赘述,后面有专文解析)。OpenHarmony 也在 gst 的基础上开发了 player engine 来实现播放,同时也利用 gst 丰富的插件资源实现几乎所有的媒体功能。截至目前,已移植进来的开源插件包括 file source、demuxer、video decoder、libav 插件等,当然也包括 OpenHarmony 自研的 video sink、memsink、codec hdi 插件等。
H264视频播放
视频播放流程图如下:
如图所示,播放一个视频大致分为 4 步:
解协议->解封装->解压缩->送显
播放pipeline
根据视频播放的步骤,我们在 OpenHarmony 上每一个环节都能找到对应的插件来完成,同时参考 media_standard 代码仓的代码目录,相关的代码都可以找到对应的实现逻辑。
1、对于一个本地视频文件(比如/data/h264-640x480.mp4),对应的 filesrc 插件来完成文件的解析,拿到MP4文件流;
OpenHarmony 处理本地视频文件 URI 的 SetSource 逻辑代码如下:
int32_t PlayerEngineGstImpl::SetSource(const std::string &url)
{
std::unique_lock<std::mutex> lock(mutex_);
CHECK_AND_
return_RET_LOG(!url.empty(), MSERR_INVALID_VAL, "input url is empty!");
CHECK_AND_RETURN_RET_LOG(url.length() <= MAX_URI_SIZE, MSERR_INVALID_VAL, "input url length is invalid!");
std::string realUriPath;
int32_t ret = MSERR_OK;
if (IsFileUrl(url)) {
ret = GetRealPath(url, realUriPath);
if (ret != MSERR_OK) {
return ret;
}
url_ = "file://" + realUriPath;
} else {
url_ = url;
}
MEDIA_LOGD("set player source: %{public}s", url_.c_str());
return ret;
}
......
更多详细内容请下载附件查看