我正在将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/