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

相关推荐
Ghost Face...6 小时前
Linux音频控制神器:amixer完全指南
linux·chrome·音视频
八月的雨季 最後的冰吻6 小时前
FFmepg--28- 滤镜处理 YUV 视频帧:实现上下镜像效果
ffmpeg·音视频
aqi008 小时前
FFmpeg开发笔记(九十二)基于Kotlin的开源Android推流器StreamPack
android·ffmpeg·kotlin·音视频·直播·流媒体
Together_CZ9 小时前
Cambrian-S: Towards Spatial Supersensing in Video——迈向视频中的空间超感知
人工智能·机器学习·音视频·spatial·cambrian-s·迈向视频中的空间超感知·supersensing
Android系统攻城狮9 小时前
Android16音频之设置音频属性AudioTrack.Builder().setAudioAttributes:用法实例(一百一十九)
音视频·android16·音频进阶
空影星9 小时前
轻量日记神器RedNotebook,高效记录每一天
python·数据挖掘·数据分析·音视频
Black蜡笔小新9 小时前
视频汇聚平台EasyCVR赋能石油管道计量站精准监控与安全管理
安全·音视频
马剑威(威哥爱编程)19 小时前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
万能的小裴同学1 天前
Android M3U8视频播放器
android·音视频
音视频牛哥1 天前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能