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
Другие вопросы по тегам