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

embedded/2025/3/16 11:04:54/

问题现象

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配置,修改有两处

-    "--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 修改有四处

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


http://www.ppmy.cn/embedded/173045.html

相关文章

CVPR-2025 | 长程视觉语言导航平台与数据集:迈向复杂环境中的智能机器人

作者&#xff1a;Xinshuai Song, Weixing Chen, Yang Liu, Weikai Chen, Guanbin Li, Liang Lin 单位&#xff1a;中山大学&#xff0c;Independent Researcher&#xff0c;鹏城实验室 项目主页&#xff1a;https://hcplab-sysu.github.io/LH-VLN 论文地址&#xff1a;https…

2025-3-13 leetcode刷题情况(贪心算法--区间问题)

一、763.划分字母区间 1.题目描述 2.代码 3.思路 统计每一个字符最后出现的位置从头遍历字符&#xff0c;并更新字符的最远出现下标&#xff0c;如果找到字符最远出现位置下标和当前下标相等了&#xff0c;则找到了分割点 二、56.合并区间 1.题目描述 2.代码 3.思路 先排序…

【数据结构】线性表简介

0.本篇问题 线性表&#xff0c;顺序表&#xff0c;链表什么关系&#xff1f;它们是逻辑结构还是存储结构&#xff1f;线性表的基本操作有哪些&#xff1f; 线性表是具有相同数据元素的有限序列。 表中元素有先后次序&#xff0c;每个元素占有相同大小的存储空间。 一、线性…

【技术支持】记一次mac电脑换行符差异问题

起因&#xff1a;将excel中的数据复制到sqlitestudio中时&#xff0c;没有按单元格分割&#xff0c;而是在一个单元格 原因&#xff1a;换行符惹的祸 使用pbpaste | xxd查看剪切板中的字符十六进制显示 ~ % pbpaste | xxd 00000000: 3838 0a39 390a 3737 0a36 36 …

基于Python的天气预报数据可视化分析系统-Flask+html

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 可视化界面 天气地图 天气分析 历史天气 用户管理 摘要 本文介绍了基于大数据…

k8s 修改节点驱逐阈值

编辑 /var/lib/kubelet/config.yaml 文件 kind: KubeletConfiguration evictionHard:nodefs.available: "5%" # 降低磁盘压力触发阈值imagefs.available: "10%" # 调整容器镜像存储触发阈值nodefs.inodesFree: "3%

【病毒分析】熊猫烧香病毒分析及其查杀修复

目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …

MySQL复习(检查本地MySQL是否安装、DataGrip数据库可视化工具使用、增删改查基础语法、唯一索引、SQL简单函数)

目录 一、快速检查本地MySQL是否安装。(详细教程) &#xff08;1&#xff09;MySQL本地系统环境变量配置。(简单说明) &#xff08;2&#xff09;cmd命令行——判断MySQL是否安装成功&#xff01; 二、DataGrip数据库操作可视化工具。 &#xff08;1&#xff09;基本介绍。 &am…