问题现象

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视频播放失败的解决方案。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐