首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码Opus音频数据

解码Opus音频数据
EN

Stack Overflow用户
提问于 2013-05-11 18:47:19
回答 1查看 28.3K关注 0票数 21

我正在尝试将一个Opus文件解码回原始的48 kHz。但是,我找不到任何示例代码来做到这一点。

我当前的代码是:

代码语言:javascript
复制
void COpusCodec::Decode(unsigned char* encoded, short* decoded, unsigned int len)
{
     int max_size=960*6;//not sure about this one

     int error;
     dec = opus_decoder_create(48000, 1, &error);//decode to 48kHz mono

     int frame_size=opus_decode(dec, encoded, len, decoded, max_size, 0);
}

参数"encoded“可能是更大的数据量,所以我认为我必须将其拆分成帧。我不确定我怎么能做到这点。

作为Opus的初学者,我真的很害怕搞砸一些事情。

也许有人能帮上忙?

EN

回答 1

Stack Overflow用户

发布于 2013-05-16 20:05:32

libopus提供了一个API,用于将opus数据包转换为PCM数据块,反之亦然。

但是要在一个文件中存储opus包,您需要某种容器格式来存储包边界。opus_demo是一个演示应用程序:它有自己的用于测试目的的最小容器格式,没有文档记录,因此opus_demo生成的文件不应该分发。opus文件的标准容器格式是Ogg,它还提供对元数据和样本精确解码的支持,以及对可变比特率流的有效查找。Ogg Opus文件的扩展名为".opus“。

Ogg Opus规范在https://wiki.xiph.org/OggOpus

(由于Opus也是VoIP编解码器,因此Opus的使用不需要容器,例如直接通过UDP传输Opus数据包。)

因此,首先你应该使用opus-tools中的opusenc来编码你的文件,而不是opus_demo。其他软件也可以生成Ogg Opus文件(例如,我相信gstreamer和ffmpeg可以),但使用opus-tools是不会出错的,因为它是参考实现。

然后,假设您的文件是标准的Ogg Opus文件(可以由Firefox读取),您需要做的是:(a)从Ogg容器中提取opus包;(b)将包传递到libopus并取回原始的PCM。

方便的是,有一个名为libopusfile的库可以做到这一点。libopusfile支持Ogg Opus streams的所有功能,包括元数据和查找(包括通过HTTP连接进行查找)。

libopusfile文件可以在https://git.xiph.org/?p=opusfile.githttps://github.com/xiph/opusfile上找到。接口文档为hereopusfile_example.c (xiph.org | github)提供了解码为WAV的示例代码。由于您使用的是windows,我应该补充说,在downloads页面上有预先构建的DLL。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16496288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档