Послідовність зображень FFMPEG з різною тривалістю


16

Скажімо, у мене є mp3-файл довжиною 1 хвилину. У мене є 20 png зображень. Я хочу об'єднати ці зображення та аудіо у відео-файл, але я не хочу, щоб кожне зображення тривало 3 секунди на екрані, я хочу, щоб деякі зображення тривали 5 секунд, інші - 1 секунда тощо.

Єдиний спосіб, який я можу придумати, - це просто скопіювати зображення, які повинні тривати більше часу, наприклад, щоб зображення1, image2, image3 були абсолютно однаковими, це дає мені в 3 рази більше часу на відео.

Однак це займає дуже багато часу та місця. Чи є якийсь перемикач / параметр у ffmpeg, який дозволяє мені це зробити?


Як ви дізналися, ffmpeg має відображати кожне зображення однакової довжини. Якщо ви хочете змінити довжину, вам доведеться заздалегідь продублювати зображення або створювати окремі відеозаписи кожної бажаної тривалості, а потім з'єднувати їх. Можливо, деякі інші користувачі мають кращі ідеї, але таке завдання може бути простішим з таким редактором, як Kdenlive тощо.
llogan

Я роблю це з скрипту php, тому редактор - це не те, що я шукаю.
Flot2011

Відповіді:


21

Використовуючи ffmpeg 2.0, є кілька способів зробити це:

  1. Один з методів - використання часів модифікації файлів. Спочатку встановіть час модифікації файлів зображень таким чином, щоб кожен файл зображень мав час модифікації, більший за попередній; різниця в часі - тривалість попереднього зображення (з роздільною здатністю 1 секунди). Потім використовуйте параметр image2 demuxer -ts_from_file 1. Наприклад:

    touch -t 01010000.00 image01.png
    touch -t 01010000.03 image02.png
    touch -t 01010000.08 image03.png
    ...
    ffmpeg -ts_from_file 1 -i image%2d.png -i audio.mp3 -c:a copy -vf fps=25 out.avi
    
  2. Інший метод полягає у використанні concatдемуксера , який займає список файлів для об'єднання, з необов'язковими тривалістю. Спочатку створіть файл із переліком зображень та тривалості, який виглядає приблизно так:

    ffconcat version 1.0
    file image01.png
    duration 3
    file image02.png
    duration 5
    file image03.png
    

    Потім надайте цей файл як вхід до ffmpeg. Наприклад:

    ffmpeg -i in.ffconcat -i audio.mp3 -c:a copy -vf fps=25 out.avi
    

Можливо, вам доведеться дублювати останній файл після остаточної тривалості. -c:a copyкопіює аудіо mp3 як є; якщо ви хочете перетворити його в інший аудіокодек, ви можете вказати це замість copy. Ви також можете вказати інший відеокодек з -c:vчи інший формат пікселів -pix_fmt, наприклад -c:v libx264 -pix_fmt yuv420p. -vf fps=25зробить вихідний кадр частотою 25 кадрів в секунду. Якщо ваш звук довший і ви хочете, щоб він був відрізаний після зображень, скористайтеся -shortestопцією.


Будь-яка ідея, чому це, здається, не працює (я маю на увазі, я дотримувався другого (і намагався першого) варіанту листа, але він просто видає або чорне відео з не зображеннями, або зображення просто спалахують для одного кадру, а не декількох секунд , як зазначено в файлі ffconcat.
вечеряти

@sup: Це все ще працює для мене. Якщо відео чорне, ваш плеєр може не підтримувати формат відео, який ви використовуєте; спробуйте -c:v libx264 -profile:v baseline -pix_fmt yuv420p out.mp4замість out.avi або спробуйте інший програвач, наприклад mpv або ffplay. Також переконайтеся, що ви використовуєте поточну версію FFmpeg і дублюєте ім'я останнього зображення зображення після остаточної тривалості.
mark4o

Гм, дивно, ви використовуєте mpv та ffmpeg статичну збірку, завантажену з ffmpeg.org, і вона просто ігнорує тривалість. У всякому разі, я знайшов ще один спосіб , як це зробити, так що це не так уже й важливо: ffmpeg.org/pipermail/ffmpeg-user/2015-July/027702.html
вир

1

Припускаючи ffmpeg -i in.ffconcat -vf fps=25 out.avi

(2018: вміст файлу in.ffconcat) - це працює:

ffconcat версія 1.0
файл text.png
тривалість 30,0
файл text.png

поки цього немає

ffconcat версія 1.0
файл text.png
тривалість 30,0

тобто у другому випадку

ffprobe out.avi -show_entries format=duration -v 0

[ФОРМАТ]
тривалість = 0,040000
[/ FORMAT]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.