Swift: 仅转换 OPUS 示例文件 returns "-4" (OPUS_INVALID_PACKET)。如何剥离header?

Swift: converting OPUS example file only returns "-4" (OPUS_INVALID_PACKET). How to strip header?

我已成功将 https://github.com/chrisballinger/Opus-iOS 添加到我的项目中,并且可以调用在其 header 中声明的函数。

我想从 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 object returns 大量不同的数字,所以我知道它不会全为 0。

我意识到这可能是由于方法需要纯 "audio data" 但文件还包含 header 等。我怎样才能去掉它?

opus 库解码 Opus 数据包。您给它一个 Opus 数据包,它会对其进行解码;一次一包。您正试图给它一个完整的 Ogg Opus 文件,包括所有 headers、框架、标签和其他元数据。

解码整个 Ogg Opus 文件的最简单方法是使用 opusfile 库。如果你愿意,它甚至可以从 URL 流式传输数据,这样你就不必像在这里做的那样在开始解码之前下载所有数据。或者,您可以使用 ogg 库从文件中提取数据包,然后将每个音频数据包传递给 opus 库进行解码,而不是 opusfile。