Diu*_*eus 7 iphone camera avfoundation ios avcapturesession
我正试图在iPhone 5s上以最高分辨率(AVCaptureSessionPresetPhoto)拍摄多张照片.我尝试使用以下代码:
dispatch_semaphore_t sync = dispatch_semaphore_create(0);
while( [self isBurstModeEnabled] == YES )
{
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
if (imageSampleBuffer != NULL)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
NSString *videoThumbPath = [NSString
stringWithFormat:@"%@/img%d.png",
burstFolderPath,
index];
[imageData writeToFile:videoThumbPath atomically:YES];
if( 0 == index )
{
[self NSLogPrint:[NSString stringWithFormat:@"Created photo at %@",videoThumbPath]];
}
}
dispatch_semaphore_signal(sync);
}];
dispatch_semaphore_wait(sync, DISPATCH_TIME_FOREVER);
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我每秒可以获得大约2张照片,无法接近原生相机应用程序的突发模式的性能.我究竟做错了什么?此外,我尝试使用上面的代码没有信号量,但在这种情况下,我有奇怪的行为,一些照片丢失(img0.png img1.png img3.png将存在,但img2.png将丢失).使用第二种方法,性能会更好,但仍然不能与原生应用程序性能相媲美(在我的测试中,相机应用程序每秒会产生大约8.4张照片).
Wil*_*ker 16
captureStillImageAsynchronouslyFromConnection:completionHandler: 我认为,不是苹果正在使用其突发模式.
相反,Apple正以全分辨率抓取视频帧(由5s支持).这是如何做:
该AVCaptureDevice具有其activeFormat设置为全传感器分辨率,则抓住并每秒处理从10帧AVCaptureVideoDataOutputSampleBufferDelegate的captureOutput:didOutputSampleBuffer:fromConnection:,发射关闭各帧抓取一个快门声音.
你需要有一个回退(或较低分辨率图像或较慢的突发模式),对于不以完整的传感器尺寸支持视频设备的分辨率和/或如果你想支持什么比旧的iOS版7.x版本
请注意,如果captureStillImageAsynchronouslyFromConnection:completionHandler:没有一些非常意外的结果,您将无法进行多次并发使用.这就是为什么你应该从前一个迭代调用每个迭代completionHandler(实际上,这是你的信号量正在做的事情).此外,您可能希望从PNG转换为文件格式连拍影像,这样可以节省非常缓慢,需要大量的系统资源,最多叠加15个或20 PNG图像可能会导致你一些严重的悲伤!
*它可能正在这样做,因为它当然可能使用私有API来实现相同的最终结果.
| 归档时间: |
|
| 查看次数: |
5119 次 |
| 最近记录: |