2016-03-02 379 views
0

有没有人有任何代码片段显示如何将M4a文件转换为WAV?我知道有些库可以用其他方式进行转换。iOS代码将m4a转换为WAV

谢谢。

+0

看到这一次可能是它可以帮助你http://stackoverflow.com/questions/31452202/ios-swift-merge-and-convert-wav-files-to-mp3 –

回答

3

如果别人需要一些代码来做到这一点这是斯威夫特

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; 
+1

如果我想将m4a文件转换为wav文件,应该传递哪个'OSType'和'outputSampleRate'? – Cesare

+0

是的。你想使用OSType的kAudioFormatLinearPCM和outputSampleRate 16000 – O2U

+0

非常旧的代码,Swift 3有很多变化。 –

0

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

+0

谢谢使用,这就是我现在正在处理的内容。我将代码转换为Swift,因为示例代码使用的是C++。 – O2U

0

下面是编辑为@ O2U的answere。由于上述代码实际上并未将其转换为波形文件。请在上面的代码中使用“kAudioFileWAVEType”而不是“kAudioFileCAFType”在行//Create destination file ExtAudioFileCreateWithURL(destinationURL, kAudioFileCAFType, &dstFormat, nil, AudioFileFlags.EraseFile.rawValue, &destinationFile)

+0

你改变了别的吗?当我使用'kAudioFileWAVEType'时,没有设置destinationFile' –

+0

不,没有改变这个。请检查您的目标网址是否正确,这可能是目标文件未设置时的问题。 –

6

只是为了更新斯威夫特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)") 
} 
+0

太棒了!谢谢!希望我可以投票10次。 –

+0

除了使用kAudioFileMP3Type以外,还有其他更改导出到MP3吗?我在错误= ExtAudioFileSetProperty(destinationFile!)时遇到了错误=使用MP3类型 – miOS

+0

您可能需要尝试不同的mFormatFlags。您会注意到,除了kAudioFileMP3Type之外,这是一个与已接受的答案之间的区别。 – MScottWaller