Могу ли я использовать «потоковую копию» ffmpeg в OpenCV с классом VideoWriter? - PullRequest
2 голосов
/ 30 апреля 2019

Python: 3.6, Ubuntu 18.04, OpenCV 4.1.0

У меня есть IP-камера, которая транслирует видеоданные в кодировке H.264. Я хотел бы взять этот видеопоток и сохранить его в файл .avi, используя Python без какой-либо кодировки или декодирования Используя интерфейс командной строки и команды ffmpeg, это тривиально.

mycomputer@home:~$ ffmpeg -i rtsp://username:password@192.168.1.1/?framerate=30.0?streamprofile=defaultcameraprofile -acodec copy -vcodec copy output_file_name.avi 

Я бы хотел сделать то же самое из Python, используя OpenCV. В настоящее время я использую класс VideoCapture для чтения в каждом кадре, а затем использую класс OpenCV VideoWriter для записи этого кадра в файл. Моя проблема в том, что класс VideoWriter требует код four_cc, чтобы указать, какой кодек должен использоваться во время записи, тогда как я не хочу использовать какой-либо кодек вообще (или, точнее, я хочу использовать потоковую копию FFmpeg, но нет, насколько мне известно, соответствующего кода Four_cc). В документации OpenCV указано, что если я использую бэкэнд-API FFmpeg и указываю кодек и частоту кадров 0, необработанный поток должен быть записан в новый файл. Однако, когда я делаю это, файл не создается.

cap = cv2.VideoCapture("rtsp://username:password@192.168.1.1/?framerate=30.0?streamprofile=defaultcameraprofile", cv2.CAP_FFMPEG)
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# output file, backend API, four_cc code integer, framerate, frame size tuple
out = cv2.videoWriter("output_file.avi",cv2.CAP_FFMPEG,0,0,(frame_width,frame_height))

Я перепробовал множество комбинаций других входных параметров для конструктора videoWriter, но все они либо перекодируют поток, либо не записывают выходной файл. Например, я попробовал почти каждую комбинацию частоты кадров {0,30}, расширения выходного файла {.avi, .mp4, .h264, .mkv, None} и кодека {0, "H.264", "RAW", "DBI", "", "MPEG", "COPY", "NONE"}.

out = cv2.videoWriter("output_file.avi",cv2.CAP_FFMPEG,cv2.VideoWriter_fourcc('H','2','6','4'),30,(frame_width,frame_height))

Можно ли использовать потоковую копию FFmpeg в OpenCV для сохранения видеоданных без их кодирования? Если нет, я поменяю такт на запуск команд оболочки из Python, но я бы предпочел первый подход, если это возможно.

1 Ответ

1 голос
/ 14 мая 2019

После многих дополнительных рутин я решил, что, вероятно, не было хорошего способа сделать это с помощью класса VideoWriter в OpenCV. Вместо этого я использовал команду командной строки ffmpeg, вызываемую с помощью модуля подпроцесса.

command = ['ffmpeg', '-i', 'rtsp://username:password@192.168.1.1/axis-media/media.amp?framerate=30.0', '-acodec', 'copy', '-vcodec', 'copy', '-r', '30.0', 'output_file.avi']
p = subprocess.Popen(command,stdin=subprocess.PIPE)
input("Press Enter to stop capture...")
os.kill(p.pid, 15)
...