我使用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块一秒钟? 根据我的理解,我应该在每个块的开头包括前两个帧(前一个块的最后两个帧)。但是,这个数字应该有所不同,文档也不多。一些专家建议表示赞赏。
答案 0 :(得分:1)
我使用以下方法。我不是AAC的专家,所以我可能会遗漏一些东西,但实验上它是有效的。 假设Chrome解码器期望在每个块的开始处启动示例,我执行以下操作:在向服务器发送块之前,我在其开头添加前一块的最后4个AAC帧(如果它是第一块我不要这样做)。客户端,我检索一个块,我解码它并删除前4 * 1024个样本(1024 =一个AAC帧中的样本)。 这很有效。