Использование ffmpeg для объединения именованных файлов в десятичном формате в mp4 - PullRequest
0 голосов
/ 06 августа 2020

Я хотел бы использовать ffmpeg для объединения файлов png с этим десятичным форматом именования в mp4, где порядок файлов имеет значение.

M_2.50.png
M_3.01.png
M_4.12.png
M_5.07.png
M_6.00.png
M_7.16.png
M_8.01.png
M_9.21.png
M_10.13.png
M_11.16.png
M_12.03.png
M_13.32.png
M_14.04.png
M_15.62.png

Если бы мои файлы были в этом целочисленном формате:

M_1.png
M_2.png
M_3.png
M_4.png
M_5.png
M_6.png
M_7.png
M_8.png
M_9.png
M_10.png
M_11.png
M_12.png
M_13.png
M_14.png
M_15.png

Я бы использовал этот унаследованный скрипт:

#images_to_movie.sh
#!/bin/sh

in_files=$1
out_file=$2

$ffmpeg \
    -r 10 \
    -f image2 \
    -s 1200x1200 \
    -i $in_files \
    -vcodec libx264 \
    -crf 25  \
    -pix_fmt yuv420p \
    -y \
    $out_file

./images_to_movie.sh path/M_%d.png path/movie.mp4

Но это не работает с именами в десятичном формате. Я получаю сообщение об ошибке:

Could find no file with path/M_%d.png' and index in the range 0-4
path/M_%d.png: No such file or directory

У меня проблемы с пониманием документации здесь: https://ffmpeg.org/ffmpeg.html#Video -Options

Я думаю, что могу использовать glob, но Я не уверен, как редактировать сценарий, или вызов сценария, или как обеспечить слияние моих файлов по порядку.

1 Ответ

1 голос
/ 06 августа 2020

Проблемы

  • Вы не можете использовать шаблон глобуса, потому что ваши имена файлов не дополняются 0, как в M_02.50.png вместо M_2.50.png. Итак, с glob первое изображение становится M_10.13.png. Вы можете использовать ls -m1 *.png для перечисления файлов в том порядке, в котором их будет перечислять glob.

  • Вы не можете использовать последовательность шаблонов, потому что нет четкого шаблона для имен файлов.

Решения

Переименовать файлы

Очевидное решение - переименовать файлы.

Используя sort

Используйте сортировку "human" / natural / version с sort --version-sort или sort -V:

cat $(find . -name '*.png' -print | sort -V) | ffmpeg -y -framerate 10 -i - -c:v libx264 -crf 25 -vf scale=1200:-2,format=yuv420p -movflags +faststart output.mp4

concat demuxer

Альтернативное решение - использовать concat demuxer :

  1. Создать input.txt который содержит:

     file 'M_2.50.png'
     duration 0.1
     file 'M_3.01.png'
     duration 0.1
     file 'M_4.12.png'
     duration 0.1
     file 'M_5.07.png'
     duration 0.1
     file 'M_6.00.png'
     duration 0.1
     file 'M_7.16.png'
     duration 0.1
     file 'M_8.01.png'
     duration 0.1
     file 'M_9.21.png'
     duration 0.1
     file 'M_10.13.png'
     duration 0.1
     file 'M_11.16.png'
     duration 0.1
     file 'M_12.03.png'
     duration 0.1
     file 'M_13.32.png'
     duration 0.1
     file 'M_14.04.png'
     duration 0.1
     file 'M_15.62.png'
     duration 0.1
    
  2. Выполнить ffmpeg:

     ffmpeg -f concat -i input.txt -c:v libx264 -crf 25 -vf scale=1200:-2,format=yuv420p -movflags +faststart output.mp4
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...