我正在尝试将一个Opus文件解码回原始的48 kHz。但是,我找不到任何示例代码来做到这一点。
我当前的代码是:
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的初学者,我真的很害怕搞砸一些事情。
也许有人能帮上忙?
发布于 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.git和https://github.com/xiph/opusfile上找到。接口文档为here,opusfile_example.c (xiph.org | github)提供了解码为WAV的示例代码。由于您使用的是windows,我应该补充说,在downloads页面上有预先构建的DLL。
https://stackoverflow.com/questions/16496288
复制相似问题