2012-02-09 2 views
1

녹음 된 .caf 파일을 .wav 파일로 변환하고 싶습니다. 나는 두 개의 매개 변수 설정에 붙어 상기 방법에.caf를 .wav 형식으로 변환하는 데 필요한 매개 변수는 무엇입니까?

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

사용하려고 M, 난 AudioStreamBasicDescription * 및 정보 흐름의 UInt32 inFlags,AudioFileID *outAudioFile
CONST에 설정해야하는 파라미터 의미한다. (NSDictionary *) 설정, 내가 설정하거나 파일을 .WAV하는 .caf에서 변환에 사용 할 필요가있는 매개 변수를 의미 :

그리고 배치에

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

가 다시 내가 설정에 붙어 방법에 따라 사용 노력하고있어.

아이폰에 다른 해결책이 있다면 저에게주세요.

답변

3

// 여기에 당신이 파일

-(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] 어떤 아이디어를 허위 얻고 .caf 저장된 파일 경로를 보내? 기기 iPhone 6, Xcode 8, iOS 10 –

관련 문제