iOS-音频格式转换-b

iOS处理音频过程中有时候需要不同格式的音频进行转换,最近需要将m4a格式的音频转换成wav,在网上搜索之后代码整理如下:

- (void)convetM4aToWav:(NSURL *)originalUrl  destUrl:(NSURL *)destUrl {    
    AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:originalUrl options:nil];    //读取原始文件信息     
    NSError *error = nil;    
    AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:songAsset error:&error];    
    if (error) {        
        NSLog (@"error: %@", error);        
        return;     
    }    
    AVAssetReaderOutput *assetReaderOutput = [AVAssetReaderAudioMixOutput                                                assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks                                                audioSettings: nil];    
    if (![assetReader canAddOutput:assetReaderOutput]) {        
        NSLog (@"can't add reader output... die!");        
        return;     
    }     
    [assetReader addOutput:assetReaderOutput];    

    AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:destUrl                                                            fileType:AVFileTypeCoreAudioFormat                                                               error:&error];    
    if (error) {        
        NSLog (@"error: %@", error);        
        return;     
    }     
    AudioChannelLayout channelLayout;     
    memset(&channelLayout, 0, sizeof(AudioChannelLayout));     
    channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;    

    NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:                                     [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey,                                     [NSNumber numberWithFloat:16000.0], AVSampleRateKey,                                     [NSNumber numberWithInt:2], AVNumberOfChannelsKey,                                     [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey,                                     [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,                                     [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,                                     [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,                                     [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,                                    nil];    AVAssetWriterInput *assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio                                                                                outputSettings:outputSettings];    
    if ([assetWriter canAddInput:assetWriterInput]) {         
        [assetWriter addInput:assetWriterInput];     
    } else {        
        NSLog (@"can't add asset writer input... die!");        
        return;     
    }      
    assetWriterInput.expectsMediaDataInRealTime = NO;      
    [assetWriter startWriting];     
    [assetReader startReading];    
    AVAssetTrack *soundTrack = [songAsset.tracks objectAtIndex:0];     
    CMTime startTime = CMTimeMake (0, soundTrack.naturalTimeScale);     
    [assetWriter startSessionAtSourceTime:startTime];      
    __block UInt64 convertedByteCount = 0;    
    dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);     
    [assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue                                             usingBlock: ^      {         
        while (assetWriterInput.readyForMoreMediaData) {              
            CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];             
            if (nextBuffer) {                 
                // append buffer                  
                [assetWriterInput appendSampleBuffer: nextBuffer];                 

                NSLog (@"appended a buffer (%zu bytes)",                                      CMSampleBufferGetTotalSampleSize (nextBuffer));                  
                convertedByteCount += CMSampleBufferGetTotalSampleSize (nextBuffer);                
             } else {                  
                 [assetWriterInput markAsFinished];                  
                 [assetWriter finishWritingWithCompletionHandler:^{                   
                 }];                  
                 [assetReader cancelReading];                 

                 NSDictionary *outputFileAttributes = [[NSFileManager defaultManager]                                                        attributesOfItemAtPath:[destUrl path]                                                        error:nil];                 
                NSLog (@"FlyElephant %lld",[outputFileAttributes fileSize]);                 

                break;              
            }          
         }       
    }]; 
}

参考链接:http://subfurther.com/blog/2010/12/13/from-ipod-library-to-pcm-samples-in-far-fewer-steps-than-were-previously-necessary/

posted on 2016-09-21 00:10  🌞Bob  阅读(876)  评论(0编辑  收藏  举报

导航