一、简介

本文主要介绍下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引擎(代码已删除)。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐