OpenHarmony 5.0 MP4封装的H265视频播放失败的解决方案

问题现象

OpenHarmony 5.0版本使用AVPlayer播放MP4封装格式的H.265(HEVC)编码格式的视频时解码失败导致播放失败

问题原因

OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎,因为 libav_codec_hevc_parser.z.so 动态库未开源导致从MP4封装中分离的HVCC格式的H265数据不能转换成AnnexB(有起始码)格式,因为一般硬件解码器只支持AnnexB格式的H265数据,导致解码失败

解决方案

版本信息

OpenHarmony-v5.0.1-Release 和 OpenHarmony-v5.0.2-Release 标准系统

使用ffmpeg自带的filter转换

代码行最前面"+"符号为新增的代码,"-"符号为删除的代码,"..."为省略的无需修改的源码

1、third_party/ffmpeg/ohos_config.sh 新增hevc_mp4toannexb bsf配置,修改有两处

javascript 复制代码
-    "--enable-bsf=h264_mp4toannexb" 
+    "--enable-bsf=h264_mp4toannexb,hevc_mp4toannexb"

2、foundation/multimedia/av_codec/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_demuxer_plugin.cpp 修改有四处

javascript 复制代码
static const std::map<AVCodecID, std::string> g_bitstreamFilterMap = {
    { AV_CODEC_ID_H264, "h264_mp4toannexb" },
+   { AV_CODEC_ID_HEVC, "hevc_mp4toannexb" },
};


Status FFmpegDemuxerPlugin::ConvertPacketToAnnexb(std::shared_ptr<AVBuffer> sample, AVPacket* srcAVPacket,
    std::shared_ptr<SamplePacket> dstSamplePacket)
{
   ...
 -   } else if (codecId == AV_CODEC_ID_H264 && avbsfContext_ != nullptr) {
 +   } else if ((codecId == AV_CODEC_ID_H264 || codecId == AV_CODEC_ID_HEVC) && avbsfContext_ != nullptr) {
         ret = ConvertAvcToAnnexb(*srcAVPacket);
 -       SetDropTag(*srcAVPacket, sample, AV_CODEC_ID_H264);
 +       SetDropTag(*srcAVPacket, sample, codecId);
     }
     ...
}


void FFmpegDemuxerPlugin::ConvertCsdToAnnexb(const AVStream& avStream, Meta &format)
{
    ...
-   } else if (avStream.codecpar->codec_id == AV_CODEC_ID_H264 && avbsfContext_ != nullptr) {
+   } else if ((avStream.codecpar->codec_id == AV_CODEC_ID_H264 || avStream.codecpar->codec_id == AV_CODEC_ID_HEVC) && avbsfContext_ != nullptr) {
        if (avbsfContext_->par_out->extradata != nullptr && avbsfContext_->par_out->extradata_size > 0) {
            extradata = avbsfContext_->par_out->extradata;
            extradataSize = avbsfContext_->par_out->extradata_size;
        }
    }
    ...
}

结语

修改后验证播放MP4封装的H.265格式的视频硬件解码可以正常播放。目前不支持H265软解,只能适配CODEC HDI OMX硬解。

相关推荐
换个昵称都难9 小时前
webrtc 音频模块FEC模块
网络·音视频·webrtc
qq_3665665010 小时前
视频配音自动化Pipeline:TTS选型+音色克隆+批量处理(附完整代码)
自动化·新媒体运营·音视频·音频
hz5678915 小时前
公安局远程办案用什么音视频系统?安全取证与多方协同方案
安全·架构·云计算·音视频·实时音视频·信息与通信
Championship.23.2415 小时前
Linux 3.0 音频机制深度解析:ALSA基础架构与传统音频驱动模型
linux·运维·音视频·alsa
VOOHU-沃虎15 小时前
PoE+音频一体化接口设计:从电源变压器到XLR卡侬座的完整链路
音视频
“码”力全开17 小时前
解密企业级智能视频中台:基于 Docker 与边缘计算的 GB28181/RTSP 异构架构设计(支持源码交付)
docker·音视频·边缘计算
潜创微科技17 小时前
QCW5007+QCW5004 | HDMI 1.3 无线投屏芯片方案空旷 150 米支持穿墙传输
音视频
MemoriKu18 小时前
Flutter 相册 APP 视频模态稳定化实战:从视频抽帧、Embedding 元数据到 Android 真机启动修复
android·开发语言·前端·flutter·架构·音视频·embedding
EasyDSS18 小时前
视频直播点播/高清点播/音视频点播/云点播/云直播EasyDSS一站式音视频平台助力智慧校园智能化建设
音视频
johnny23319 小时前
视频创作工具:OpenCut、HyperFrames、social-auto-upload、OpenStoryline、ArcReel
音视频