- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在捕捉相机画面并将其写入电影。我遇到的问题是,在导出电影之后,它前面有几秒钟的黑色(相对于实际录制开始时间)。
我认为这与[self.assetWriter startSessionAtSourceTime:kCMTimeZero];
有关通过在 samplebuffer 委托(delegate)方法中增加一个 frameStart 变量,我得到了一个半工作解决方案。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
frameStart++;
if (self.startRecording == YES) {
static int64_t frameNumber = 0;
if(self.assetWriterInput.readyForMoreMediaData) {
[self.pixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:CMTimeMake(frameNumber, 25)];
}
frameNumber++;
}
}
然后在用户按下按钮时调用此方法:
[self.assetWriter startSessionAtSourceTime:CMTimeMake(frameStart,25)];
这行得通。但只有一次……如果我想录制第二部电影,黑框又回来了。
此外,当我查看输出的电影时,帧速率是 25fps,就像我想要的那样。但视频看起来好像被加速了。好像框架之间没有足够的空间。所以电影播放速度大约是原来的两倍。
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:640], AVVideoWidthKey, [NSNumber numberWithInt:480], AVVideoHeightKey, AVVideoCodecH264, AVVideoCodecKey, nil];
self.assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings];
self.assetWriterInput.expectsMediaDataInRealTime = YES;
最佳答案
您不需要自己计算帧时间戳。您可以使用
获取当前样本的时间戳CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
但是,在我看来,您只是将帧的像素缓冲区未经修改地传递给适配器。像下面这样将样本缓冲区本身直接传递给 assetWriterInput
不是更容易吗?
[self.assetWriterInput appendSampleBuffer:sampleBuffer];
关于ios - AVAssetWriter/AVAssetWriterInputPixelBufferAdaptor - 黑帧和帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26712985/
我使用下面的代码将图像写入视频 -(void) writeImagesToMovieAtPath:(NSString *) path withSize:(CGSize) size { NSLo
我确定我的缓冲区属性有问题,但我不清楚是什么 -- 没有很好地记录应该去那里的内容,所以我猜测基于 CVPixelBufferPoolCreate -- Core Foundation 对我来说几乎是
我正在尝试制作一个应用程序来记录 UIImageView 的内容以及麦克风音频,并将它们实时记录到视频中。 (有点像会说话的汤姆猫应用程序) 我正在使用 AVAssetWriterInputPixel
我正在捕捉相机画面并将其写入电影。我遇到的问题是,在导出电影之后,它前面有几秒钟的黑色(相对于实际录制开始时间)。 我认为这与[self.assetWriter startSessionAtSourc
我将 CVPixelBufferRefs 附加到连接到 AVAssetWriterInput 的 AVAssetWriterInputPixelBufferAdaptor 以使用 AVAssetWri
我正在尝试以预期的帧速率将 CVPixelBuffers 附加到 AVAssetWriterInputPixelBufferAdaptor,但它似乎太快了,而且我的数学失败了。这不是从相机捕捉,而是捕
我正在使用 AVAssetWriterInputPixelBufferAdaptor 将一些帧写入视频,并且行为 w.r.t.时间不是我所期望的。 如果我只写一帧: [videoWriter sta
我正在尝试使用为 encoding asset writer 提供的示例的组合。以及 pixelBufferFromCGImage 提供的样本在我正在导出的 AVAsset 上覆盖 UIImage。
我在 AVAssetWriterInputPixelBufferAdaptor 中使用 pixelBufferPool 来创建像素缓冲区以与 append 方法一起使用。创建4个buffer后,pix
我正在从一组图像创建一个视频文件。我能够在模拟器上创建视频文件,但是当我尝试在设备上运行相同的代码时,它会出现以下错误: NSURLErrorDomain Code=-3000 "Cannot cre
我已经使用以下代码成功地从图像创建了视频 -(void)writeImageAsMovie:(NSArray *)array toPath:(NSString*)path size:(CGSize)s
我正在尝试使用 ReplayKit 记录我的应用程序的屏幕,在录制视频时裁剪掉其中的某些部分。不太顺利。 ReplayKit 将捕获整个屏幕,因此我决定从 ReplayKit 接收每一帧(作为 CMS
我是一名优秀的程序员,十分优秀!