LINUX.ORG.RU

Как указать в ffmpeg фрагмент более точно, чем по целым секундам?

 ,


0

1

Имеем случай - создание гифчиков из любимых фильмов:

Генерация анимированного gif из видео файла:

ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1]; \
[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif

-ss 30 — означает начало извлечения кадров с 30-й секунды в видео.
-t 3 — означает извлечь следующие 3 секунды из этой точки. fps=10 — Частоту кадров можно регулировать в зависимости от ваших предпочтений.
scale=320 — это ширина GIF-изображения, высота будет рассчитана автоматически.
input.mp4 — это видеофайл, который может быть любым видеофайлом, поддерживаемым ffmpeg.
Output.gif — это созданный gif.

Однако всё дело в том, что нужный мне фрагмент может начинаться не с целой секунды (например 00:14:24) и длиться не целое число секунд. Таким образом получается гиф с ненужным содержимым в начале или конце. Как правило там смена кадра, что всё портит. Пробовал указывать длительность 2.5, но он так не работает, округляет.

ДЛИТЕЛЬНОСТЬ выборки:
Видимо нужно указывать сколько брать не секунд, а кадров?

НАЧАЛО фрагмента
Но всё равно в смотрелке видео (smplayer, и я не собираюсь его ни на что менять) я хоть и могу просматривать видео по кадрам, но не могу знать номер начального фрейма, а только секунды. И вот как быть тут, чтобы гиф начинался точно с нужного кадра? Указывать поправку?

Подскажите с ключами пож-та. Ман читал ниасилил. И так мозг взорвал.

Перемещено hobbit из general

★★★

Последнее исправление: hikikomori (всего исправлений: 1)

Указывай -ss 2.5 не до, а после -i input.mp4. В ffmpeg это имеет значение.

Да, указывается в секундах, не в кадрах.

Округлено всё равно будет до кадра.

А при -c copy вообще до ключевого кадра будет округлено, не по ключевым резать нельзя.


Но вообще переконвертировать видео в gif имеет смысл только если там что-то вроде пиксель-арт анимации, нужна прозрачность и т.д. В ином случае, это какой-то бред. И качество, конечно, тоже не станет лосслесс, если из лосси перекодировать, поэтому всё равно потом GIMP’ом небось правишь же? Можно там же в GIMP лишние кадры и удалить, возможно, так будет проще для этой задачи.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от CrX

Такая конструкция у4 меня вообще повисла с выходом (Press [q] to stop, [?] for help)

ffmpeg -y -ss 00:14:21.201 -to 00:14:24.001 -i "file.avi" -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1]; [s0]palettegen[p];[s1][p]paletteuse" -loop 0 j.gif

ключевого кадра

А это что такое?

потом GIMP’ом небось правишь же?

нет. Я его плохо знаю. Поэтому не хочу ничем править. Хочу ставить кино на паузу и быстро лепить гифы для чатов телеги.Без постпродакшна, регистрации и смс)

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Я же говорю, попробуй указать свой -ss не до, а после -i "file.avi".

А это что такое?

Ух, это долго объяснять, лучше почитать что-нибудь. Но если прям совсем упрощённо (для большинства кодеков, а не всех, не так просто, и прочие оговорки), то не каждый кадр в видеопотоке сохранён как картинка. Сохраняются лишь некоторые кадры, они иногда называются ключевыми, а между ними сохраняется разница — изменившиеся пиксели (там посложнее, чем «пиксели», но для упрощения пойдёт). И так до следующего ключевого кадра, который тоже сохранён полностью. Их кодек выбирает по более значимой смене кадра (обычно смена сцены и т.д.), но также задаётся и минимальное и максимальное расстояние между ними, чтоб не было такого, что один ключевой кадр на всё видео. Соответственно, когда ты обрезаешь что-то без перекодирования (-c copy), невозможно начать видео не с ключевого кадра — потому что следующие кадры это разница между несуществующим ключевым кадром и последующим, далее с ним и последующим и т.д. То есть, резать при таком обрезании можно только по ключевым кадрам — по выше описанным причинам, неключевой это разница между тем, информации о чём нет, если её отрезать, то есть бессмыслица.

На деле всё несколько сложнее, есть i-frame, p-frame и b-frame. Но для общего понимания сойдёт.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от Chord

Нет, это кадр который можно нарисовать не смотря в данные других кадров. То, что при резкой смене картинки кодировщик ставит на это место ключевой кадр - всего лишь опция. Можно и не ставить. Обычно и без всяких смен ставят не реже чем раз в 1-10 сек, иначе перемотка будет лагать.

firkax ★★★★★
()
Ответ на: комментарий от CrX

На деле всё несколько сложнее, есть i-frame, p-frame и b-frame.

На самом деле всё ещё сложнее, i-frame есть несколько видов и не все они полноценно ключевые. Бывают i-frame у которых сосед после зависит от соседа до, и, хоть сам i-frame ты нарисовать можешь, но вот следующий кадр (p или b) уже не получится без заглядывания назад. Хороший i-frame (который 100% ключевой) называется IDR-frame.

firkax ★★★★★
()
Ответ на: комментарий от hikikomori

А посоветуйте пожалуйста простой viewer анимированного гифа. Чтобы быстро просмотреть запустив из консоли после получения файла. Помимо анимации нужно видеть листинг всех кадров. Если уж с возможностью удаления лишних то вообще хорошо, но главнео простота и скорость запуска.

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Полезли в дебри...

1. Отрезать кусок, неважно, если чуть больше до и после.

2. Разложить кусок на кадры

3. Убрать лишние кадры снизу и сверху.

4. Собрать ffmpeg'ом или другой 'ерундой' в gif.

xradio
()
Ответ на: комментарий от hikikomori

простой viewer анимированного гифа. Чтобы быстро просмотреть запустив из консоли после получения файла.

ffplay

Помимо анимации нужно видеть листинг всех кадров.

Насчёт этого не знаю, может и умеет.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Да, спасибо, это более удобный вариант, плюс весь функионал mpv как видеоплеера. Единственное, чего не хватает, это просмотра всех кадров на одном экране.

hikikomori ★★★
() автор топика
Ответ на: комментарий от dataman

а ты не знаешь, можно как-нибудь убрать chapters (или как это называется) ключевые сцены из прогресс-бара? чтоб не было этих зазубрин в прогресс-баре, которые есть в некоторых видео.

teod0r ★★★★★
()
Ответ на: комментарий от foxy_ant

Куда кадры плавать будут? Ты кусок разложил ffmpeg'ом на кадры в png картинках, их строго определённое число! Если их лишка спереди и сзади - удаляешь эти кадры. Затем собираешь в gif или apng в нужной частоте, длительности, размере и т.п...

xradio
()
Ответ на: комментарий от xradio

Куда кадры плавать будут?

выше уже рассказали о причинах

Ты кусок разложил ffmpeg’ом на кадры в png картинках, их строго определённое число!

нет, этот посыл не ко мне, почитай что внутри mjpeg. «!» - лишний пунктуационный знак

Затем собираешь в gif или apng в нужной частоте, длительности, размере и т.п…

Да, так и нужно делать.

Смыл моего поста в том, что видеоряд в формате с i(b,p)-frame конвертировать в видеоряд в формате mjpeg, где нет ключевых кадров, тогда обрезать видеоролик можно точно по тысячным секунды, при этом не надо руками удалять ненужные кадры.

foxy_ant ★★
()
Ответ на: комментарий от foxy_ant

На кой мне сдался mjpeg! Тебе делать нечего, ты конвертируй и читай.
Идиотизм - лишнее рекодирование видео в другой формат. Запомни - при раскладе видео на кадры в картинках png в их последовательности нет ни i,p,b, ни бэ и ни мэ кадров. Там только картинки формата png!

xradio
()