Python: использование FFMPEG для создания видео с использованием серии изображений - PullRequest
0 голосов
/ 04 февраля 2019

Я довольно новичок в Python, и я впервые использую ffmpeg (основывая этот код на коллегах).

У меня есть некоторый код, который делает снимок экрана каждые X секунд, а затем создает видео из этих файлов, однако у меня возникают проблемы при создании видео.Это мой код для генерации видео:

def create_video(screen_resolution, image_location, subfolder, count, preset, qaulity, duplicated_frame, video_path, video_filename):
video_path = path + video_path
    {1}\\%d.jpg -vcodec libx264 -preset {2} -crf {3} -r {4} -pix_fmt yuv420p {5}\\{6}.mp4"
proc = subprocess.Popen("C:\\ffmpeg\\ffmpeg.exe -r 1 -f image2 -s %s \
                            -pattern_type sequence \
                            -start_number 1 \
                            -i %s%s\\%s%d.png \
                            -vcodec libx264 \
                            -preset %s \
                            -crf %s \
                            -r %s \
                            -pix_fmt yuv420p \
                            %s\\%s.mp4" %
                            (screen_resolution, image_location, subfolder, count, preset[2], qaulity, duplicated_frame, video_path, video_filename), shell = True)

, и я получаю ошибку:

Ошибка типа:% d формат: требуется число, а не str

Я пытался найти решение, но быстро никуда не попал.Я знаю, что% d ищет вход из списка в конце, но из того, что я вижу, это также способ сказать FFMPEG использовать все файлы в расположении изображения.

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

1 Ответ

0 голосов
/ 04 февраля 2019

Не пытайтесь вручную создавать строки оболочки.Пусть subprocess сделает это за вас.

Вы можете передать массив аргументов командной строки, и Попен позаботится о правильном экранировании всего:

proc = subprocess.Popen(
    [
        "C:/ffmpeg/ffmpeg.exe",
        "-r", "1",
        "-f", "image2",
        "-s", screen_resolution,
        "-i", os.path.join(path, image_location, subfolder, "%d" + extension),
        "-preset", preset[1],
        "-crf", str(qaulity),
        "-r", str(duplicated_frame),
        "-pix_fmt", "yuv420p",
        os.path.join(video_path, video_filename)
    ]
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...