2012-02-09 9 views
1

録音した.cafファイルを.wavファイルに変換します。私は、私は2つのパラメータを設定するに引っかかって、上記の方法で.cafを.wav形式に変換するためのパラメータが必要ですか?

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

を使用しようとしてM、私はAudioStreamBasicDescription * inFormatとUInt32 inFlags,AudioFileID *outAudioFile
のconstに設定する必要がどのパラメータを意味します。

と配置に私が使用し、以下の方法

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

をしようとしてM Iは、設定に立ち往生:(NSDictionary *)設定を、私は、ファイルをた.wav .cafからの変換に設定するか、または使用されなければならないパラメータを意味します。

iphoneに他のソリューションがあれば教えてください。

答えて

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 –

関連する問題