OpenHarmony媒体引擎的发展
一、简介 本文主要介绍下OpenHarmony标准系统媒体组件系统服务层的媒体引擎的演进发展策略。 二、媒体引擎 gstreamer引擎:Gstreamer是一个跨平台、模块化的多媒体开源框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果,每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功
一、简介
本文主要介绍下OpenHarmony标准系统媒体组件系统服务层的媒体引擎的演进发展策略。
二、媒体引擎
gstreamer引擎:Gstreamer是一个跨平台、模块化的多媒体开源框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果,每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。
histreamer引擎:HiStreamer是一个官方自研的轻量级的媒体引擎组件,提供播放、录制等场景的媒体数据流水线处理能力。特性:轻量,使用较少的系统资源(线程、内存),可支持音视频播放/录制,支持pipeline灵活拼装,支持插件化扩展source/demuxer/codec。
OpenHarmony标准系统随着版本的更新逐步从gstreamer引擎切换到histreamer引擎。
三、版本状态
1、v3.x-Release 和 v4.0-Release 版本
只使用gstreamer引擎,媒体管道的运行使用了大部分gstreamer官方自带的插件,自研了部分依赖平台特性的插件,如音视频录制源插件、视频硬件编解码插件、音视频播放显示插件等。
2、v4.1-Release 版本
两种媒体引擎共存,大部分场景下使用gstreamer引擎,少部分特定场景才会切换到histreamer引擎,可设置系统属性强制切换媒体引擎。
选择逻辑代码位于foundation/multimedia/player_framework/services//utils/media_utils.cpp
const std::unordered_set<std::string> HST_ENABLE_BUNDLE_LIST = {
"com.huawei.hmsapp.music",
"com.huawei.hmsapp.himovie",
"com.huawei.hmos.photos",
"com.ohos.medialibrary.medialibrarydata",
"com.huawei.ohos.screenrecorder",
"com.huawei.hmos.soundrecorder",
"com.huawei.hmos.camera",
"com.huawei.hmos.meetimeservice",
"com.huawei.hmos.filemanager",
"com.huawei.hmos.hipreview",
"com.huawei.hmos.callrecorder",
"com.sina.news.hm.next",
"com.babybus.babybusoh",
"com.example.sampledemo",
};
} // namespace
bool __attribute__((visibility("default"))) IsEnableHiStreamer(const std::string& clientBundleName, const int32_t& uid)
{
char useHistreamer[10] = {0}; // 10 for system parameter usage
auto res = GetParameter("debug.media_service.histreamer", "0", useHistreamer, sizeof(useHistreamer));
bool enableHiStreamerBySwitch = (res == 1 && useHistreamer[0] == '1');
bool enableHiStreamerByBundleList = (HST_ENABLE_BUNDLE_LIST.count(clientBundleName) > 0);
char useGstreamerForBundle[10] = {0}; // 10 for system parameter usage
auto result = GetParameter("debug.media_service.gstreamer_bundle", "0", useGstreamerForBundle,
sizeof(useGstreamerForBundle));
bool enableGstreamerForBundle = (result == 1 && useGstreamerForBundle[0] == '1');
// Bootanimation should use HiStreamer engine.
if (uid == 1003) { // 1003 is bootanimation uid
MEDIA_LOG_I("bootanimation enforce histreamer");
enableHiStreamerByBundleList = true;
}
// XTS case should use HiStreamer engine.
if (clientBundleName.find("ohos.acts.multimedia") != std::string::npos) {
MEDIA_LOG_I("XTS case enforce histreamer");
enableHiStreamerByBundleList = true;
}
MEDIA_LOG_I("IsEnableHiStreamer enableHiStreamerBySwitch = %{public}d, enableHiStreamerByBundleList = %{public}d, "
"enableGstreamerForBundle = %{public}d", enableHiStreamerBySwitch,
enableHiStreamerByBundleList, enableGstreamerForBundle);
#ifdef EMULATOR_ENABLED
// emulator use gst
return false;
#else
return (!enableGstreamerForBundle && enableHiStreamerByBundleList) || enableHiStreamerBySwitch;
#endif
}
分析上述代码可发现除特定的华为媒体应用、开机视频、XTS测试应用、medialibrary应用等调用媒体组件时会切换到histreamer引擎,其余场景默认走gstreamer引擎。
param set debug.media_service.histreamer 1 设置该系统属性可强制切换到histreamer引擎做测试。
3、v5.0-Release及后续版本
只使用histreamer引擎,废弃了gstreamer引擎(代码已删除)。
更多推荐
所有评论(0)