iOS代码将m4a转换为WAV

有没有人有任何代码片段,展示如何将M4a文件转换为WAV? 我知道有些库可以转换。

谢谢。

只是为了更新Swift 3:

func convertAudio(_ url: URL, outputURL: URL) { var error : OSStatus = noErr var destinationFile: ExtAudioFileRef? = nil var sourceFile : ExtAudioFileRef? = nil var srcFormat : AudioStreamBasicDescription = AudioStreamBasicDescription() var dstFormat : AudioStreamBasicDescription = AudioStreamBasicDescription() ExtAudioFileOpenURL(url as CFURL, &sourceFile) var thePropertySize: UInt32 = UInt32(MemoryLayout.stride(ofValue: srcFormat)) ExtAudioFileGetProperty(sourceFile!, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &srcFormat) dstFormat.mSampleRate = 44100 //Set sample rate dstFormat.mFormatID = kAudioFormatLinearPCM dstFormat.mChannelsPerFrame = 1 dstFormat.mBitsPerChannel = 16 dstFormat.mBytesPerPacket = 2 * dstFormat.mChannelsPerFrame dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame dstFormat.mFramesPerPacket = 1 dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger // Create destination file error = ExtAudioFileCreateWithURL( outputURL as CFURL, kAudioFileWAVEType, &dstFormat, nil, AudioFileFlags.eraseFile.rawValue, &destinationFile) print("Error 1 in convertAudio: \(error.description)") error = ExtAudioFileSetProperty(sourceFile!, kExtAudioFileProperty_ClientDataFormat, thePropertySize, &dstFormat) print("Error 2 in convertAudio: \(error.description)") error = ExtAudioFileSetProperty(destinationFile!, kExtAudioFileProperty_ClientDataFormat, thePropertySize, &dstFormat) print("Error 3 in convertAudio: \(error.description)") let bufferByteSize : UInt32 = 32768 var srcBuffer = [UInt8](repeating: 0, count: 32768) var sourceFrameOffset : ULONG = 0 while(true){ var fillBufList = AudioBufferList( mNumberBuffers: 1, mBuffers: AudioBuffer( mNumberChannels: 2, mDataByteSize: UInt32(srcBuffer.count), mData: &srcBuffer ) ) var numFrames : UInt32 = 0 if(dstFormat.mBytesPerFrame > 0){ numFrames = bufferByteSize / dstFormat.mBytesPerFrame } error = ExtAudioFileRead(sourceFile!, &numFrames, &fillBufList) print("Error 4 in convertAudio: \(error.description)") if(numFrames == 0){ error = noErr; break; } sourceFrameOffset += numFrames error = ExtAudioFileWrite(destinationFile!, numFrames, &fillBufList) print("Error 5 in convertAudio: \(error.description)") } error = ExtAudioFileDispose(destinationFile!) print("Error 6 in convertAudio: \(error.description)") error = ExtAudioFileDispose(sourceFile!) print("Error 7 in convertAudio: \(error.description)") } 

如果其他人需要一些代码来做到这一点,这是在斯威夫特

 func convertAudioFile(sourceURL: CFURLRef, destinationURL: CFURLRef, outputFormat: OSType , outputSampleRate: Float64) -> OSStatus { var error : OSStatus = noErr var destinationFile : ExtAudioFileRef = nil var sourceFile : ExtAudioFileRef = nil var srcFormat : AudioStreamBasicDescription = AudioStreamBasicDescription() var dstFormat : AudioStreamBasicDescription = AudioStreamBasicDescription() var audioConverter : AudioConverterRef = nil audioConverter = AudioConverterRef.init() ExtAudioFileOpenURL(sourceURL, &sourceFile) var thePropertySize: UInt32 = UInt32(strideofValue(srcFormat)) ExtAudioFileGetProperty(sourceFile, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &srcFormat) dstFormat.mSampleRate = (outputSampleRate == 0 ? srcFormat.mSampleRate : outputSampleRate) //Set sample rate dstFormat.mFormatID = outputFormat dstFormat.mChannelsPerFrame = 1 dstFormat.mBitsPerChannel = 16 dstFormat.mBytesPerPacket = 2 * dstFormat.mChannelsPerFrame dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame dstFormat.mFramesPerPacket = 1 dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger // little-endian //Create destination file ExtAudioFileCreateWithURL(destinationURL, kAudioFileCAFType, &dstFormat, nil, AudioFileFlags.EraseFile.rawValue, &destinationFile) ExtAudioFileSetProperty(sourceFile, kExtAudioFileProperty_ClientDataFormat, thePropertySize, &dstFormat) ExtAudioFileSetProperty(destinationFile, kExtAudioFileProperty_ClientDataFormat, thePropertySize, &dstFormat) var size : UInt32 = UInt32(strideofValue(audioConverter)) ExtAudioFileGetProperty(destinationFile, kExtAudioFileProperty_AudioConverter, &size, &audioConverter) var canResume : UInt32 = 0 size = UInt32(strideofValue(canResume)) error = AudioConverterGetProperty(audioConverter, kAudioConverterPropertyCanResumeFromInterruption, &size, &canResume) let bufferByteSize : UInt32 = 32768 var srcBuffer = [UInt8](count: 32768, repeatedValue: 0) var sourceFrameOffset : ULONG = 0 print("Converting audio file") while(true){ var fillBufList = AudioBufferList( mNumberBuffers: 1, mBuffers: AudioBuffer( mNumberChannels: 2, mDataByteSize: UInt32(srcBuffer.count), mData: &srcBuffer ) ) var numFrames : UInt32 = 0 if(dstFormat.mBytesPerFrame > 0){ numFrames = bufferByteSize / dstFormat.mBytesPerFrame } ExtAudioFileRead(sourceFile, &numFrames, &fillBufList) if(numFrames == 0){ error = noErr; break; } sourceFrameOffset += numFrames error = ExtAudioFileWrite(destinationFile, numFrames, &fillBufList) } ExtAudioFileDispose(destinationFile) ExtAudioFileDispose(sourceFile) let audioAsset = AVURLAsset.init(URL: destinationURL, options: nil) if(audioAsset.duration.seconds < 5.0){ error = -2500 } return error; 

可以使用AVFoundation框架中的AVAssetReader和AVAssetWriter读取AAC文件,并将该数据作为WAV / RIFF文件写入iOS设备。 Apple开发人员网站上有示例代码。 这不仅仅是一小段片断。

这里是@ O2U回答的编辑。 如上面的代码实际上并没有将其转换为波形文件。 请在上面的代码中使用“kAudioFileWAVEType”而不是“kAudioFileCAFType” //Create destination file ExtAudioFileCreateWithURL(destinationURL, kAudioFileCAFType, &dstFormat, nil, AudioFileFlags.EraseFile.rawValue, &destinationFile)

Interesting Posts