我无法在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];
然后是如何使用由audioOutput回调发送的CMSampleBufferRef编写音频样本缓冲区
- (void) captureAudio:(CMSampleBufferRef)sampleBuffer
{
if([audioWriterInput isReadyForMoreMediaData]){
[audioWriterInput appendSampleBuffer:sampleBuffer];
}
}
非常感谢任何帮助,我一整天都被困在这里。
答案 0 :(得分:3)
我没有看到你正在调用[videoWriter startSessionAtSourceTime]
,当audioWriterInput
没有准备就绪时你也丢弃了音频样本缓冲区(这可能不是你想要的)。
所以你的问题在于你所写出来的PTS(演示时间戳)。您可以告诉输出您的时间轴在startSessionAtSourceTime
的给定时间t开始,或者您可以修改附加的缓冲区,使其基于零的presentationTimeStamps。