HarmonyOS鸿蒙Next中VideoDecoder解码在模拟器上启动失败,真机上返回AV_ERR_UNKNOWN

HarmonyOS鸿蒙Next中VideoDecoder解码在模拟器上启动失败,真机上返回AV_ERR_UNKNOWN

VideoDecoder解码,在模拟器上面启动失败,真机上返回AV_ERR_UNKNOWN

int HmDeCoder::initDeCoder(int width, int height, void *window){
  if(videoCodec == nullptr){
    videoCodec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_AVC);
    OH_AVFormat *format = OH_AVFormat_CreateVideoFormat(OH_AVCODEC_MIMETYPE_VIDEO_AVC, width, height);
    OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 3000000);

    OH_AVCapability *cap = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false);
    std::string codecName = OH_AVCapability_GetName(cap);
    LOGD("OH_AVCapability_GetName %{public}s", codecName.c_str());

    OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_SURFACE_FORMAT);
    int ret = OH_VideoDecoder_Configure(videoCodec, format);
    if(ret != AV_ERR_OK){
      LOGD("OH_VideoDecoder_Configure not ok %{public}d", ret);
      return ret;
    }

    OHNativeWindow *oHNativeWindow = (NativeWindow*)window;
    ret = OH_VideoDecoder_SetSurface(videoCodec, oHNativeWindow);
    if(ret != AV_ERR_OK){
      LOGD("OH_VideoDecoder_SetSurface not ok %{public}d", ret);
      return ret;
    }
    OH_AVCodecAsyncCallback *callback = new OH_AVCodecAsyncCallback();
    callback->onError = [](OH_AVCodec *codec, int32_t errorCode, void *userData) -> void {
      LOGD("onError");
    };
    callback->onNeedInputData = [](OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, void *userData) ->void{
      LOGD("onNeedInputData");
    };
    callback->onNeedOutputData = [](OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, OH_AVCodecBufferAttr *attr, void *userData) -> void {
      LOGD("onNeedOutputData");
    };
    callback->onStreamChanged = [](OH_AVCodec *codec, OH_AVFormat *format, void *userData) -> void {
      LOGD("onStreamChanged");
    };
    ret = OH_VideoDecoder_SetCallback(videoCodec, *callback, this);
    if(ret != AV_ERR_OK){
      LOGD("OH_VideoDecoder_SetCallback not ok %{public}d", ret);
      return ret;
    }
    ret = OH_VideoDecoder_Prepare(videoCodec);
    if(ret != AV_ERR_OK){
      LOGD("OH_VideoDecoder_Prepare not ok %{public}d", ret);
      return ret;
    }
    ret = OH_VideoDecoder_Start(videoCodec);
    if(ret != AV_ERR_OK){
      LOGD("OH_VideoDecoder_Start not ok %{public}d", ret);
      return ret;
    }
    LOGD("HmDeCoder::initDeCoder ok %{public}d", ret);
  }

  return 0;
}

更多关于HarmonyOS鸿蒙Next中VideoDecoder解码在模拟器上启动失败,真机上返回AV_ERR_UNKNOWN的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

1、nativewindow已经在OpenGL中使用会导致不能在解码器中使用

2、目前模拟器的解码器不能使用SetSurface来设置成surface模式,试下不使用OH_VideoDecoder_SetSurface(videoCodec, oHNativeWindow)应该可以正常启动,如果有送显需求用真机。

注:如果模拟器上使用时返回1(AV_ERR_NO_MEMORY)代表无内存,真机上没问题。

更多关于HarmonyOS鸿蒙Next中VideoDecoder解码在模拟器上启动失败,真机上返回AV_ERR_UNKNOWN的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,VideoDecoder解码在模拟器上启动失败,真机上返回AV_ERR_UNKNOWN,可能是由于以下原因:

  1. 模拟器支持不完整:模拟器可能不支持VideoDecoder的某些硬件加速功能,导致解码器无法正常启动。鸿蒙Next的模拟器可能尚未完全适配VideoDecoder的某些特性。

  2. 编码格式问题VideoDecoder可能不支持模拟器或真机上的某些视频编码格式。检查视频文件的编码格式是否符合VideoDecoder支持的格式。

  3. 权限问题:在模拟器或真机上,可能缺少必要的权限。检查是否已经获取了访问媒体文件的权限,如ohos.permission.READ_MEDIA

  4. 资源限制:模拟器或真机的资源限制可能导致解码器无法正常工作。确保设备有足够的内存和CPU资源来支持视频解码。

  5. API调用错误:检查VideoDecoder的API调用是否正确,确保初始化、配置和启动解码器的步骤没有错误。

  6. 系统版本差异:模拟器和真机的系统版本可能存在差异,导致VideoDecoder的行为不一致。确保模拟器和真机运行的是相同版本的HarmonyOS。

  7. 日志分析:查看设备日志,获取更多关于AV_ERR_UNKNOWN错误的详细信息。日志可能包含解码器初始化失败或资源分配失败的具体原因。

  8. 硬件加速问题:真机上的硬件加速可能存在问题,导致解码器返回AV_ERR_UNKNOWN。检查设备的硬件加速功能是否正常启用。

  9. 编码器配置:确保视频编码器的配置与VideoDecoder的要求一致,包括分辨率、帧率、比特率等参数。

  10. 系统资源冲突:模拟器或真机上可能存在其他应用或服务占用了VideoDecoder所需的资源,导致解码器无法正常工作。

以上是可能导致VideoDecoder在鸿蒙Next中启动失败或返回AV_ERR_UNKNOWN的常见原因。

在HarmonyOS鸿蒙Next中,VideoDecoder解码在模拟器上启动失败,而在真机上返回AV_ERR_UNKNOWN,可能原因如下:

  1. 模拟器问题:模拟器可能不支持某些硬件加速功能,导致解码器无法启动。建议检查模拟器版本是否支持相关功能,或尝试在真机调试。

  2. 编解码器支持:确保视频格式和编码方式在HarmonyOS中得到支持。某些特殊编码格式可能在模拟器上无法正确解析。

  3. 权限或资源限制:检查应用是否具备必要的权限(如存储、网络等),以及系统资源是否充足。模拟器可能因资源限制导致解码失败。

  4. API调用错误:确认VideoDecoder的初始化、配置和启动步骤符合API文档要求。错误的参数或调用顺序可能导致AV_ERR_UNKNOWN

建议通过日志分析具体错误,并参考官方文档或社区资源进行排查。

回到顶部