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, но я бы предпочел первый подход, если это возможно.