我使用Opus库已经有一段时间了,主要是使用单声道音频。不过,我一直在研究双通道音频,并一直试图让它与opus一起工作。我最初认为它会非常直接,因为我只是增加了opus_encoder_create
函数中的通道数,并增加了opus_encode
函数中的frame_size。然而,当我对音频进行编码时,我得到的只是一团混乱,似乎是两个波形的总和。输入是PCM数据,由每个样本(L1,R1,L2,R2,..我不确定如何进行,任何建议,或样本代码将不胜感激。
到目前为止,我已经尝试将数据提供为(L1,L2,. LN,R1,R2,.当我这样做的时候,音频是可以理解的,但是两个通道仍然被破坏了,我不相信这是正确的方法。
下面是我如何进行转换的示例
#define NUM_CHANNELS 2
#define SAMPLE_RATE 8000
#define FRAME_SIZE 960
#define OUTPUT_FRAME_BYTES FRAME_SIZE / 8
int main(void) {
int err;
OpusEncoder *encoder;
int16_t pcm_data[FRAME_SIZE * NUM_CHANNELS];
uint8_t compressed_data[OUTPUT_FRAME_BYTES * NUM_CHANNELS];
while (true) {
/* Gather Dual Channel PCM Data from Microphone, and interleave
pcm_data[0] = left channel sample 1
pcm_data[1] = right channel sample 1
pcm_data[2] = left channel sample 2
pcm_data[3] = right channel sample 2
...
pcm_data[FRAME_SIZE * NUM_CHANNELS - 2] = left channel sample FRAME_SIZE
pcm_data[FRAME_SIZE * NUM_CHANNELS - 1] = right channel sample FRAME_SIZE
*/
encoder =
opus_encoder_create(8000, NUM_CHANNELS, OPUS_APPLICATION_RESTRICTED_LOWDELAY, &err);
opus_encoder_ctl(encoder, OPUS_SET_COMPLEXITY(0));
opus_encode(encoder, pcm_data, FRAME_SIZE, compressed_data,
OUTPUT_FRAME_BYTES * NUM_CHANNELS);
// Write compressed data to file
opus_encoder_destroy(encoder);
}
return 0;
}
1条答案
按热度按时间juzqafwq1#
我认为你有错误的
FRAME_SIZE
。Official documentation说:要对一帧进行编码,必须对一帧(2.5、5、10、20、40或60 ms)音频数据调用opus_encode()或opus_encode_float()
帧大小可以计算为
frameSize = frameLength * sampleRate / 1000
,其中frameLength
以ms为单位。所以你应该有帧大小从20(2.5毫秒)到480(60毫秒)。另一件事-您的
compressed_data
大小不应该依赖于FRAME_SIZE
,在上面的链接中,您可以找到输出负载的建议大小:建议使用4000字节