首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Swift将mp3的音频格式转换为iOS中的wav?

如何使用Swift将mp3的音频格式转换为iOS中的wav?
EN

Stack Overflow用户
提问于 2019-08-25 04:08:04
回答 2查看 3.4K关注 0票数 1

我使用Swift在iOS中使用cmusphinx,cmusphinx使用wav格式的音频文件,而我需要使用的文件是mp3格式。

如何使用Swift将mp3格式的音频文件转换为iOS中的wav格式?

到目前为止,我使用来自Apple框架的AVAssetExportSession编写了以下代码,但是我一直收到一个错误,说我使用了无效的输出文件类型,不管我设置了AVAssetExportSession对象的outputFileType属性。

我愿意使用苹果以外的其他框架。

错误发生在我用一个注释标记它的地方,它写着"error here",其中设置了AVAssetExportSession.outputFileType实例属性。

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()

    let assetURL: URL = Bundle.main.url(forResource: "audio16000", withExtension: "mp3")!

    let asset = AVAsset(url: assetURL)

    let presets: [String] = AVAssetExportSession.allExportPresets()

    for preset in presets {
        print(preset)
    }

    let localDocumentsURL: URL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)

    let outputURL: URL = localDocumentsURL.appendingPathComponent("audio16000").appendingPathExtension("wav")

    if FileManager.default.fileExists(atPath: outputURL.path) {

        do {

            try FileManager.default.removeItem(at: outputURL)

        } catch {

            print(error)

        }

    }

    let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHEVC1920x1080)

    exporter?.outputURL = outputURL
    exporter?.outputFileType = AVFileType.wav // error here

    exporter?.exportAsynchronously {

        print("exporter status =", exporter?.status as Any)

        switch exporter!.status {
        case .unknown:
            print("status unknown")
        case .waiting:
            print("status waiting")
        case .exporting:
            print("status exporting")
        case .completed:
            print("status completed")
        case .failed:
            print("status failed")
        case .cancelled:
            print("status cancelled")
        @unknown default:
            print("@unknown default:")
        }

    }

}

以下是调试窗口显示的内容:

代码语言:javascript
复制
2019-09-17 11:42:14.766703-0500 TrialAVAssetExportSession[5620:2016827] [Accessibility] ****************** Loading GAX Client Bundle ****************
AVAssetExportPreset1920x1080
AVAssetExportPresetLowQuality
AVAssetExportPresetAppleM4A
AVAssetExportPresetHEVCHighestQuality
AVAssetExportPreset640x480
AVAssetExportPreset3840x2160
AVAssetExportPresetHEVC3840x2160
AVAssetExportPresetHighestQuality
AVAssetExportPresetMediumQuality
AVAssetExportPreset1280x720
AVAssetExportPreset960x540
AVAssetExportPresetHEVC1920x1080
2019-09-17 11:42:25.574394-0500 TrialAVAssetExportSession[5620:2016827] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetExportSession setOutputFileType:] Invalid output file type'
*** First throw call stack:
(0x233d4a98c 0x232f239f8 0x239d527f4 0x1004d2f58 0x1004d40f0 0x2601fe224 0x2601fe628 0x2607dce64 0x2607dd40c 0x253f82620 0x2607edce8 0x2607a0908 0x2607a5fe0 0x2600692a4 0x26007183c 0x260068f28 0x260069818 0x260067b64 0x26006782c 0x26006c36c 0x26006d150 0x26006c224 0x260070f24 0x2607a45e8 0x2603a0e04 0x2366c69fc 0x2366d040c 0x2366cfc14 0x100584c78 0x100588840 0x236701040 0x236700cdc 0x236701294 0x233cdc728 0x233cdc6a8 0x233cdbf90 0x233cd6ecc 0x233cd67c0 0x235ed779c 0x2607a7c38 0x1004d5594 0x23379a8e0)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

我已经尝试了从AVAssetExportSession.exportPresets(compatibleWith:)方法收到的所有预置。当我使用AVAssetExportSession.allExportPresets()时,我会收到相同的字符串数组。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-24 07:11:51

WAV和包含PCM,查看核心音频,特别是:

  1. 音频文件服务(读取MP3格式并写入AIFF或WAV)
  2. 音频文件转换服务(用于将MP3数据转换为PCM,并/或在编写文件时从PCM编码到其他编解码器)给定的转换器无法在两种编码格式之间转换的.Note。你可以做MP3到PCM或PCM,但是要做MP3到AAC,你需要两个转换器。
  3. 扩展音频文件服务,它将上述两种功能结合在一起。

另外,一定要理解编解码器和文件格式之间的区别,以及哪些编解码器/格式组合是合法的。当我第一次发现PCM一定是WAV中的小端点,AIFF中的大端点时,我感到很惊讶。

看看这里摘自v4 AudioKit的好例子

票数 2
EN

Stack Overflow用户

发布于 2019-09-24 11:22:34

AudioKit库包括一个从MP3到WAV的转换器,您可以检查它们的所有可用输入/输出那里

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

https://stackoverflow.com/questions/57643169

复制
相关文章

相似问题

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