0

我正在尝试从一组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

4

0 回答 0