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

相关推荐
2601_9616813021 小时前
河南AI短视频哪个好
音视频
WA内核拾荒者21 小时前
WhatsApp 富媒体消息(图片/视频)的发送优化与压缩策略
php·音视频·媒体
1 天前
使用ffmpeg将mp4视频转为m3u8格式
android·ffmpeg·音视频
音视频牛哥1 天前
WebRTC 能解决低延迟直播吗?为什么 RTSP、RTMP、GB28181 仍然不可替代?
音视频·webrtc·低延迟rtsp播放器·音视频sdk·smartmediakit·低延迟rtmp播放器·低延迟音视频
阿童木写作1 天前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
DogDaoDao2 天前
DeepQTMT: 深度学习加速VVC帧内编码CU划分 —— 论文深度解读与源码拆解
人工智能·深度学习·视频编解码·h266·vvc·帧内预测·deepqtmt
奈斯先生Vector2 天前
把 Midjourney 二次编辑做成生产系统:customId 能力令牌、Action Graph 与 WebUI 精修工作台
数据库·人工智能·架构·aigc·音视频·midjourney
林澈在路上2 天前
2026 主流 AI 写歌 APP 全面测评|零基础原创歌曲工具选购指南
大数据·人工智能·aigc·音视频·音频
气泡音人声分离2 天前
为什么 MP3 转 FLAC 不能变成无损?音频转码里的信息损失原理
音视频·音频剪辑·音频格式转换
一个有点技术的程序猿2 天前
局域网中视频采集,颜色空间转换,编码,网络发送,接收,解码,渲染全链路卡顿分析
网络·音视频·视频编解码