2012-02-09 49 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

相關問題