Преобразование GIF в видео меняет его продолжительность

1047
Aminesrine

Я хочу конвертировать GIF-файл в видео с помощью ffmpeg. Я использую:

ffmpeg -y -i /gif/583fd7661b46d.gif -strict -2 -an -b:v 32M /gif/mp4/583fd7661b46d.avi 

Продолжительность моего gif-файла в фотошопе составляет 27 секунд, но продолжительность созданного видео "583fd7661b46d.avi" составляет 15 секунд. Как я могу получить ту же продолжительность моего GIF в видео, сгенерированном?

4
Насколько конкретно искажен результат? Разные задержки становятся одинаковыми, или все они изменяются пропорционально тому, что они должны быть? ivan_pozdeev 7 лет назад 0
Согласно http://stackoverflow.com/a/24724126/648265, последние версии `ffmpeg` должны учитывать задержки, указанные в GIF. ivan_pozdeev 7 лет назад 0
У меня есть GIF с 21 секунд и видео, сгенерированное за 24 секунды, также GIF с 27 с и видео, сгенерированное с 15 с. У меня нет пропорционально !! Я использую "ffmpeg версии N-80901-gfebc862. Copyright (c) 2000-2016 разработчики FFmpeg, созданные с помощью gcc 4.8 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3)" Какую версию мне следует использовать? Aminesrine 7 лет назад 0
Это не отвечает на вопрос «Насколько конкретно результат искажен?». Хорошо, я переформулирую простыми словами. Чем видео визуально отличается от GIF? Какие изменения приводят к другой продолжительности? ivan_pozdeev 7 лет назад 0
Я не вижу разницы в скорости. есть пример gif и сгенерированного видео: https://drive.google.com/open?id=0B-6RrqcLpcp9NzhWWlgta1NTZlk Aminesrine 7 лет назад 0

2 ответа на вопрос

3
ivan_pozdeev

Используя ваш пример, я определил проблему:

В вашем GIF последний (пустой) кадр имеет продолжительность 10370ms. Кажется, это игнорируется ffmpeg, создавая разницу.

Если я изменю формат вывода на .mp4, продолжительность станет правильной. Смена кодера не имеет никакого эффекта.

Итак, это ошибка в ffmpeg. Это может быть связано с ограничением формата вывода, что очень маловероятно (проблема также существует .mkv), но в этом случае следует, по крайней мере, напечатать предупреждение. Просматривая их баг-трекер, я обнаружил, что # 4235 (преобразование GIF в MP4 с использованием FFmpeg дает видео, которое не соответствует времени кадров GIF.) - похоже, это было исправлено для .mp4формата, но не для других.

Для OP решение состоит в том, чтобы сначала вывести в MP4, а затем переформатировать в AVI, если это конечный необходимый формат. Gyan 7 лет назад 0
[Подано сообщение об ошибке] (https://trac.ffmpeg.org/ticket/6000). ivan_pozdeev 7 лет назад 0
Решение уже существует - добавьте `-vsync cfr` при выводе в avi или mkv / webm. Gyan 7 лет назад 2
@Mulvya да, но это обходной путь, а не решение. Он полностью уничтожает исходный набор кадров, заменяя его последовательностью с постоянной частотой кадров. Таким образом, это хорошо, только если вывод в формате с постоянной частотой кадров. Правильным решением было бы использовать «маркер конца потока» для форматов слайд-шоу. ivan_pozdeev 7 лет назад 0
AVI поддерживают только CFR и не имеют временных отметок, поэтому их длительности кадра рассчитываются с использованием обратной величины частоты кадров. Чтобы сгенерировать эквивалент VFR в AVI, необходимо указать высокую частоту кадров, которая является обратной величиной наименьшего интервала между кадрами, а затем записать 0-байтовые фрагменты для более длинных интервалов. В любом случае не будет никакого «чистого решения» проблемы ОП. Gyan 7 лет назад 0
@Mulvya в том, что переключение не требуется, потоки слайд-шоу должны интерпретироваться правильно, независимо от этого. Игнорирование «хвоста» потока после последнего слайда - определенно неправильное поведение. ivan_pozdeev 7 лет назад 0
0
Pavlus

Просто примените фильтр метки времени представления с коэффициентом, равным доле original time / achieved timeв вашем случае - 27/15. Таким образом, вы добавляете фильтр -filter:v "setpts=27/15*PTS"перед именем выходного файла.

Подробнее об изменениях частоты кадров на вики FFmpeg: https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video

Но я точно не знаю значения 15 и 27. Я хочу преобразовать GIF в видео с той же продолжительностью, не зная никакого значения Aminesrine 7 лет назад 1
Если вы знаете частоту кадров своего gif (вы их создаете, верно?), Вы можете соответствующим образом настроить частоту кадров своего видео. Чтобы узнать продолжительность видео - используйте `ffprobe`: http://superuser.com/a/945604/318118 Pavlus 7 лет назад 0
Я импортирую файл gif из моего интерфейса, затем я должен выполнить команду ffmpeg, чтобы получить видео, соответствующее этому gif, с такой же продолжительностью. Есть ли способ узнать продолжительность моего gif с помощью php? Aminesrine 7 лет назад 0
Вы можете вызвать ffprobe через `shell_exec`. Также ознакомьтесь с проектом `PHP-FFmpeg` https://github.com/PHP-FFMpeg/PHP-FFMpeg/ Это PHP-оболочка для FFmpeg. Pavlus 7 лет назад 0
Я выполняю это: "ffprobe -i /gif/584020787a1b7.gif -show_format | grep duration", но в результате получается "duration = N / A" Aminesrine 7 лет назад 0
Не можете получить продолжительность? Почему бы не найти FPS ?! `ffprobe -v 0 -select_streams v -print_format flat -show_entries stream = r_frame_rate. / 4.gif` выдаст что-то в формате` streams.stream.0.r_frame_rate = "30/1" `Существует несколько форматов вывода, выберите один Вам нравится: https://ffmpeg.org/ffprobe.html#Writers Pavlus 7 лет назад 1
Как я могу использовать frame_rate моего gif в команде ffmpeg, чтобы иметь видео с такой же продолжительностью? Aminesrine 7 лет назад 0
Используйте его, чтобы установить частоту кадров на выходе. Если вы все еще ошибаетесь - позвольте пользователю изменить коэффициент PTS. Поскольку GIF не имеет временных рамок и имеет уникальную задержку для каждого кадра, его время воспроизведения обычно сложно и зависит от системы, поэтому преобразование его в видео требует взаимодействия с пользователем или глубокого понимания методов кодирования видео. Pavlus 7 лет назад 0
Для моего gif: streams.stream.0.r_frame_rate = "100/3". Поэтому я выполняю это: "ffmpeg -y -i gif / 584020787a1b7.gif -strict -2 -an -b: v 32M -r 100/3 /gif/mp4/583fd7661b46d_new_.avi" Но оно генерирует видео за 15 секунд продолжительности Aminesrine 7 лет назад 0

Похожие вопросы