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
;没有更进一步的定义了。
问题:
- 从网络接收到视频数据buffer和length之后,怎样生成OH_AVBuffer实例?OH_AVBuffer_Create相关的接口也无法输入buffer和length参数;
- 由于我们拿到的是原始码流h264、h265,理论上不需要demuxer进行解封装,请问网络收流的场景,是否不需要使用demuxer对象;
- OH_AVBuffer_SetBufferAttr接口是针对OH_AVBuffer对象操作的,无法直接使用
unsigned char *buffer
和int length
参数;
麻烦指导一下网络接收原始码流的硬解码流程,或者提供从网络接收流的硬解码演示demo程序代码
更多关于HarmonyOS 鸿蒙Next中硬解码网络流的实现方式的实战教程也可以访问 https://www.itying.com/category-93-b0.html
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
硬件解码能力。步骤如下:
- 创建
AVPlayer
实例,设置网络流URL - 配置
SourceInfo
指定流媒体类型 - 通过
OH_AVCodec
获取硬件解码器实例 - 绑定解码器到
AVPlayer
的底层渲染管线 - 调用
prepare()
预加载时自动触发硬解
关键参数:
OH_AVCapability
检查设备硬解支持OH_AVCodecType
设置为VIDEO_DECODER
- 使用
Surface
直接输出解码帧
注意:需在config.json
声明ohos.permission.MEDIA
权限。
在HarmonyOS Next中实现硬解码网络流的关键步骤如下:
- 对于原始H.264/H.265码流处理:
- 不需要使用demuxer解封装,可直接将网络接收到的裸流数据送入解码器
- 需要确保每个NAL单元包含起始码(0x00000001)
- 创建OH_AVBuffer实例: 使用OH_AVBuffer_CreateFromMemory接口直接创建:
OH_AVBuffer* buffer = OH_AVBuffer_CreateFromMemory(rawData, dataSize, OH_AVBuffer_DataType::AVBUFFER_DATA_TYPE_H264);
- 解码器配置关键点:
- 设置正确的媒体类型(OH_AVCODEC_MIMETYPE_VIDEO_AVC/HEVC)
- 配置视频宽高、帧率等参数
- 使用OH_AVCodec_SetCallback设置异步回调
- 解码流程:
// 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);
注意处理解码器回调中的输出帧数据。对于网络流场景,需要处理好数据边界和异常情况。