拆分AAC流,启动/填充采样问题(无间隙播放)

时间:2017-01-05 19:39:12

标签: android audio aac

我使用Android的MediaCodec API将原始音频编码到AAC。问题:我需要以一秒钟的速度向服务器发送AAC流。所以我需要拆分流。现在,由于AAC帧是1024个样本,我为每个块采用round(SAMPLE_RATE/1024)个AAC帧。但是,由于"启动样品"这种简单的AAC流切割不起作用。 更多细节如下。将一个块发送到服务器后,客户端会在Web浏览器Chrome中接收它,并使用Web Audio API播放所有收到的块。以无间隙的方式完成回放:最初分配大的音频缓冲器,接收的块被解码并在音频缓冲器中复制,播放音频缓冲器。  现在,这不适用于AAC(虽然它适用于Ogg / Vorbis)。使用AAC,我在生成的声音中有神器。在每秒结束时,下一秒的开始为零,然后逐渐地,波形增长直到其具有正常尺寸。这持续10,20毫秒。   我认为问题是由于缺少"priming samples"造成的。也许Web Audio API期待"启动样本"在每个AAC块的开头,它找不到它们,从而修改实际的音频。

问题是:如何拆分原始AAC流并发送" good" AAC块一秒钟? 根据我的理解,我应该在每个块的开头包括前两个帧(前一个块的最后两个帧)。但是,这个数字应该有所不同,文档也不多。一些专家建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

我使用以下方法。我不是AAC的专家,所以我可能会遗漏一些东西,但实验上它是有效的。 假设Chrome解码器期望在每个块的开始处启动示例,我执行以下操作:在向服务器发送块之前,我在其开头添加前一块的最后4个AAC帧(如果它是第一块我不要这样做)。客户端,我检索一个块,我解码它并删除前4 * 1024个样本(1024 =一个AAC帧中的样本)。 这很有效。

相关问题