首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:转换OPUS示例文件只返回"-4“(OPUS_INVALID_PACKET)。怎么脱头皮?

Swift:转换OPUS示例文件只返回"-4“(OPUS_INVALID_PACKET)。怎么脱头皮?
EN

Stack Overflow用户
提问于 2018-01-31 17:14:12
回答 1查看 1.3K关注 0票数 4

我已经成功地将https://github.com/chrisballinger/Opus-iOS添加到我的项目中,并且我能够调用它的头中声明的函数。

我想转换从OPUS到AAC,所以我的第一步将是解码我的opus文件。但是,它总是抛出错误代码。

我使用的文件是来自https://people.xiph.org/~giles/2012/opus/的2秒文件。

这是我的密码

代码语言:javascript
复制
    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。

我意识到,这可能是由于方法期待纯粹的“音频数据”,但该文件也包含一个头部等。我怎么能去掉这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-01 05:34:44

opus库解码Opus数据包。你给它一个Opus包,它对它进行解码;一次一个包。您正在尝试为它提供一个完整的Opus文件,包括所有的头、帧、标记和其他元数据。

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

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

https://stackoverflow.com/questions/48547804

复制
相关文章

相似问题

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