HarmonyOS 硬件编码场景无法正常编码1080\*1920分辨率的YUV数据?

现在开发基于HarmonyOS的硬件编解码模块,在使用YUV格式数据编码成H264格式数据是,发现1920_1080分辨的可以硬编成功,但是1080_1920分辨率无法硬编成功。请确认HarmonyOS硬件编码能否支持1080*1920分辨率?

阅读 471
1 个回答

做视频解码需要考虑跨距的情况,从现象上看是没做相应的跨距处理。

可以参考此链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/video-decoding-V5

以下也可以作为参考:获取跨距,然后按行拷贝。

1、获取跨距。

// 解码场景,收到输出 Buffer 后
OH_AVFormat *format = OH_VideoDecoder_GetOutputDescription(decoder);
int widthStride = 0;
int32_t heightStride = 0;
bool ret = OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_STRIDE, widthStride);
if (ret) {
  // Error
}
bool ret = OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_SLICE_HEIGHT, heightStride);
if (ret) {
  // Error
}
OH_AVFormat_Destroy(format);
// 编码场景,收到输入 Buffer 后
OH_AVFormat *format = OH_VideoEncoder_GetInputDescription(encoder);
int widthStride = 0;
bool ret = OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_STRIDE, widthStride);
if (ret) {
  // Error
}
OH_AVFormat_Destroy(format);

2.按行拷贝。

int32_t ReadYUV420P(std::shared_ptr<VideoEncSignal> &signal, uint8_t *addr, int32_t width, int32_t height,
int32_t stride)
{
  if (width == 0) {
    return 0;
  }
  int32_t pixelSize = int32_t(stride / width);
  width *= pixelSize;
  // Y
  for (int32_t i = 0; i < height; ++i) {
  signal->inFile_->read(reinterpret_cast<char *>(addr), width);
  addr += stride;
}
  width >>= 1;
  stride >>= 1;
  // UV
  for (int32_t i = 0; i < height; ++i) {
  signal->inFile_->read(reinterpret_cast<char *>(addr), width);
  addr += stride;
}
  return stride * height * 3 / 2; // 3: nom, 2: denom
}

yuv420P,U和V得分别拷贝。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进