2013-10-01 3 views
2

. 오디오를 .caf 형식으로 녹음하고 나중에 .wav로 변환하여 파일을 보관 용 계정으로 업로드해야합니다. iOS에서 파일을 wav 형식으로 변환하려면 어떻게해야합니까?.caf 파일을 ios의 진행률 막대가있는 .wav 파일로 변환합니다.

  • 직접 형식을 .WAV 나는 오디오 녹음을 원하지 않는

  • 변환 내가 변환 진행 막대를 구현해야 더 많은 시간이 소요하면서 파일을

  • 를 .WAV하는 .CAF 변환하는 방법

답변

7

-(void) convertToWav 
{ 
// set up an AVAssetReader to read from the iPod Library 

NSString *cafFilePath=[[NSBundle mainBundle]pathForResource:@"test" ofType:@"caf"]; 

NSURL *assetURL = [NSURL fileURLWithPath:cafFilePath]; 
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

NSError *assetError = nil; 
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:songAsset 
                  error:&assetError] 
; 
if (assetError) { 
    NSLog (@"error: %@", assetError); 
    return; 
} 

AVAssetReaderOutput *assetReaderOutput = [AVAssetReaderAudioMixOutput 
              assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks 
              audioSettings: nil]; 
if (! [assetReader canAddOutput: assetReaderOutput]) { 
    NSLog (@"can't add reader output... die!"); 
    return; 
} 
[assetReader addOutput: assetReaderOutput]; 

NSString *title = @"MyRec"; 
NSArray *docDirs = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docDir = [docDirs objectAtIndex: 0]; 
NSString *wavFilePath = [[docDir stringByAppendingPathComponent :title] 
         stringByAppendingPathExtension:@"wav"]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:wavFilePath]) 
{ 
    [[NSFileManager defaultManager] removeItemAtPath:wavFilePath error:nil]; 
} 
NSURL *exportURL = [NSURL fileURLWithPath:wavFilePath]; 
AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:exportURL 
                 fileType:AVFileTypeWAVE 
                 error:&assetError]; 
if (assetError) 
{ 
    NSLog (@"error: %@", assetError); 
    return; 
} 

AudioChannelLayout channelLayout; 
memset(&channelLayout, 0, sizeof(AudioChannelLayout)); 
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; 
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
           [NSNumber numberWithFloat:44100.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]; 
      convertedByteCount += CMSampleBufferGetTotalSampleSize (nextBuffer); 
      CMTime progressTime = CMSampleBufferGetPresentationTimeStamp(nextBuffer); 

      CMTime sampleDuration = CMSampleBufferGetDuration(nextBuffer); 
      if (CMTIME_IS_NUMERIC(sampleDuration)) 
       progressTime= CMTimeAdd(progressTime, sampleDuration); 
      float dProgress= CMTimeGetSeconds(progressTime)/CMTimeGetSeconds(songAsset.duration); 
      NSLog(@"%f",dProgress); 
     } 
     else 
     { 

      [assetWriterInput markAsFinished]; 
      //    [assetWriter finishWriting]; 
      [assetReader cancelReading]; 

     } 
    } 
}]; 
} 
시도 표준 WAV 파일로 보여 -i3210
+0

는 FFmpeg : 재생 시간 : 00 : 03 : 34.98, 비트 전송률 : 오디오 : pcm_s16le, 44100 Hz에서, 스테레오, S16, 1,411킬로바이트/s의 /s의 스트림 # 0.0 1,411킬로바이트 그러나 리눅스 미디어 플레이어는 생성 된 파일을 wav 파일로 인식하지 못합니다. – loretoparisi

+0

이 작업을 수행 할 때 파일이 기록되지만 여러 미디어 플레이어에서 반환되는 길이는 0입니다. U는 16 진수 편집기를 사용하고 "데이터"청크가 0 인 후 4 바이트를 표시합니다. 샘플의 길이. 내가 추가했습니다. [assetWriter finishWritingWithCompletionHandler : ^ { }]; 해당 문제를 해결 한 것으로 보이는 [assetReader cancelReading] 이후 – cncool

관련 문제