2011-12-18 17 views
3

みんな! 私はアプリを扱っています。オーディオファイルとメールを他の人に録音することができます。オーディオファイルは(.aac)ファイルとして保存されます。その後、私はすでに.aacファイルとして保存した録音を続けます。 AVAssetReaderとAVAssetWriterを使用してそれを作成しました。しかし、私は失敗しました!以下は、私のコードです:AVAssetReaderとAVAssetWriterを使用してAACファイルを作成するにはどうすればよいですか?

AVMutableComposition *mixComposition = [AVMutableComposition composition]; 
NSURL *url = [NSURL fileURLWithPath:[DOCUMENTS_FOLDER stringByAppendingPathComponent:buttonTitle]]; 
NSURL *anotherUrl = [NSURL fileURLWithPath:[DOCUMENTS_FOLDER stringByAppendingPathComponent:[fileList objectAtIndex:0]]]; 


CMTime nextClipStartTime = kCMTimeZero; 
AVURLAsset *preAudioAsset = [[AVURLAsset alloc]initWithURL:url options:nil]; 
CMTimeRange preTimeRange = CMTimeRangeMake(kCMTimeZero, preAudioAsset.duration); 
AVMutableCompositionTrack *preCompositonTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[preCompositonTrack insertTimeRange:preTimeRange ofTrack:[[preAudioAsset tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

nextClipStartTime = CMTimeAdd(nextClipStartTime, preAudioAsset.duration); 
AVURLAsset *cruAudioAsset = [[AVURLAsset alloc]initWithURL:anotherUrl options:nil]; 
CMTimeRange cruTimeRange = CMTimeRangeMake(kCMTimeZero, cruAudioAsset.duration); 
[preCompositonTrack insertTimeRange:cruTimeRange ofTrack:[[cruAudioAsset tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

//AVAssetReader part 
NSError *error; 
AVAssetReader *assetReader = [[AVAssetReader assetReaderWithAsset:mixComposition error:&error]retain]; 
if(error) 
{ 
    NSLog(@"error:%@",error); 

} 
AVAssetTrack *audioTrack = [[mixComposition.tracks objectAtIndex:0]retain]; 
AVAssetReaderOutput *assetReaderOutput =[[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil]retain]; 
if(![assetReader canAddOutput:assetReaderOutput]) 
{ 
    NSLog(@"Can't add output!"); 
    return; 
} 
[assetReader addOutput:assetReaderOutput]; 

NSURL *exportUrl = [NSURL fileURLWithPath:[DOCUMENTS_FOLDER stringByAppendingPathComponent:@"combine.aac"]]; 

//AVAssetWriter part 
AVAssetWriter *assetWriter = [[AVAssetWriter assetWriterWithURL:exportUrl fileType:AVFileTypeMPEG4 error:&error]retain]; 
if(error) 
{ 
    NSLog(@"error:%@",error); 
    return; 
} 
AudioChannelLayout channelLayout; 
memset(&channelLayout, 0, sizeof(AudioChannelLayout)); 
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; 
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
           [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
           [ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey, 
           [ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey, 
           [ NSData dataWithBytes: &channelLayout length: sizeof(AudioChannelLayout) ], AVChannelLayoutKey, 
           [ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey, 
           nil]; 
AVAssetWriterInput *assetWriterInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:outputSettings]retain]; 
if([assetWriter canAddInput:assetWriterInput]) 
{ 
    [assetWriter addInput:assetWriterInput]; 
} 
else 
{ 
    NSLog(@"can't add asset writer input ....."); 
    return; 
} 
assetWriterInput.expectsMediaDataInRealTime = NO; 
[assetWriter startWriting]; 
[assetReader startReading]; 
CMTime startTime = CMTimeMake(0, audioTrack.naturalTimeScale); 
[assetWriter startSessionAtSourceTime:startTime]; 

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]; 

     } 
     else 
     { 
      [assetWriterInput markAsFinished]; 
      [assetWriter finishWriting]; 
      [assetReader cancelReading]; 
      [assetReader release]; 
      [assetReaderOutput release]; 
      [assetWriter release]; 
      [assetWriterInput release]; 
      break; 
     } 
    } 
} ]; 

私はちょうど別のファイルを記録すると、前のへの以降を追加するが、エラーがあります: - [AVAssetWriterInput appendSampleBuffer:]入力バッファはときリニアPCM形式でなければなりませんoutputSettingsはゼロではありません '

私は正しいと思いますか? PCM形式(.wav)にするとうまくいきますが、記録されたファイルのサイズが大きすぎます。エラーを解決するにはどうすればいいですか? .wavを.aacファイルに変換する方法は? !次のカスタム設定で

+1

あなたはこの解決策を見つけましたか? – Baza207

答えて

1

てみinitをAVAssetReaderOutput

NSDictionary *settings = 
    [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
    [NSNumber numberWithFloat:44100.0], AVSampleRateKey, 
    [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, 
    [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, 
    [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey, 
    [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, 
    nil]; 
関連する問題