Ответ 1
После некоторого вовлечения этот ответ разделился на две части:
Как захватить фреймы со скоростью 60 кадров в секунду
AVCaptureSessionPreset1280x720 на iPhone4s/5.1 с длительностью кадров, установленной на:
connection.videoMinFrameDuration = CMTimeMake(1, 60);*
connection.videoMaxFrameDuration = CMTimeMake(1, 60);
дает вам стабильный, супер гладкий захват.
Как захватить фреймы в файл @60fps
Захват кадров - все очень хорошо, но, по-видимому, вы хотите их сохранить.
Как отметил Брэд в комментариях, запись этих кадров в файл - это еще одна история.
К сожалению, независимо от того, какие конфигурации я пытался, кодирование фреймов с помощью AVAssetWriter
заставило скорость захвата упасть до наблюдаемого ~ 37 кадров в секунду, и никакое количество возиться с alwaysDiscardsLateVideoFrames
не могло его изменить. Тем не менее, в этом подходе каждый отдельный кадр копируется из AVFoundation в ваше приложение, а затем обратно, что совершенно бессмысленно и очень носят для шины. К счастью, AVFoundation
имеет класс, который удаляет это путешествие в оба конца: AVCaptureMovieFileOutput
.
Если вы дадите AVFoundation
сделать запись для вас, тогда iPhone4S сможет захватывать и кодировать кадры + аудио в файл .mov со скоростью 60 кадров в секунду *, не разбивая пот (~ 25% CPU).
В то время как видеозахват 60 кадров в секунду - отличная функция, я не могу не чувствовать себя немного разочарованным, поскольку AVCaptureMovieFileOutput
исключает массу забавных вещей (например, эффекты в реальном времени с GL-шейдерами, начало/останов записи записи без потери кадров).
торт/съесть его
* 59, если вы все еще используете iOS 5.0.1