cv2.VideoWriter в RPi3 работает быстрее, чем на самом деле - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь записать видео с веб-камеры Logitech. Камера может записывать его, но 40-секундное видео записывается всего за 6 секунд с некоторой скоростью nX. Я сослался на следующую ссылку для решения, но это не могло решить проблему в RPi. Важно то, что код работает на рабочем столе Ubuntu, но, возможно, RPi работает медленнее.

Вот мой фрагмент кода:

fourcc = cv2.cv.CV_FOURCC(*'XVID')
videoOut = cv2.VideoWriter("video_clip.avi", fourcc, 20.0, (640, 480))
start_time = time.time()
frame_count = 0
while True:
    ret, frame = cap.read()
    videoOut.write(frame)  # write each frame to make video clip
    frame_count += 1

    print int(time.time()-start_time)  # print the seconds
    if int(time.time()-start_time) == 10:
        videoOut.release()
        break
        # get out of loop after 10 sec video
print 'frame count =', frame_count 
# gives me 84 but expected is 20.0 * 10 = 200

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Создание списка кадров может не сработать, если у вас не хватит памяти. Альтернативой может быть динамический расчет fps, а затем ремикс видео с новым fps с использованием ffmpeg.

import numpy as np
from skvideo import io
import cv2, sys
import time
import os

if __name__ == '__main__':

    file_name = 'video_clip.avi'

    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    videoOut = cv2.VideoWriter(file_name, fourcc, 30.0, (640, 480))
    cap = cv2.VideoCapture(0)

    if not cap.isOpened() or not videoOut.isOpened():
        exit(-1)

    start_time = time.time()
    frame_count = 0
    duration = 0
    while True:
        ret, frame = cap.read()
        if not ret:
            print('empty frame')
            break
        videoOut.write(frame)  # write each frame to make video clip
        frame_count += 1

        duration = time.time()-start_time
        if int(duration) == 10:
            videoOut.release()
            cap.release()
            break

    actualFps = np.ceil(frame_count/duration)

    os.system('ffmpeg -y -i {} -c copy -f h264 tmp.h264'.format(file_name))
    os.system('ffmpeg -y -r {} -i tmp.h264 -c copy {}'.format(actualFps,file_name))
0 голосов
/ 29 июня 2018

У меня был тот же вопрос некоторое время назад. Я много искал, но не нашел решения. Проблема в том, что переданная частота кадров равна скорости, с которой видео будет воспроизводиться . Это не означает, что видео будет записано на этом FPS. AFAIK, нет прямого способа установить записанный FPS. Если ваш записанный FPS был слишком высоким, вы можете уменьшить частоту дискретизации (т.е. сохранить только 1 кадр для каждого периода времени). Но из того, что вы описываете, кажется, что это намного ниже, чем требуется. Это аппаратное ограничение, и с этим ничего не поделаешь.

Что касается настройки записанного FPS, я нашел обходной путь. Я создаю videoWriter после захвата всех кадров в списке. Таким образом, я могу вычислить записанный FPS и передать его VideoWriter при его создании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...