HarmonyOS 鸿蒙Next硬解码EOS输出异常
HarmonyOS 鸿蒙Next硬解码EOS输出异常
- 输入 EOS packet
OH_AVCodecBufferAttr attr = { 0, 0, 0, AVCODEC_BUFFER_FLAGS_NONE};
attr.pts = buffered_pkt.pts;
attr.flags = AVCODEC_BUFFER_FLAGS_EOS;
OH_AVBuffer_SetBufferAttr(bufferInfo._buff, &attr);
ret = OH_VideoDecoder_PushInputBuffer(_decoder, bufferInfo.bufferIndex);
- 再调用视频解码器Flush,然后调用 start
int32_t ret = OH_VideoDecoder_Flush(video_codec_);
ret = OH_VideoDecoder_Start(video_codec_);
此时概率性收到解码器的 EOS output 回调,按照预期,flush 之后,会失效所有 input & output buffer
06-12 17:07:02.013 1623 2003 I C02B32/av_codec_service/HCODEC: [269][dec.avc]Flush >>
06-12 17:07:02.013 1623 63789 I C02514/av_codec_service/codec_hdi_omx: SendCommand() commandType: [1], command [-1]
06-12 17:07:02.013 1623 63789 I C02B90/av_codec_service/OMXComponentDecoder: [nodict]VIDEO:[SendCommand]:[171] Receive OMX_CommandFlush
06-12 17:07:02.013 1623 63789 I C02B90/av_codec_service/OMXComponentDecoder: [nodict]VIDEO:[FlushPort]:[1115] flush input port complete
06-12 17:07:02.013 1623 63789 I C02B90/av_codec_service/OMXComponentDecoder: [nodict]VIDEO:[FlushPort]:[1120] flush output port complete
06-12 17:07:02.014 1623 2003 I C02B32/av_codec_service/HCODEC: [269][dec.avc]Flush <<
06-12 17:07:02.015 1623 2003 I C02B30/av_codec_service/CodecServer: {StatusChanged():901} Status end of stream -> flushed
06-12 17:07:02.015 55393 63787 D A03300/demo/ohosDecoder: [flush:448] <#play_43> OH_VideoDecoder_Flush cost=2
06-12 17:07:02.015 1623 2003 I C02B32/av_codec_service/HCODEC: [269][dec.avc]Start >>
06-12 17:07:02.016 1623 63796 I C02B90/av_codec_service/Decoder: [nodict]VIDEO:[ReportEosEvent]:[1638] return eos buffer
06-12 17:07:02.016 1623 63796 I C02B90/av_codec_service/OMXComponentDecoder: [nodict]VIDEO:[EventProcess]:[556] type:3
06-12 17:07:02.016 1623 63789 I C02B32/av_codec_service/HCODEC: [269][dec.avc][Running][OmxFlagToUserFlag 831] got output eos
06-12 17:07:02.016 55393 55479 D A03300/demo/ohosDecoder: [OnNeedInputBuffer:1026] OnNeedInputBuffer index=1, buffer=0x5c560f9700
06-12 17:07:02.016 1623 63789 W C02B32/av_codec_service/HCODEC: [269][dec.avc][Running][OnCodecEvent 110] ignore event 4, data1 = 1, data2 = 1
06-12 17:07:02.016 55393 55479 D A03300/demo/ohosDecoder: [OnNeedInputBuffer:1026] OnNeedInputBuffer index=2, buffer=0x5c560f9760
06-12 17:07:02.016 55393 55479 D A03300/demo/ohosDecoder: [OnNeedInputBuffer:1026] OnNeedInputBuffer index=3, buffer=0x5c55974bc0
06-12 17:07:02.016 1623 2003 I C02B32/av_codec_service/HCODEC: [269][dec.avc]Start <<
06-12 17:07:02.016 1623 2003 I C02B30/av_codec_service/CodecServer: {StatusChanged():901} Status flushed -> running
06-12 17:07:02.016 55393 55479 D A03300/demo/ohosDecoder: [OnNeedInputBuffer:1026] OnNeedInputBuffer index=4, buffer=0x5c55974bf0
06-12 17:07:02.016 55393 55479 D A03300/demo/ohosDecoder: [OnNewOutputBuffer:1057] OnNewOutputBuffer EOS // 在 flush 之后还收到之前的 EOS 帧
06-12 17:07:02.016 55393 55479 D A03300/demo/ohosDecoder: [OnNewOutputBuffer:1062] OnNewOutputBuffer index=13, pts=0
06-12 17:07:02.018 55393 63787 D A03300/demo/ohosDecoder: [flush:471] <#play_43> flush cost=4
06-12 17:07:02.029 55393 63787 D A03300/demo/ohosDecoder: [enqueue_packet:526] <#play_43> enqueue_packet:KEY FRAME
06-12 17:07:02.029 55393 63787 D A03300/demo/ohosDecoder: [decode_frame:591] <#play_43> codecBufferInfoReceive.attr.flags == AVCODEC_BUFFER_FLAGS_EOS
更多关于HarmonyOS 鸿蒙Next硬解码EOS输出异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
鸿蒙Next硬解码EOS输出异常可能由以下原因导致:
- 解码器状态机未正确处理流结束标记
- 媒体容器格式与解码器预期不符
- 底层HDF驱动未完整传递EOS信号
典型解决方案:
- 检查MediaCodec的onOutputBufferAvailable回调,确认BUFFER_FLAG_END_OF_STREAM标志是否正确传递。
- 验证输入数据是否包含完整的编解码器配置信息。
- 排查HDF层deps是否满足codec2标准接口要求。
从日志分析来看,这是一个HarmonyOS Next视频解码器在EOS处理时序上的问题。关键点如下:
-
在发送EOS帧后立即调用Flush+Start操作时,底层解码器可能还未完全处理完EOS状态,导致Flush后仍会回调已发送的EOS帧。
-
日志显示解码器确实完成了Flush操作(“flush input/output port complete”),但随后又触发了"return eos buffer"事件。
建议修改方案:
- 在发送EOS帧后,等待收到EOS输出回调后再执行Flush操作
- 或者在Flush后增加适当延迟(10-20ms)再Start解码器
- 也可以考虑在应用层对这种情况做容错处理,忽略Flush后收到的EOS帧
这个问题可能与底层OMX组件状态机转换时序有关,属于典型的多线程同步问题。