首页 > 解决方案 > 如何使用 opus 编解码器从 webm 文件中获取原始音频 pcm 数据

问题描述

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

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

我该怎么做?请从概念上详细地告诉我方法。

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

// 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)

nbytes :输入长度,4096。

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

MAX_FRAME_SIZE :我很困惑这是什么。

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

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

标签: c++audiopcmwebmopus

解决方案


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

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

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

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

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

其他链接:

使用 FFmpeg 中的 libavcodec 解码作品

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


推荐阅读