Я должен создавать видео с низким разрешением AVI, используя большое количество изображений JPEG, содержащихся в отдельных каталогах. У меня почти сто каталогов, и каждый каталог может содержать много тысяч изображений.Укажите качество сжатия в Python для объектного объекта OpenCV
Чтобы автоматизировать этот процесс, я написал скрипт python с использованием OpenCV для создания видеообъекта, загрузки каждого изображения из заданного каталога и записи каждого изображения в конкретный видеофайл для этого каталога. Все это отлично работает. Моя проблема заключается в том, как контролировать качество сжатия для видеообъекта.
Модуль VideoWriter принимает 5 параметров. Второй параметр «fourcc» устанавливает код сжатия.
cv2.VideoWriter.open (имя файла, FourCC, кадров в секунду, FrameSize [, isColor])
Мы можем указать код сжатия в пределах cv2.VideoWriter с помощью "четыре кода символа" (т.е. FourCC).
FourCC = cv2.cv.CV_FOURCC ('М', 'S', 'V', 'C') #Microspoft Видео 1
Этот подход работает за исключением того, качество сжатия видео объект всегда устанавливается на максимум.
Если мы позволим FourCC = -1, диалоговое окно Windows, Сжатие видео открывается, что позволяет пользователю выбрать компрессию видео и установить качество сжатия (или Temporal Соотношение качества) от 0 до 100.
(я бы разместите снимок экрана этого диалогового окна Windows Video Compression, но я здесь новый, и моя репутация не была установлена.)
Каждое видео должно быть AVI и должно соответствовать определенным требованиям к размеру файла. Видеофайл слишком большой, если используется максимальное качество сжатия. Однако, требуя, чтобы пользователь выбирал качество сжатия видео и качество сжатия для каждого видео, он побеждает автоматизацию сценария.
Итак, как определить качество сжатия для видеообъекта без использования диалогового окна «Сжатие видео Windows»?
Полнота моего кода размещена ниже
import cv2, os
Workspace = "J:\jpg to AVI test"
year = "2014"
file_extension = "avi"
Image_file_dir = Workspace + "\\12 - ECD-BONNETT CREEK Y INT (" + year + ")"
print Image_file_dir
Image_file_list = os.listdir(Image_file_dir)
print "Image_file_list: " + str(Image_file_list)
img_cnt = 0
for Image_file in Image_file_list:
if Image_file.split(".")[-1] == "jpg":
Image_file_path = Image_file_dir + "\\" + Image_file
print Image_file_path
img1 = cv2.imread(Image_file_path)
height , width , layers = img1.shape
break
fourcc = cv2.cv.CV_FOURCC('M','S','V','C') #Microspoft Video 1
##fourcc = -1
video_object = Workspace + "\\12 - ECD-BONNETT CREEK Y INT (" + year + ")." + file_extension
video = cv2.VideoWriter(video_object,\
fourcc,\
9,\
(width,height))
for Image_file in Image_file_list:
if Image_file.split(".")[-1] == "jpg":
img_cnt += 1
Image_file_path = Image_file_dir + "\\" + Image_file
print str(img_cnt) + ") " + Image_file_path
img1 = cv2.imread(Image_file_path)
video.write(img1)
cv2.destroyAllWindows()
video.release()
Я ценю ваш ответ. Я использовал Handbrake для преобразования AVI в MP4. Я думаю, что ваше решение ffmpeg было бы лучшим вариантом, если бы я не был привержен AVI. – KRH
ffmpeg может конвертировать в любой тип контейнера (avi, mp4, ...), и вы даже можете указать нужный кодек. Это невероятно. – karlphillip