Używam AVCaptureSession do przechwytywania próbek audio i wideo z mikrofonu urządzenia i kamery.Jak używać AVAssetWriter do zapisu dźwięku AAC w ios?
jestem następnie próbuje pisać CMSampleBuffers (używając AVAssetWriter i AVAssetWriterInputs) powrócił metodą AVCaptureSessions delegata
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer: (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
Działa to dobrze, gdy mój dźwięk AVAssetWriterInput jest skonfigurowany tak, aby zapisywać dane w formacie Apple Lossless (kAudioFormatAppleLossless), ale gdy próbuję i skonfigurować AVAssetWriterInput audio do korzystania AAC (kAudioFormatMPEG4AAC) z powodzeniem pisze próbek audio i wideo przez około 500ms wtedy nie powiedzie się z powodu następującego błędu
writer has failed with Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode" UserInfo=0x4b2630 {NSLocalizedFailureReason=The media data could not be decoded. It may be damaged., NSUnderlyingError=0x4ad0f0 "The operation couldn’t be completed. (OSStatus error 560226676.)", NSLocalizedDescription=Cannot Decode}
Oto kod używać do tworzenia mojego AVAssetWriter i AVAssetWriterInputs
NSError *error = nil;
m_VideoCaputurePath = [[NSString stringWithFormat:@"%@/%@.mp4",[UserData getSavePath],[UserData getUniqueFilename]] retain];
if(USE_AAC_AUDIO)
{
m_audioAndVideoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:m_VideoCaputurePath] fileType:AVFileTypeMPEG4 error:&error];
}
else
{
m_audioAndVideoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:m_VideoCaputurePath] fileType:AVFileTypeQuickTimeMovie error:&error];
}
//\Configure Video Writer Input
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:640], AVVideoWidthKey,
[NSNumber numberWithInt:480], AVVideoHeightKey,
nil];
m_videoWriterInput = [[AVAssetWriterInput
assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings] retain];
m_videoWriterInput.expectsMediaDataInRealTime = YES;
//\Configure Audio Writer Input
AudioChannelLayout acl;
bzero(&acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
NSDictionary* audioOutputSettings;
if(USE_AAC_AUDIO)
{
audioOutputSettings = [ NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey,
[ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey,
[ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey,
[ NSData dataWithBytes: &acl length: sizeof(acl) ], AVChannelLayoutKey,
[ NSNumber numberWithInt: 96 ], AVEncoderBitRateKey,
nil];
}
else
{
audioOutputSettings = [ NSDictionary dictionaryWithObjectsAndKeys:
[ NSNumber numberWithInt: kAudioFormatAppleLossless ], AVFormatIDKey,
[ NSNumber numberWithInt: 16 ], AVEncoderBitDepthHintKey,
[ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey,
[ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey,
[ NSData dataWithBytes: &acl length: sizeof(acl) ], AVChannelLayoutKey, nil ];
}
m_audioWriterInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:audioOutputSettings] retain];
m_audioWriterInput.expectsMediaDataInRealTime = YES;
//\Add inputs to Write
NSAssert([m_audioAndVideoWriter canAddInput:m_audioWriterInput], @"Cannot write to this type of audio input");
NSAssert([m_audioAndVideoWriter canAddInput:m_videoWriterInput], @"Cannot write to this type of video input");
[m_audioAndVideoWriter addInput:m_videoWriterInput];
[m_audioAndVideoWriter addInput:m_audioWriterInput];
Czy ktoś wie jak poprawnie napisać próbki dźwiękowe wrócił z AVCaptureSession stosując AVAssetWriterInput skonfigurowany napisać AAC?
Wraz z nowym iPhone'em 4s musiałem również zmienić AVNumberOfChannelsKey na 2 – RyanSullivan
Po prostu nie mogłem tego rozgryźć! Wiedziałem, że ma to coś wspólnego z opcjami, ale nie wiedział dokładnie, co. Dzięki za to! –