ffmpeg без потерь преобразование из jpgs в видео с huffyuv не работает должным образом - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь создать видео из набора jpg изображений.Мне бы хотелось, чтобы каждый кадр видео был точно таким же, как изображения, использованные для его создания.Чтобы получить этот результат, я использую следующую команду:

ffmpeg -i %05d.jpg -c:v huffyuv test.avi

Однако, если я проверяю, совпадает ли первый кадр с первым изображением, использованным для создания видео, я получаю некоторые различия.Чтобы проверить это, я использовал следующий код:

import argparse
import cv2
import glob
import os
from os.path import isfile, join

parser = argparse.ArgumentParser()

parser.add_argument(
    "video",
    default = None,
    help = 'video to be compared',
    type = str)
parser.add_argument(
    "image",
    default = None,
    help = 'image to be compared with the first frame of the video',
    type = str)

args = parser.parse_args()

# opening video
cap = cv2.VideoCapture(args.video)
# reading first frame
ret, frame = cap.read()

# opening image
image = cv2.imread(args.image)

# computing difference between the first frame of the video and the image
diff = frame - image

# showing the differences: the two images are equal if the result is a black image
cv2.imshow("diff", diff)
cv2.waitKey(0)
cv2.destroyAllWindows()

Если я использую opencv для выполнения преобразования, результат будет таким, как ожидалось: нет различий между первым кадром и первым изображением, использованным для создания видео.Это код Python, используемый для генерации видео из изображений:

import argparse
import cv2
import glob
import os

parser = argparse.ArgumentParser()

parser.add_argument(
    "jpg_folder",
    default = None,
    help = 'Path to folder with numbered jpg folder, must be alphabetically ordered (e.g 00000.jpg, 00001.jpg, ...)',
    type = str)
parser.add_argument(
    "avi_output",
    default = None,
    help = 'name of the outputavi file',
    type = str)
parser.add_argument(
    "--frame-rate",
    default = 30,
    help = 'number of frame per second used in the genrerated video (default is 30)',
    type = int)

args = parser.parse_args()

#read images to be used to create the video
files = glob.glob(os.path.join(args.jpg_folder,'*.jpg'))
files.sort(key=lambda x: x)

#extract images dimensions
tmp_img = cv2.imread(files[0])
height, width, layers = tmp_img.shape

#create video writer with lossless codec
out = cv2.VideoWriter(args.avi_output,cv2.VideoWriter_fourcc('H', 'F', 'Y', 'U'), args.frame_rate, (width, height))
#read each image and add it to the video
for filename in files:
    jpgImage = cv2.imread(filename) 
    out.write(jpgImage)
#release the resource used to write the video
out.release()

Мне не хватает какой-либо опции, чтобы получить тот же результат, используя ffmpeg?

...