如何使用 Swift 在 iOS 中将音频格式从 mp3 转换为 wav?
How do I convert audio format from mp3 to wav in iOS using Swift?
我在iOS使用cmusphinx使用Swift,cmusphinx使用的是wav格式的音频文件,而我需要使用的文件是mp3格式的。
如何使用Swift将iOS中的mp3格式音频文件转换为wav格式?
到目前为止,我使用 Apple AVFoundation 框架中的 AVAssetExportSession 编写了以下代码,但无论我如何设置 AVAssetExportSession 的 outputFileType 属性,我总是收到错误提示说我使用了无效的输出文件类型对象。
我愿意使用 Apple 以外的其他框架。
错误发生在我用 "error here" 注释标记的地方,其中设置了 AVAssetExportSession.outputFileType 实例 属性。
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:")
}
}
}
调试 window 的内容如下:
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().
时,我收到完全相同的字符串数组
WAV并包含PCM,看Core Audio,具体是:
- 音频文件服务(读取MP3格式,写入AIFF或WAV)
- 音频文件转换服务(将MP3数据转换为PCM,
and/or 从 PCM 编码到其他一些编解码器,如果你要写一个
文件)。请注意,给定的转换器不能在两种编码格式之间进行转换。您可以将 MP3 转 PCM 或 PCM 转 AAC,但要进行 MP3 转 AAC,您需要两个转换器。
- 扩展音频文件服务,结合了以上两者。
此外,请务必了解编解码器和文件格式之间的区别,以及哪些 codec/format 组合是合法的。第一次发现 PCM 在 WAV 中必须是小端,在 AIFF 中必须是大端时,我感到很惊讶。
AudioKit library includes a converter from MP3 to WAV, you can check all their available inputs/outputs there
我在iOS使用cmusphinx使用Swift,cmusphinx使用的是wav格式的音频文件,而我需要使用的文件是mp3格式的。
如何使用Swift将iOS中的mp3格式音频文件转换为wav格式?
到目前为止,我使用 Apple AVFoundation 框架中的 AVAssetExportSession 编写了以下代码,但无论我如何设置 AVAssetExportSession 的 outputFileType 属性,我总是收到错误提示说我使用了无效的输出文件类型对象。
我愿意使用 Apple 以外的其他框架。
错误发生在我用 "error here" 注释标记的地方,其中设置了 AVAssetExportSession.outputFileType 实例 属性。
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:")
}
}
}
调试 window 的内容如下:
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().
时,我收到完全相同的字符串数组WAV并包含PCM,看Core Audio,具体是:
- 音频文件服务(读取MP3格式,写入AIFF或WAV)
- 音频文件转换服务(将MP3数据转换为PCM, and/or 从 PCM 编码到其他一些编解码器,如果你要写一个 文件)。请注意,给定的转换器不能在两种编码格式之间进行转换。您可以将 MP3 转 PCM 或 PCM 转 AAC,但要进行 MP3 转 AAC,您需要两个转换器。
- 扩展音频文件服务,结合了以上两者。
此外,请务必了解编解码器和文件格式之间的区别,以及哪些 codec/format 组合是合法的。第一次发现 PCM 在 WAV 中必须是小端,在 AIFF 中必须是大端时,我感到很惊讶。
AudioKit library includes a converter from MP3 to WAV, you can check all their available inputs/outputs there