Android MediaCodec - 将音频动态编码为aac

时间:2013-01-14 07:23:33

标签: android encoding aac

我正在尝试使用Android的MediaCodec将原始音频数据编码为aac。 我通过Andoid文档工作,缺乏很多。我现在能够使用AudioRecord录制音频并动态执行编码。

问题是生成的输出似乎没有效果。没有玩家可以回放,MediaExtractor无法打开文件。后者可能是因为输出未包装到有效容器中。没有关于如何处理编码器的输入缓冲区大小的明确文档。所以我尝试完全填充每个输入缓冲区,然后再次排队,但没有成功。我也尝试使用最后一个缓冲区提交END_OF_STREAM_FLAG也没有成功。

是否有人成功使用了MediaEncoder并可以提供有关如何正确使用它的一些信息?是否有可能生成有效的媒体容器,如mpeg4?

提前致谢!

1 个答案:

答案 0 :(得分:2)

为它选择一个容器。我更喜欢adts。

将有效负载数据复制到足够容纳您容器的aray中,只需添加您的位。因此,在搜索了我的解决方案之后,我将一些片段放到了适当位置

    profile =( configParams[0]>>3 )&0x1f;

    frequency_index = (this.configParams[0]&0x7) <<1 | (this.configParams[1]>>7) &0x1;

    channel_config = (this.configParams[1]>>3) &0xf;

    int finallength = encoded_length + 7;       
    ENCodedByteArray[0] = (byte) 0xff;
    ENCodedByteArray[1] = (byte) 0xf1;
    ENCodedByteArray[2] = (byte) ( ((profile - 1) << 6) + (frequency_index << 2) +(channel_config >> 2));
    ENCodedByteArray[3] = (byte) (((channel_config & 0x3) << 6) + (finallength >> 11));
    ENCodedByteArray[4] = (byte)( (finallength & 0x7ff) >> 3);
    ENCodedByteArray[5] = (byte) (((finallength & 7) << 5) + 0x1f) ;
    ENCodedByteArray[6] = (byte) 0xfc;

使用类似

的内容
            byte chunkADTS[]=new byte[info.size + 7];
            fillInADTSHeader(chunkADTS,info.size);
            outputBuffers[bR].get(chunkADTS,7,info.size);
            buffer.pushData(chunkADTS);