OpenHarmony 5.0 mpegts封装的H265视频播放失败的解决方案
问题现象 OpenHarmony 5.0版本使用AVPlayer播放mpegts封装格式的H.265(HEVC)编码格式的视频时出现报错导致播放失败 问题原因 OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎,因为 libav_codec_hevc_parser.z.so 动态库未开源导致H265编码格式视频解析不到正确的宽高,硬件解码器框架层初始化时因为分辨率
问题现象
OpenHarmony 5.0版本使用AVPlayer播放mpegts封装格式的H.265(HEVC)编码格式的视频时出现报错导致播放失败
问题原因
OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎,因为 libav_codec_hevc_parser.z.so 动态库未开源导致H265编码格式视频解析不到正确的宽高,硬件解码器框架层初始化时因为分辨率不合理导致报错
解决方案
版本信息
OpenHarmony-v5.0.1-Release 和 OpenHarmony-v5.0.2-Release 标准系统
方案一:设置默认的分辨率
修改 foundation/multimedia/av_codec/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp 文件,"+"符号为新增的代码
void FFmpegFormatHelper::ParseVideoTrackInfo(const AVStream& avStream, Meta &format,
const AVFormatContext& avFormatContext)
{
format.Set<Tag::VIDEO_WIDTH>(static_cast<uint32_t>(avStream.codecpar->width));
format.Set<Tag::VIDEO_HEIGHT>(static_cast<uint32_t>(avStream.codecpar->height));
format.Set<Tag::VIDEO_DELAY>(static_cast<uint32_t>(avStream.codecpar->video_delay));
+ if ((avStream.codecpar->width <=0 || avStream.codecpar->height <=0) && (avStream.codecpar->codec_id == AV_CODEC_ID_HEVC)) {
+ format.Set<Tag::VIDEO_WIDTH>(1920);
+ format.Set<Tag::VIDEO_HEIGHT>(1080);
+ }
double frameRate = 0;
...
}
如果demuxer未解析到H265视频的分辨率,设置默认值用于初始化解码器,分辨率的默认值需要在codec hcs配置文件的分辨率范围内(minWidth和maxWidth,minHeight和maxHeight之间)
方案二:打开ffmpeg hevc软解用于解析分辨率
1、third_party/ffmpeg/BUILD.gn 新增h265 parser和decoder源文件编译
ohos_source_set("ffmpeg_dynamic") {
source = [
...
"//third_party/ffmpeg/libavcodec/dovi_rpu.c",
"//third_party/ffmpeg/libavcodec/dynamic_hdr10_plus.c",
"//third_party/ffmpeg/libavcodec/dynamic_hdr_vivid.c",
"//third_party/ffmpeg/libavcodec/hevc_cabac.c",
"//third_party/ffmpeg/libavcodec/hevc_data.c",
"//third_party/ffmpeg/libavcodec/hevc_filter.c",
"//third_party/ffmpeg/libavcodec/hevc_mvs.c",
"//third_party/ffmpeg/libavcodec/hevc_parse.c",
"//third_party/ffmpeg/libavcodec/hevc_parser.c",
"//third_party/ffmpeg/libavcodec/hevc_ps.c",
"//third_party/ffmpeg/libavcodec/hevc_refs.c",
"//third_party/ffmpeg/libavcodec/hevc_sei.c",
"//third_party/ffmpeg/libavcodec/hevcdec.c",
"//third_party/ffmpeg/libavcodec/hevcdsp.c",
"//third_party/ffmpeg/libavcodec/hevcpred.c",
"//third_party/ffmpeg/libavutil/hdr_dynamic_vivid_metadata.c",
]
...
}
注意:如果是64位平台,还需要添加//third_party/ffmpeg/libavcodec/aarch64 目录下的部分文件,
另外可能需要修改libavcodec/hevcdec.c的部分代码以通过编译
2、third_party/ffmpeg/ohos_config.sh 新增h265 parser和decoder配置
修改1有两处
- "--enable-parser=h263,h264,mpeg4video,vp8,vp9,mpegvideo"
+ "--enable-parser=h263,h264,mpeg4video,vp8,vp9,mpegvideo,hevc"
修改2有两处
- "--enable-decoder=h263,h264,mpeg2video,mpeg4,vp8,vp9"
+ "--enable-decoder=h263,h264,mpeg2video,mpeg4,vp8,vp9,hevc"
结语
修改后验证播放mpegts封装的H.265格式的视频走硬件解码可以正常播放。
下一篇文章更新mp4封装的H265视频播放失败的解决方案。
更多推荐
所有评论(0)