![](/img/trans.png)
[英]Setting a low frame rate of AVCaptureDevice in AVCaptureSession in Swift
[英]CaptureOutput delegate function to run as fast as AVCaptureDevice's frame rate
目前,我有一個帶有AVCaptureVideoDataOutput的AVCaptureSession。 據我了解,每次相機捕獲一幀時都會調用captureOutput委托函數。 默認情況下,這意味着將以30fps的速度調用captureOutput函數。
我還有一個CMMotionManager,用於在手機移動時存儲數據。 運動管理器的運行速度約為90-100fps。
無論如何,我是否可以提高相機在幀中拍攝的fps,以便以與motionManager大致相同的速度調用captureOutput函數?
任何幫助,將不勝感激。
來自Apple 文檔
以下代碼示例說明了如何選擇iOS設備的最高可能幀頻
- (void)configureCameraForHighestFrameRate:(AVCaptureDevice *)device
{
AVCaptureDeviceFormat *bestFormat = nil;
AVFrameRateRange *bestFrameRateRange = nil;
for ( AVCaptureDeviceFormat *format in [device formats] ) {
for ( AVFrameRateRange *range in format.videoSupportedFrameRateRanges ) {
if ( range.maxFrameRate > bestFrameRateRange.maxFrameRate ) {
bestFormat = format;
bestFrameRateRange = range;
}
}
}
if ( bestFormat ) {
if ( [device lockForConfiguration:NULL] == YES ) {
device.activeFormat = bestFormat;
device.activeVideoMinFrameDuration = bestFrameRateRange.minFrameDuration;
device.activeVideoMaxFrameDuration = bestFrameRateRange.minFrameDuration;
[device unlockForConfiguration];
}
}
}
為了解決此問題,我更改了AVCaptureDevice的幀速率,就像本文中的最后一個答案一樣: AVCapture捕獲並在iOS 7中以60 fps的速度獲取幀緩沖
為了使captureOutput函數以與攝像機相同的速度運行,您必須在更改AVCaptureDevice的幀頻之前添加AVCaptureDeviceInput。
這就是Swift 3的代碼最終外觀:
do{
input = try AVCaptureDeviceInput(device: backCamera)
if (error == nil && (captureSession?.canAddInput(input))!)
{
captureSession?.addInput(input)
}
var finalFormat = AVCaptureDeviceFormat()
var maxFPS: Double = 0
for vformat in (backCamera?.formats)!{
var ranges = (vformat as AnyObject).videoSupportedFrameRateRanges as! [AVFrameRateRange]
let frameRates = ranges[0]
if frameRates.maxFrameRate >= maxFPS && frameRates.maxFrameRate <= 120.0{
maxFPS = frameRates.maxFrameRate
finalFormat = vformat as! AVCaptureDeviceFormat
}
}
if maxFPS != 0{
let timeValue = Int64(1200.0 / maxFPS)
let timeScale: Int64 = 1200
try backCamera!.lockForConfiguration()
backCamera!.activeFormat = finalFormat
//print("CAMER FPS: \(backCamera?.activeFormat.videoSupportedFrameRateRanges.description)\n")
backCamera!.activeVideoMinFrameDuration = CMTimeMake(timeValue, Int32(timeScale))
backCamera!.activeVideoMaxFrameDuration = CMTimeMake(timeValue, Int32(timeScale))
backCamera!.focusMode = AVCaptureFocusMode.autoFocus
backCamera!.unlockForConfiguration()
}
}catch{
print("Problem setting FPS\n")
exit(0)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.