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硬解。

相关推荐
karmueo464 小时前
视频序列和射频信号多模态融合算法Fusion-Vital解读
算法·音视频·多模态
昨日之日20064 小时前
Video Background Remover V3版 - AI视频一键抠像/视频换背景 支持50系显卡 一键整合包下载
人工智能·音视频
站在巨人肩膀上的码农15 小时前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
】余185381628001 天前
碰一碰发视频源码搭建与定制化开发:支持OEM
音视频
张晓~183399481211 天前
数字人分身+矩阵系统聚合+碰一碰发视频: 源码搭建-支持OEM
线性代数·矩阵·音视频
山登绝顶我为峰 3(^v^)31 天前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
却道天凉_好个秋1 天前
音视频学习(三十六):websocket协议总结
websocket·音视频
【余185381628001 天前
碰一碰发视频源码搭建定制化开发:支持OEM
音视频
EQ-雪梨蛋花汤1 天前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
菜包eo2 天前
基于二维码的视频合集高效管理与分发技术
音视频