HarmonyOS 鸿蒙Next中硬解码网络流的实现方式

HarmonyOS 鸿蒙Next中硬解码网络流的实现方式

请教HarmonyOS硬解码网络流的实现方式

咨询场景描述:通过私有协议将网络上的h264、h265原始码流(未使用mpeg4等封装格式)接收至本地后,怎样使用硬解码接口?

参考demo文档: https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/avcodec/video-decoding.md

结合demo上的示例,由demuxer读取文件fd的源数据得到OH_AVBuffer实例,但从头文件中未看到OH_AVBuffer的定义。

只找到定义:typedef struct OH_AVBuffer OH_AVBuffer;没有更进一步的定义了。

问题:

  1. 从网络接收到视频数据buffer和length之后,怎样生成OH_AVBuffer实例?OH_AVBuffer_Create相关的接口也无法输入buffer和length参数;
  2. 由于我们拿到的是原始码流h264、h265,理论上不需要demuxer进行解封装,请问网络收流的场景,是否不需要使用demuxer对象;
  3. OH_AVBuffer_SetBufferAttr接口是针对OH_AVBuffer对象操作的,无法直接使用unsigned char *bufferint length参数;

麻烦指导一下网络接收原始码流的硬解码流程,或者提供从网络接收流的硬解码演示demo程序代码


更多关于HarmonyOS 鸿蒙Next中硬解码网络流的实现方式的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

1、解码器Start后,输入回调OnNeedInputBuffer会不断被调起,每一次回调中能拿到一个OH_AVBuffer实例;因为编解码器给用户的buffer数量有限,需要用户及时调用OH_VideoDecoder_PushInputBuffer接口,将buffer及时送至解码器解码,实现buffer轮转。

2、不需要demuxer

3、强转一下

只要能把网络流接受至本地这条路打通,之后的流程就按这个demo里的写法来就能调通的:https://gitee.com/openharmony/multimedia_av_codec/blob/master/test/unittest/video_test/video_test/sample/decoder/video_decoder_sample.cpp

更多关于HarmonyOS 鸿蒙Next中硬解码网络流的实现方式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


第三点不明白:我网络流获取到的是data: ArrayBuffer 类型。你说的这个demo是个c++项目吧,我具体要怎么去使用怎么去解码呢?

救救c++菜鸟,

请问为什么我得解码器Start之后,我得OnNeedInputBuffer回调函数只被调用了几次呢,我在OutputBuffer中保存解码后的数据,发现只有一帧数据呢?

大佬,这个问题解决了吗?我也遇到同样的问题了

同C++菜鸡,麻烦问下解决了吗,我也卡这了

大佬们,我遇到的应该是跟楼主一样的问题:获取到流式数据,h265原始码流(因为我们水果端完成了解码并显示图像)。拿到数据接下去就不知道怎么处理数据了。

httpRequest.requestInStream 获取到的应该是ArrayBuffer吧?如下:
httpRequest.on('dataReceive', (data: ArrayBuffer) => {}

请楼主和海绵宝宝指点指点。

我在arkTS端获取码流后。要调用native侧h265的硬解码,要napi的方式吧?

我没有这方面的经验。

能不能enguins

C里面获取,写不来了。

你的项目也是网络获取的码流吗?

请问,这个后来有解决了吗?

在鸿蒙Next中实现硬解码网络流,需使用AVPlayer结合OH_AVCodec硬件解码能力。步骤如下:

  1. 创建AVPlayer实例,设置网络流URL
  2. 配置SourceInfo指定流媒体类型
  3. 通过OH_AVCodec获取硬件解码器实例
  4. 绑定解码器到AVPlayer的底层渲染管线
  5. 调用prepare()预加载时自动触发硬解

关键参数:

  • OH_AVCapability检查设备硬解支持
  • OH_AVCodecType设置为VIDEO_DECODER
  • 使用Surface直接输出解码帧

注意:需在config.json声明ohos.permission.MEDIA权限。

在HarmonyOS Next中实现硬解码网络流的关键步骤如下:

  1. 对于原始H.264/H.265码流处理:
  • 不需要使用demuxer解封装,可直接将网络接收到的裸流数据送入解码器
  • 需要确保每个NAL单元包含起始码(0x00000001)
  1. 创建OH_AVBuffer实例: 使用OH_AVBuffer_CreateFromMemory接口直接创建:
OH_AVBuffer* buffer = OH_AVBuffer_CreateFromMemory(rawData, dataSize, OH_AVBuffer_DataType::AVBUFFER_DATA_TYPE_H264);
  1. 解码器配置关键点:
  • 设置正确的媒体类型(OH_AVCODEC_MIMETYPE_VIDEO_AVC/HEVC)
  • 配置视频宽高、帧率等参数
  • 使用OH_AVCodec_SetCallback设置异步回调
  1. 解码流程:
// 1. 创建解码器
OH_AVCodec* decoder = OH_AVCodec_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_AVC);

// 2. 配置回调
OH_AVCodec_SetCallback(decoder, callbacks, nullptr);

// 3. 配置解码器参数
OH_AVFormat* format = OH_AVFormat_Create();
OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, width);
// ...其他参数设置
OH_AVCodec_Configure(decoder, format);

// 4. 启动解码器
OH_AVCodec_Start(decoder);

// 5. 输入数据
OH_AVBuffer* inputBuffer = OH_AVBuffer_CreateFromMemory(networkData, dataSize, type);
OH_AVCodec_PushInputBuffer(decoder, inputBuffer, 0);

注意处理解码器回调中的输出帧数据。对于网络流场景,需要处理好数据边界和异常情况。

回到顶部