[英]How do I use AVAssetWriter to write AAC audio out in ios?
I am using an AVCaptureSession to capture audio and video samples from the devices microphone and camera. 我正在使用AVCaptureSession从设备麦克风和摄像头捕获音频和视频样本。
I am then attempting to write the CMSampleBuffers (Using AVAssetWriter and AVAssetWriterInputs) returned via the AVCaptureSessions delegate method 然后我尝试编写通过AVCaptureSessions委托方法返回的CMSampleBuffers(使用AVAssetWriter和AVAssetWriterInputs)
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer: (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
This works fine when my audio AVAssetWriterInput is configured to write the data out in Apple Lossless format (kAudioFormatAppleLossless) but if i try and configure the audio AVAssetWriterInput to use AAC (kAudioFormatMPEG4AAC) it successfully writes video and audio samples for about 500ms then fails with the following error 当我的音频AVAssetWriterInput配置为以Apple Lossless格式(kAudioFormatAppleLossless)写出数据时,这可以正常工作但是如果我尝试配置音频AVAssetWriterInput以使用AAC(kAudioFormatMPEG4AAC)它成功写入视频和音频样本大约500ms然后失败跟随错误
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}
Here is the code I use to create my AVAssetWriter and AVAssetWriterInputs 这是我用来创建AVAssetWriter和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];
Does anyone know how to correctly write audio samples returned from AVCaptureSession using an AVAssetWriterInput configured to write AAC? 有没有人知道如何使用配置为写入AAC的AVAssetWriterInput正确编写从AVCaptureSession返回的音频样本?
I managed to get it to work by changing the AVEncoderBitRateKey parameter passed as the desired output settings from 96 to 64000. 我设法通过将AVEncoderBitRateKey参数更改为96到64000的所需输出设置来使其工作。
My audio settings for initializing an AVAssetWriterInput capable of writing AAC audio now looks like 我现在用于初始化能够编写AAC音频的AVAssetWriterInput的音频设置如下所示
NSDictionary* audioOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[ NSNumber numberWithInt: 1 ], AVNumberOfChannelsKey,
[ NSNumber numberWithFloat: 44100.0 ], AVSampleRateKey,
[ NSData dataWithBytes: &acl length: sizeof( AudioChannelLayout ) ], AVChannelLayoutKey,
[ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey,
nil]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.