iOS AVFoundation, как конвертировать кадры камеры в секунду, чтобы создать интервал с использованием CMTime?
У меня есть iPhone-камера, которая захватывает видео со скоростью 9FPS и делает его доступным как отдельные изображения. Я пытаюсь сшить эти изображения вместе, чтобы создать замедленное видео того, что камера видит с помощью AVFoundation.
Я не уверен, как правильно конвертировать кадры и синхронизацию, чтобы добиться сжатия времени, которое я хочу.
Например, я хочу, чтобы 1 час реальной жизни был конвертирован в 1 минуту. Это говорит мне, что мне нужно захватывать каждый 60-й кадр и добавлять его к интервальной съемке.
Выполняет ли приведенный ниже код 60-секундный интервал? Или мне нужно добавить еще умножение / деление на kRecordingFPS
?
#define kRecordingFPS 9
#define kTimelapseCaptureFrameWithMod 60
//frameCount is the number of frames that the camera has output so far
if(frameCount % kTimelapseCaptureFrameWithMod == 0)
{
//...
//convert image and prepare it for recording
[self appendImage:image
atTime:CMTimeMake(currentRecordingFrameNumber++, kRecordingFPS)];
}
1 ответ
Ваш код будет делать 1 кадр из 60 в вашем фильме каждые 1/9 с, и увеличивать кадровый индекс на единицу каждый раз.
Результатом должен быть фильм [max value for frameCount] / (60 * 9). Если у вас 32400 кадров (1 час фильма при 9 кадрах в секунду), фильм будет иметь {540:9 = 60 секунд}.
Попробуйте распечатать CMTime с помощью CMTimeShow() при каждом вызове appendImage:atTime:
Проверять.
//at 5 fps, 300 frames recorded per 60 seconds
//to compress 300 frames into 1 second at 5 fps, we need to take every 300/5 = 60th frame
//to compress 300 frames into 1 second at 15 fps, take every 300/15 = 20th frame
//to compress 300 frames into 1 sec at 30 fps, take every 300/30 = 10th frame
#define kReceivedFPS 9
#define kStoreFPS 9
#define kSecondsPerSecondCompression 60
#define kTimelapseCaptureFrameWithMod (kSecondsPerSecondCompression * kReceivedFPS) / kStoreFPS