AVAssetWriter无法录制音频。

3
我在使用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];
   }
 }

非常感谢您的帮助,我一整天都被这个问题困扰着。

1个回答

3
我看不到你调用了[videoWriter startSessionAtSourceTime],同时当audioWriterInput没有准备好时,你丢弃了音频样本缓冲区(这可能不是你想要的结果)。
因此,你的问题在于你所写出的PTS(演示时间戳)。你可以使用startSessionAtSourceTime告诉输出你的时间轴从给定的时间t开始,或者修改你附加的缓冲区,使其具有基于零的演示时间戳。

AVCaptureAudioDataOutput 上找不到 startSessionAtSourceTime 函数。您是不是想要其他的函数? - Werner Kratochwil
是的,这个问题涉及到AVAssetWriter,它是一个用于编码音频和视频文件的类,而你正在询问AVCaptureAudioDataOutput,它是用于从麦克风捕获音频的。您可以使用AVAssetWriter将使用AVCaptureAudioDataOutput捕获的音频写入文件,在这种情况下,您需要将捕获的缓冲区时间戳传递给startSessionAtSourceTime - Rhythmic Fistman
所以你的意思是要写 [assetWriter startSessionAtSourceTime] - Werner Kratochwil
哎呀,我搞混了 AVAssetWriter 和它的 AVAssetWriterInput。已经修复了。 - Rhythmic Fistman
2
我在我的代码中调用了 [videoWriter startSessionAtSourceTime],但仍然没有音频。仍在寻找答案。还有其他人在2018年(使用Swift 4.0)遇到过这个问题吗? - JCutting8
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接