如何在iOS中解码自分隔的作品

如何在iOS中解码自分隔的作品,ios,avfoundation,avplayer,opus,vlckit,Ios,Avfoundation,Avplayer,Opus,Vlckit,我能够使用AVFoundation录制和播放作品。问题是我得到了一个自定义opus音频文件,如下所示: | header 1 (1 byte) | opus data 1 (1~255 bytes) | header 2 (1 byte) | opus data 2 (1~255 bytes) | ... | ... | 每个标题指示opus数据的大小,即,如果标题1为200 Int,则opus数据1为200字节 因此,我提取opus数据并将其附加到数据缓冲区,如下所示: guard let

我能够使用AVFoundation录制和播放作品。问题是我得到了一个自定义opus音频文件,如下所示:

| header 1 (1 byte) | opus data 1 (1~255 bytes) | header 2 (1 byte) | opus data 2 (1~255 bytes) | ... | ... |
每个标题指示opus数据的大小,即,如果标题1为200 Int,则opus数据1为200字节

因此,我提取opus数据并将其附加到数据缓冲区,如下所示:

guard let url = Bundle.main.url(forResource: "test_16kbps", withExtension: "opus") else { return }

do {

    let fileData = try Data(contentsOf: url)

    while index < fileData.count {

        headerData = fileData[index...(index + HEADER_SIZE)]

        let opusBytesFromHeader = Int([UInt8](headerData)[0])

        start = index + HEADER_SIZE
        end = start + opusBytesFromHeader

        opusData = fileData[start..<end]

        opusAudioData.append(opusData)

        index += (HEADER_SIZE + opusBytesFromHeader)
   }

} catch let err {
   print(err)
}
if let opusFilePath = createNewDirPath() { // creates "foo.opus"
    do {
        try opusAudioData.write(to: opusFilePath)
        let opusMedia = VLCMedia(url: opusFilePath)
        vlcPlayer.media = opusMedia
        vlcPlayer.play()
    } catch let err {
        print(err)
    }
}
if let decoded = OpusKit.shared.decodeData(opusData) {
    decodedOpusData.append(decoded)
} else {
    print("failed to decode")
}
给出错误:操作无法完成。OSStatus错误1954115647

我还尝试了MobileVLCKit吊舱,如下所示:

guard let url = Bundle.main.url(forResource: "test_16kbps", withExtension: "opus") else { return }

do {

    let fileData = try Data(contentsOf: url)

    while index < fileData.count {

        headerData = fileData[index...(index + HEADER_SIZE)]

        let opusBytesFromHeader = Int([UInt8](headerData)[0])

        start = index + HEADER_SIZE
        end = start + opusBytesFromHeader

        opusData = fileData[start..<end]

        opusAudioData.append(opusData)

        index += (HEADER_SIZE + opusBytesFromHeader)
   }

} catch let err {
   print(err)
}
if let opusFilePath = createNewDirPath() { // creates "foo.opus"
    do {
        try opusAudioData.write(to: opusFilePath)
        let opusMedia = VLCMedia(url: opusFilePath)
        vlcPlayer.media = opusMedia
        vlcPlayer.play()
    } catch let err {
        print(err)
    }
}
if let decoded = OpusKit.shared.decodeData(opusData) {
    decodedOpusData.append(decoded)
} else {
    print("failed to decode")
}
给出以下错误:

Android团队能够使用LibopusJNI和AudioTrack进行游戏。因此,我尝试使用OpusKit pod解码opus数据,如下所示:

guard let url = Bundle.main.url(forResource: "test_16kbps", withExtension: "opus") else { return }

do {

    let fileData = try Data(contentsOf: url)

    while index < fileData.count {

        headerData = fileData[index...(index + HEADER_SIZE)]

        let opusBytesFromHeader = Int([UInt8](headerData)[0])

        start = index + HEADER_SIZE
        end = start + opusBytesFromHeader

        opusData = fileData[start..<end]

        opusAudioData.append(opusData)

        index += (HEADER_SIZE + opusBytesFromHeader)
   }

} catch let err {
   print(err)
}
if let opusFilePath = createNewDirPath() { // creates "foo.opus"
    do {
        try opusAudioData.write(to: opusFilePath)
        let opusMedia = VLCMedia(url: opusFilePath)
        vlcPlayer.media = opusMedia
        vlcPlayer.play()
    } catch let err {
        print(err)
    }
}
if let decoded = OpusKit.shared.decodeData(opusData) {
    decodedOpusData.append(decoded)
} else {
    print("failed to decode")
}
然后尝试使用AVAudioPlayer播放decodedOpusData,但给出了相同的错误:操作无法完成。OSStatus错误1954115647

我不知道该怎么播放那个音频文件,因为我对opus是新手

关于opus数据

样本:16000 |帧大小:32016*20ms |通道:1

,如果您可以获得解码的PCM样本,您可以使用类似下面从中获取的C常量的字节添加RIFF/WAV

也建议阅读

应使用0x01为格式代码指定PCM 数据大小是解码音频的总字节大小 数据 文件大小=44+数据大小 完整解决方案:iOS Swift 5、iOS 13、Xcode 11.3的Swift代码

AudioUtil


解码数据返回什么?PCM 16或浮点数组?@anthumcris public func decode data_uu数据:数据->数据?{var decodedata=[opus_int16]repeating:0,count:2048/..return outputData as Data}:@anthumcris,它返回PCM 16这需要调用两次=>因为我将所有解码块附加到decodedopudata,我是否应该添加一次标题,即finalData=Dataheader+decodedOpusData,然后播放avAudioPlayer=try avAudioPlayer.initdata:finalData?如何从我提到的decodedOpusData中计算出这些文件大小、格式代码和数据节的大小,decodedOpusData是[opus_int16]。文件大小是=decodedOpusData.count还是decodedOpusData.count/MemoryLayout.stride?我猜格式代码是1,因为decodedOpusData是opus解码器的UInt16数组,我不知道iOS和opusIt中全新音频处理的数据段大小。我应该用Swift代码单独回答我做了什么,还是接受你的建议,在你的提示下用Swift代码编辑你的答案?我还有一个问题要问。我可以用AVFoundation录制作品。但是现在我需要将记录的数据编码为:|头1 1字节| opus数据1 1~255字节|头2 1字节| opus数据2 1~255字节| | | | | | | | | | | | | | |我原以为OPU是在服务器上处理的,但服务器团队说我必须以相同的格式对其进行编码并将其发送到服务器。请给我一些提示,说明如何实现这一目标以及何时实现?录制时或录制完成后。此处询问有关opus编码的问题:。请你看一下好吗