c++ - 如何使用 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 :返回,解码样本数或错误代码。
解决方案
您可以使用 FFMPEG 库 ( https://ffmpeg.org/ ) 将 webm 转换为原始 pcm。
Webm 是一种文件格式或容器。它可以包含音频或/和视频编码数据。(作品,VP8/9等)
媒体管道:Webm 文件格式 -> Opus 解码器 -> 原始 PCM 数据
我发现这个 git repo 对 ffmpeg 教程很有用:
https://github.com/leandromoreira/ffmpeg-libav-tutorial
其他链接:
有关更多详细信息,请谷歌 ffmpeg libavcodec webm
推荐阅读
- python - 如何在 S3 boto3 中删除多个文件和特定模式
- c# - 在同一 API 调用 c# 中上传文件和数据
- mysql - SQL检索在特定时间进行交易的用户名
- python - 在 Python 中自动化 Global Protect VPN 连接
- c# - C# Blazor 表 RemoveVariant 事件
- c# - 如何加载 ResponseCompressionDefaults 函数(Blazor WebAssembly SignalR)
- python - 如何更改或自定义熊猫的颜色?
- r - 为 gtsummary 表中的“Overall”列添加背景颜色
- javascript - 如何在 React.js 中使用“window.webkit.messageHandlers”
- r - 从具有因子的列到具有 0、1 的两个不同列