HarmonyOS 视频编解码出现花屏

编码出问题了,输入的yuv i420 正常 , 编码输出的h264花屏 ,编码器没有任何报错,必现目前我们只有i420,纹理你们也不支持。

HarmonyOS
2024-11-13 10:57:44
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

​获取跨距,然后按行拷贝。

1.获取跨距。

API 12 新增以下方式获取跨距:​

// 解码场景,收到输出 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 
}
分享
微博
QQ
微信
回复
2024-11-13 16:09:22
相关问题
HarmonyOS视频编解码-音频渲染
264浏览 • 1回复 待解决
HarmonyOS CBOR编解码问题
381浏览 • 1回复 待解决
HarmonyOS编解码接口标准
384浏览 • 1回复 待解决
如何实现字符串编解码
2655浏览 • 1回复 待解决
图片编解码能力支持哪些格式
1900浏览 • 1回复 待解决
图片编解码支持的格式有哪些
1662浏览 • 1回复 待解决
HarmonyOS视频解码问题
680浏览 • 1回复 待解决
ArkTS如何实现字符串编解码
2799浏览 • 1回复 待解决
HarmonyOS hevc格式视频解码
232浏览 • 1回复 待解决
编解码播放大数据量流问题
3175浏览 • 0回复 待解决
如何进行编解码操作,有人知道吗?
333浏览 • 1回复 待解决
中文字符串的编解码,有人知道吗?
646浏览 • 1回复 待解决
视频解码结果通过到vulkan渲染
1715浏览 • 1回复 待解决
求鸿蒙视频编码解码的具体demo
6512浏览 • 1回复 待解决