如何使用Opus编解码器从webm文件中获取原始音频pcm数据

时间:2019-08-28 06:08:18

标签: c++ audio pcm webm opus

我正在使ASR服务器uisng开源。 客户端通过websocket以webm文件格式发送语音数据。 在服务器端,首先接收8bit消息。 它是由libwebsocket完成的。​​

然后我想使用opus编解码器获取原始的pcm数据。 听说webm的音频编解码器很麻烦。

我该怎么办? 请从概念上详尽地告诉我。

这是代码。 (来自互联网)

// libopus audio decoder init
{
    int err = 0;
    my_opus_decoder = opus_decoder_create(16000, 1, &err);
    if (err<0)
    {
        fprintf(stderr, "failed to set bitrate: %s\n", opus_strerror(err));
        return EXIT_FAILURE;
    }       
}

.................................. 这是libwebsocket的回调函数。

    //* If receive a data from client*/
    case LWS_CALLBACK_RECEIVE:
        printf(KCYN_L"[Main Service] Server recvived: size %d %s\n"RESET, strlen((char *)in), (char *)in);
        frame_size = opus_decode(my_opus_decoder, (const unsigned char *)in, nbBytes, out , MAX_FRAME_SIZE, 0);

这里的char * in是流,我将其发送给opus解码器。 但是在opus解码器中发生了无效的数据包错误(返回值为-4)

nbbytes:输入长度,4096。

out:解码后的输出,数组,int16 out [2 * 960]。

MAX_FRAME_SIZE:我很困惑。

(对于16khz采样率,我将其设置为960 * 2)。

frame_size:返回,已解码样本或错误代码的数量。

1 个答案:

答案 0 :(得分:1)

您可以使用FFMPEG库(https://ffmpeg.org/)将webm转换为原始pcm。

Webm是文件格式或容器。它可以包含音频或/和视频编码的数据。 (OPUS,VP8 / 9等)

媒体管道:Webm文件格式-> Opus解码器->原始PCM数据

我发现这个git repo对ffmpeg教程很有用:

https://github.com/leandromoreira/ffmpeg-libav-tutorial

其他链接:

Decoding opus using libavcodec from FFmpeg

有关更多详细信息,请google ffmpeg libavcodec webm