Я реализовал скрипт Python, который отображает видео для пользователя и записывает его. Видео сохраняется в сжатом или несжатом виде.
В старой программе, которую я видел, использовались кодеки "DIVX" MPEG-4 и "IYUV". По какой-то причине они не работают на моем компьютере (OUTPUT_VIDEO - это MP4-файл).
OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x00000020/' ???'
Код "MPJPG" c работает с файлами ".avi".
Поскольку я не уверен насчет кодеков, я хотел бы спросить, какие кодеки я должен использовать для своего сценария, чтобы выполнить следующие требования:
- последовательность видео может быть сохраняется как .mp3 , .mp4 файл (оба сжатый) или как .avi файл (без сжатия).
- Python скрипт должен работать на платформах Windows и Linux.
Это мой исходный код: main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import cv2
import platform
#=========== TO CHANGE ===========
INPUT_VIDEO = os.path.join("..", "resources", "video.mp4")
OUTPUT_VIDEO = os.path.join("..", "recorded", "recorded.avi")
compress = False
#=========== TO CHANGE ===========
WINDOW_NAME = "Video Recorder"
player = cv2.VideoCapture(INPUT_VIDEO)
# Get the frames per second (fps) of the video.
fps = player.get(cv2.CAP_PROP_FPS)
# Get width and height via the video capture property.
width = player.get(cv2.CAP_PROP_FRAME_WIDTH)
height = player.get(cv2.CAP_PROP_FRAME_HEIGHT)
# Define the codec and create VideoWriter object according to the used operating system.
four_cc = None
if platform.system() == "Windows":
if compress:
four_cc = cv2.VideoWriter_fourcc(*"MJPG") # *"DIVX") # DIVX MPEG-4 codec.
else:
four_cc = cv2.VideoWriter_fourcc(*"MJPG") # *"IYUV") # Uncompressed yuv420p in avi container.
elif platform.system() == "Linux":
if compress:
four_cc = cv2.VideoWriter_fourcc(*"DIVX") # DIVX MPEG-4 codec.
else:
four_cc = cv2.VideoWriter_fourcc(*"IYUV") # Uncompressed yuv420p in avi container.
recorder = cv2.VideoWriter(OUTPUT_VIDEO, four_cc, fps, (int(width), int(height)))
if player is None:
quit()
while player.isOpened():
ret, frame = player.read()
if ret:
cv2.imshow(WINDOW_NAME, frame)
recorder.write(frame)
else:
break
key_code = cv2.waitKey(1)
# Closes the window if the ESC key was pressed.
if key_code == 27:
break
# Closes the window if the X button of the window was clicked.
if cv2.getWindowProperty(WINDOW_NAME, 1) == -1:
break
player.release()
recorder.release()
cv2.destroyAllWindows()
Я использую * Компьютер 1033 * 7, с opencv-contrib- python 3.4.0.12 и Python 3.6.