我在使用iPhone上的AVAssetWriter录制视频时遇到了音频录制问题。我可以轻松地从手机摄像头录制视频,但是当我尝试添加音频时,什么都没有录制下来。此外,照片相册应用程序中显示的持续时间非常不正常,一个4秒钟的视频将显示为15:54:01之类的东西,每个后续视频的数字都会增加,即使视频更短也是如此。我一直在尝试遵循其他问题中所看到的内容,但没有成功。
以下是我设置音频输入的方式:
以下是我设置音频输入的方式:
captureSession = [[AVCaptureSession alloc] init];
//set up audio input
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio];
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error ];
audioOutput = [[AVCaptureAudioDataOutput alloc] init];
if([captureSession canAddOutput:audioOutput])
{
[captureSession addOutput:audioOutput];
}
[audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
这是我设置AVAssetWriter的方式:
videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:MOVIE_PATH] fileType:AVFileTypeQuickTimeMovie error:&error];
AudioChannelLayout acl;
bzero( &acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
NSDictionary* audioOutputSettings = 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: 64000 ], AVEncoderBitRateKey,
nil];
然后这里是我如何使用由音频输出回调发送的CMSampleBufferRef编写音频样本缓冲区的方法。
- (void) captureAudio:(CMSampleBufferRef)sampleBuffer
{
if([audioWriterInput isReadyForMoreMediaData]){
[audioWriterInput appendSampleBuffer:sampleBuffer];
}
}
非常感谢您的帮助,我一整天都被这个问题困扰着。
AVAssetWriter
,它是一个用于编码音频和视频文件的类,而你正在询问AVCaptureAudioDataOutput
,它是用于从麦克风捕获音频的。您可以使用AVAssetWriter
将使用AVCaptureAudioDataOutput
捕获的音频写入文件,在这种情况下,您需要将捕获的缓冲区时间戳传递给startSessionAtSourceTime
。 - Rhythmic Fistman[assetWriter startSessionAtSourceTime]
。 - Werner KratochwilAVAssetWriter
和它的AVAssetWriterInput
。已经修复了。 - Rhythmic Fistman