c++ 双通道作品编码

c0vxltue  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(74)

我使用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;
}
juzqafwq

juzqafwq1#

我认为你有错误的FRAME_SIZEOfficial 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字节

相关问题