2012-02-09 61 views
1

我想ti将录制的.caf文件转换成.wav文件。我米试图在上面的方法我坚持上设置双参数使用将.caf转换为.wav格式所需的参数?

OSStatus AudioFileCreateWithURL(CFURLRef inFileRef, AudioFileTypeID inFileType,const AudioStreamBasicDescription *inFormat, UInt32 inFlags,AudioFileID *outAudioFile); 

,我的意思是我在
常量AudioStreamBasicDescription *了信息和UInt32 inFlags,AudioFileID *outAudioFile要设置的参数。

而在放置读音字尝试使用以下的方法

- (id)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError **)outError 

我再次粘贴在设置:(NSDictionary *)设置,我的意思是我必须设置或用于从转化的.caf为.wav文件,该文件的参数。

请给我,如果任何其他解决方案存在于iPhone?

回答

3

//这里给您存储文件的.caf

-(BOOL)exportAssetAsWaveFormat:(NSString*)filePath     
{ 
    NSError *error = nil ; 

    NSDictionary *audioSetting = [NSDictionary dictionaryWithObjectsAndKeys: 
            [ NSNumber numberWithFloat:44100.0], AVSampleRateKey, 
            [ NSNumber numberWithInt:2], AVNumberOfChannelsKey, 
            [ NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, 
            [ NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
            [ NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, 
            [ NSNumber numberWithBool:0], AVLinearPCMIsBigEndianKey, 
            [ NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, 
            [ NSData data], AVChannelLayoutKey, nil ]; 

    NSString *audioFilePath = filePath; 
    AVURLAsset * URLAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:audioFilePath] options:nil]; 

    if (!URLAsset) return NO ; 

    AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:URLAsset error:&error]; 
    if (error) return NO; 

    NSArray *tracks = [URLAsset tracksWithMediaType:AVMediaTypeAudio]; 
    if (![tracks count]) return NO; 

    AVAssetReaderAudioMixOutput *audioMixOutput = [AVAssetReaderAudioMixOutput 
                assetReaderAudioMixOutputWithAudioTracks:tracks 
                audioSettings :audioSetting]; 

    if (![assetReader canAddOutput:audioMixOutput]) return NO ; 

    [assetReader addOutput :audioMixOutput]; 

    if (![assetReader startReading]) return NO; 



    NSString *title = @"WavConverted"; 
    NSArray *docDirs = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docDir = [docDirs objectAtIndex: 0]; 
    NSString *outPath = [[docDir stringByAppendingPathComponent :title] 
         stringByAppendingPathExtension:@"wav" ]; 

    NSURL *outURL = [NSURL fileURLWithPath:outPath]; 
    AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:outURL 
                  fileType:AVFileTypeWAVE 
                  error:&error]; 
    if (error) return NO; 

    AVAssetWriterInput *assetWriterInput = [ AVAssetWriterInput assetWriterInputWithMediaType :AVMediaTypeAudio 
                       outputSettings:audioSetting]; 
    assetWriterInput. expectsMediaDataInRealTime = NO; 

    if (![assetWriter canAddInput:assetWriterInput]) return NO ; 

    [assetWriter addInput :assetWriterInput]; 

    if (![assetWriter startWriting]) return NO; 


    [assetReader retain]; 
    [assetWriter retain]; 

    [assetWriter startSessionAtSourceTime:kCMTimeZero ]; 

    dispatch_queue_t queue = dispatch_queue_create("assetWriterQueue", NULL); 

    [assetWriterInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{ 

     NSLog(@"start"); 

     while (1) 
     { 
      if ([assetWriterInput isReadyForMoreMediaData]) { 

       CMSampleBufferRef sampleBuffer = [audioMixOutput copyNextSampleBuffer]; 

       if (sampleBuffer) { 
        [assetWriterInput appendSampleBuffer :sampleBuffer]; 
        CFRelease(sampleBuffer); 
       } else { 
        [assetWriterInput markAsFinished]; 
        break; 
       } 
      } 
     } 

     [assetWriter finishWriting]; 
     [assetReader release ]; 
     [assetWriter release ]; 

     NSLog(@"finish"); 
    }]; 

    dispatch_release(queue); 
} 
+0

我越来越假以[assetWriter startWriting],任何想法,你的文件的路径?设备iPhone 6,Xcode 8,iOS 10 – 2016-11-11 07:30:13