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

标签 c++ audio pcm webm opus

我正在将ASR服务器uisng开源。
客户端通过websocket以webm文件格式发送语音数据。
在服务器端,首先接收8位消息。
它由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:返回,已解码样本或错误代码的数量。

最佳答案

您可以使用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

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

关于c++ - 如何使用Opus编解码器从webm文件中获取原始音频pcm数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57686018/

相关文章:

c++ - 使用 Visual C++ 编译器 (Visual Studio 2010) 的可变数组大小错误。如何规避这个问题?

c++ - C++ 中的连通分量标记

c++ - Doxygen 没有列出嵌套的命名空间

audio - TI-99的语音效果?

java - 如何将 .WAV 音频数据样本转换为 double 类型?

c# - Xamarin.Forms 上的音乐文件节奏和强度检测

java - 用于上采样的 PCM 算法

c++ - [C++]我想从wav文件中获取PCM数据

c++ - 是否有任何编译器忽略有关默认内联函数的 C++ 标准?

c++ - 写入8位PCM正弦波wav文件产生泛音