我已经成功地将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。
我意识到,这可能是由于方法期望纯“音频数据”,但文件也包含一个头等。我如何去除这一点?

最佳答案

opus库解码opus包。你给它一个opus包,它解码;一次一个包。您试图给它一个完整的ogg opus文件,包括所有的头、框架、标记和其他元数据。
解码整个ogg opus文件的最简单方法是使用opus file库。如果你想的话,它甚至可以从一个url流式传输数据,这样你就不必像现在这样在解码之前下载所有的数据了。或者,您可以使用ogg库从文件中提取数据包,然后将每个音频数据包传递到opus库进行解码,而不是opus file。

关于swift - swift :转换OPUS示例文件仅返回“-4”(OPUS_INVALID_PACKET)。如何剥离标题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48547804/

10-12 14:46