IMFTransform AAC解码器MFT_OUTPUT_DATA_BUFFER_INCOMPLETE标记含义咨询
MFT AAC解码器MFT_OUTPUT_DATA_BUFFER_INCOMPLETE标记含义说明
微软官方文档对MFT_OUTPUT_DATA_BUFFER_INCOMPLETE的通用定义是当前输出缓冲区已满,MFT仍有剩余输出数据可被拉取,需要调用方再次调用ProcessOutput()获取剩余数据。但内置AAC解码器对该标记的实现属于特殊场景适配,不符合通用定义,它返回该标记的实际含义是:
- 本次
ProcessOutput()返回的PCM样本只是完整音频帧的分片,剩余的帧数据需要更多输入的AAC码流解码后才能拼接输出,不存在已经缓存好可直接拉取的剩余数据。
你遇到的现象属于该解码器的正常行为:当你收到MFT_OUTPUT_DATA_BUFFER_INCOMPLETE标记后再次调用ProcessOutput(),解码器会因为没有足够的输入来生成剩余的帧分片,直接返回MF_E_TRANSFORM_NEED_MORE_INPUT,和通用文档描述的行为不一致属于该MFT的实现特性。
代码适配建议
你当前的逻辑不需要做大的调整:
- 现有逻辑即使多调用一次
ProcessOutput()也不会产生功能问题,额外的调用开销极低,完全可以保留现有实现。 - 如果要优化不必要的
ProcessOutput()调用,可以针对AAC解码器做特殊兼容:当收到MFT_OUTPUT_DATA_BUFFER_INCOMPLETE标记后,先检查当前是否还有未喂入的AAC输入数据,如果没有就直接走ProcessInput()逻辑,不需要先调用一次ProcessOutput()。
你提供的代码格式化后参考版本:
IMFTransform* transformer; MFT_OUTPUT_DATA_BUFFER output_data_buffer; ... bool try_to_get_output = false; for (;;) { if (try_to_get_output) { // 尝试获取输出样本 try_to_get_output = false; output_data_buffer.dwStatus = 0; ... hr = transformer->ProcessOutput(...&output_data_buffer); if (SUCCEEDED(hr)) { // 处理输出样本 if (output_data_buffer.dwStatus & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) { // 还有更多数据需要拉取 try_to_get_output = true; } } else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { Log("Unnecessary ProcessOutput()"); } else { // 处理其他错误 } continue; } // 向MFT输入更多编码后的AAC数据 hr = transformer->ProcessInput(...); }
内容的提问来源于stack exchange,提问作者Igor Bukanov
相关产品推荐
相关产品推荐

