みんな! 私はアプリを扱っています。オーディオファイルとメールを他の人に録音することができます。オーディオファイルは(.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ファイルに変換する方法は? !次のカスタム設定で
あなたはこの解決策を見つけましたか? – Baza207