我已成功将https://github.com/chrisballinger/Opus-iOS添加到我的项目中,并且我可以调用其标头中声明的函数。
我想从OPUS转换为AAC,所以我的第一步是解码我的opus文件。但是,它不断抛出错误代码。
我使用的文件是来自https://people.xiph.org/~giles/2012/opus/的2秒文件。
这是我的代码
let url = Bundle.main.url(forResource: "detodos", withExtension: "opus")
print(url) //prints path correctly
var bytes = [UInt8]()
if let data = NSData(contentsOf: url!) {
var buffer = [UInt8](repeating: 0, count: data.length)
data.getBytes(&buffer, length: data.length)
bytes = buffer
let d = opus_decoder_create(48000, 1, nil)
var sampleBuffer = [opus_int16](repeating: 0, count: data.length)
print(opus_int32(bytes.count)) //6270
let w = opus_decode(d!, bytes, opus_int32(bytes.count), &sampleBuffer, opus_int32(5760), opus_int32(1))
print(sampleBuffer) // [0,0,...] every time
print(w) //-4 every time
//-4 = OPUS_INVALID_PACKET
}
我会猜到,在这个非常小的实现中,没有什么应该出错,但显然确实如此。打印我的bytes
对象会返回大量不同的数字,因此我知道它并不能保留所有0 -
我意识到这可能是由于该方法需要纯粹的音频数据"但该文件还包含一个标题等。如何将其删除?
答案 0 :(得分:2)
opus库解码Opus数据包。你给它一个Opus数据包并对其进行解码;一次一个数据包。您正在尝试为其提供整个Ogg Opus文件,包括所有标题,框架,标记和其他元数据。
解码整个Ogg Opus文件的最简单方法是使用opusfile库。如果您愿意,它甚至可以从URL流式传输数据,因此您不必在开始解码之前将其全部下载,就像您在此处所做的那样。或者,您可以使用ogg库从文件中提取数据包,然后将每个音频数据包传递到opus库进行解码,而不是opusfile。