Кодирование видео-клипа из изображений (ffmpeg)

Разные проблемы звука, видео, обсуждение разных устройств и т.д.

Модератор: aim

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Кодирование видео-клипа из изображений

Сообщение TechnoMag » 16.09.2012 21:25

Есть набор изображений: image1.jpg, image2.jpg, ..., imageN,jpg. Также есть mp3-композиция.
Нужно создать из изображений и композиции видео-клип так, чтобы время показа каждого изображения было равномерно распределено во всю длительность композиции.
Код показывает изображения первые доли секунд:

Код: Выделить всё

ffmpeg -f image2 -i image%d.jpg -i amelie.mp3 -r 25 -s 320x240 -b 320k output.avi

- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 16.09.2012 22:29

Попробуйте mencoder

Код: Выделить всё

mencoder mf://*.jpeg -mf fps=25 -audiofile out.mp3 -ovc lavc -lavcopts vcodec=ffv1 -oac copy  -o input.avi


Что-то наподобие этого. С помощью -mf fps= определите сколько фото в секунду вам должно показываться.
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 16.09.2012 22:50

qwerta писал(а):
16.09.2012 22:29
Попробуйте mencoder

Код: Выделить всё

mencoder mf://*.jpeg -mf fps=25 -audiofile out.mp3 -ovc lavc -lavcopts vcodec=ffv1 -oac copy  -o input.avi


Что-то наподобие этого. С помощью -mf fps= определите сколько фото в секунду вам должно показываться.


происходит обрезка аудио. Если задать слишком малое значение fps, то при воспроизведении, в момент нажатия на паузу, через некоторое время переключится на другой кадр.
На деле нужно чтобы в каждый кадр записывалось изображение до момента смены другого изображения.
Например:
композиция длится 15 сек, записать нужно 3 картинки, т.е. все 5 сек должна отображаться первая картинка, причем если указано fps 25, то она должна записываться эти 25 раз на секунду.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 16.09.2012 23:33

Попробуйте добавить опцию -ofps 25 . Если не поможет тогда просто перекодируйте видео с этой опцией. Типа

Код: Выделить всё

mencoder -ovc lavc -lavcopts vcodec=ffv1 -oac copy -ofps 25 -o input_new.avi input_old.avi
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 17.09.2012 00:12

с -ofps Происходит обрезка аудио-потока до количества изображений.
Этот вариант тоже обрезает аудио-поток.

Код: Выделить всё

mencoder -ovc lavc -lavcopts vcodec=ffv1 -oac copy -ofps 25 -o input_new.avi input_old.avi
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 17.09.2012 01:01

:) Ну тогда создайте папочку накидайте с помощью ln -s нужное количество копий каждой фотографии. Например если вам нужно чтобы каждая фото показывалась 1 секунду при 25 кадрах , то значит таких копий должно быть 25. И так сделать для каждой фотографии. А уж потом mencoder mf://...
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 17.09.2012 17:48

> Ну тогда создайте папочку накидайте с помощью ln -s нужное количество копий каждой фотографии.

Не издевайся над человеком ;) Всё это делается намного проще:

1) Считаем частоту источника: 1/(длительность звука / количество картинок). К промеру при длительности 83 сек и количеству картинок 10 частота будет: 1/8,3 = 0,12Гц
2) Кодируем примерно так: mencoder -ovc x264 -x264encopts profile=main -zoom -sws 2 -vf scale=::0::0.0:0.6:pal,harddup -oac copy -audiofile 01.mp3 -ofps 25 -of avi mf://*.jpeg -mf type=jpg:fps=0.12 -o jpeg.avi
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 17.09.2012 18:18

Вы не совсем поняли что человеку нужно (посмотреть) и какие у него возникают проблемы. Подобрать значения -mf fps= и -ofps, опции кодирования - для него не проблема.
Просто при кодировании через mencoder mf:// у него получаеться что:
1фото приходиться на 0 секунду видео;
2фото на 5секунду;
3 на 10секунду
после чего mencoder завершал работу (кадры то ведь кончились) и он получал видео в 10 секунд ( он и писал режется в концке звук). Решение этого просто продублировать последний кадр. т.е. что бы в конце были две одинаковые картинки. Но додумался до этого я только с утра, когда перечитал пост. :rolleyes: Писать я не стал: подумал что с помощью for - TechnoMag уже продублировал картинки.
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 17.09.2012 20:25

> Подобрать значения -mf fps= и -ofps, опции кодирования - для него не проблема.

Это его основная проблема.

>1фото приходиться на 0 секунду видео; 2фото на 5секунду; .....

:evil2: За такое растреливать надо :evil2:

Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 18.09.2012 09:56

Люди, я надеюсь Вам понятно что я хочу получить?
Сейчас у меня получается такое видео:

Код:

1________________2______________3________________4______________5 ***************************************************************** 0сек 5сек 10сек 15сек 20сек


т.е. так, как пишет qwerta
1фото приходиться на 0 секунду видео;
2фото на 5секунду;
3 на 10секунду


а надо так:

Код:

11111111111111112222222222222223333333333333333344444444444444444555555555 *************************************************************************** 0сек 5сек 10сек 15сек 20сек

где цифрами обозначены изображения, а звездочки - это аудиопоток.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 18.09.2012 11:34

последнее фото должно быть продублировано после чего:

Код: Выделить всё

mencoder mf://*.jpg -mf fps=0.2 -ofps 25 -ovc lavc -oac copy -lavcopts vcodec=ffv1 -audiofile 1.mp3 -o input.avi
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 18.09.2012 12:16

Дело в том, что при таком кодировании, при перемотке трек-баром, не правильно отображается кадр.

т.е. получается так:

Код:

1________________2____(2)________3________________4______________5 ***************************************************************** -------------------------------------------^--------------------- позиция трекбара 0сек 5сек 10сек 15сек 20сек


в скобках кадр, который отображается плеером.
В общем, при перемотке кадры отображаются не вовремя.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 18.09.2012 13:04

:) А так нормально ?

Код:

mencoder mf://*.jpg -mf fps=0.2 -ofps 25 -vf scale=640:480 -ovc lavc -oac pcm -lavcopts vcodec=ffv1 -audiofile 1.mp3 -o input.avi


А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 18.09.2012 13:59

> Дело в том, что при таком кодировании, при перемотке трек-баром, не правильно отображается кадр.

Мил человек ты бы внимательно прочитал то что я тебе написал. Там готовое решение при котором на выходе 25Гц, а не 0,12.

> А так нормально ?

Фигню ты так получиш. Без -vf harddup копирование кадров работать не будет!
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 18.09.2012 19:34

Rodegast писал(а):
18.09.2012 13:59
Фигню ты так получиш. Без -vf harddup копирование кадров работать не будет!

:rolleyes:
Будет оно работать прекрасно. -vf harddup просто дает дает указание кодеку принудительно кодировать в обязательном порядке каждый кадр (а не ставить метку что этот кадр такойже как и преведущий) в каких то случаях от этого есть толк , а в какихто без разницы.
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2218
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14,2

Re: Кодирование видео-клипа из изображений

Сообщение Hephaestus » 19.09.2012 11:59

TechnoMag писал(а):
16.09.2012 21:25
Есть набор изображений: image1.jpg, image2.jpg, ..., imageN,jpg. Также есть mp3-композиция.
Нужно создать из изображений и композиции видео-клип так, чтобы время показа каждого изображения было равномерно распределено во всю длительность композиции.
Код показывает изображения первые доли секунд:

Код: Выделить всё

ffmpeg -f image2 -i image%d.jpg -i amelie.mp3 -r 25 -s 320x240 -b 320k output.avi
Если Вам удобнее ffmpeg, используйте его.
Эта Ваша команда прекрасно отработает, при условии, что кадры размножены.
Из расчета общей длительности 20сек для 5 фотографий:
25 кадров/сек * 20сек = 500 кадров.
500 кадров / 5 фотографий = 100 копий каждой фотографии.
На мой взгляд это гораздо проще, чем разбираться с длиннющими командами менкодера.

Есть еще вариант: опция -loop_input
Создать из каждой фотографии ролик нужной длины (в данном случае 4 секунды)
Примерно так:

Код: Выделить всё

ffmpeg -loop_input -t 4 -f image2 -i image1.jpg -r 25 -s 320x240 -b 1000k -sameq output1.mpg

Выполняем отдельно для каждой фотографии, получаем 5 роликов по 4 секунды.
Потом эти ролики чисто механически соединяем:

Код: Выделить всё

cat output*.mpg >video.mpg
получаем видеотрек нужной длины.
А там уж кодируем его, во что хотим и соединяем со звуком.

Вообще-то, можно попробовать -loop_input сразу для нескольких фотографий, но не знаю как сработает.
Кстати, имейте в виду, что создание видео из изображений получается лучше, если формат изображений - jpeg.
С PNG почему-то сильно теряется качество.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 19.09.2012 21:02

> Будет оно работать прекрасно

На lavc такой вариант в принципе пройдёт, но x264 и xvid выпадут в осадок.
ИХМО Лучше всё сразу по нормальному делать.

> команда прекрасно отработает, при условии, что кадры размножены.

Если я не ошибаюсь то что то подобное уже предлагали ;)
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 19.09.2012 22:44

Rodegast писал(а):
19.09.2012 21:02
На lavc такой вариант в принципе пройдёт, но x264 и xvid выпадут в осадок.
ИХМО Лучше всё сразу по нормальному делать.

Ну не известно собрана ли версия mencoder в дистрибьютиве c подержкой x264 и xvid.
Rodegast писал(а):
19.09.2012 21:02
Если я не ошибаюсь то что то подобное уже предлагали ;)

Да предлагал :) Особенно если учесть что команда вида...

Код: Выделить всё

for F in *.jpg ; do for C in $(seq -w 1 125) ; do ln -s ~/old/"$F" ~/new/"$F""$C".jpg ; done ; done

...с тремя фотографиями отработает менее чем за секунду. И позволит ,возможно, избежать каких-то подводных камней. Да и задача по переводу фото в видео была для человека одноразовая... :rolleyes:
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2218
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14,2

Re: Кодирование видео-клипа из изображений

Сообщение Hephaestus » 20.09.2012 08:34

fflatx писал(а):
19.09.2012 11:59
Вообще-то, можно попробовать -loop_input сразу для нескольких фотографий, но не знаю как сработает.
Проверил. Опция -loop_input для нескольких фотографий даёт такой же эффект, как и команда в первом посте.
Каждая фотография показывается доли секунды, потом всё повторяется и так в течение всего ролика.

Я бы на месте ТС все-таки размножил кадры. Это наиболее простой путь.
И, кстати, если пойдете по этому пути не забудьте опцию -sameq,
чтобы качество видео было неизменным в течение всего ролика.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 22.09.2012 01:50

А можно, сделать так: создать видео (без аудио-потока) в котором все изображения подряд (5 штук).
а потом дописать к нему аудио-поток с синхронизацией?

в ffmpeg есть опции -vsync, -async, правда не пойму как ими пользоваться. А может это не они ...
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2218
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14,2

Re: Кодирование видео-клипа из изображений

Сообщение Hephaestus » 22.09.2012 10:52

TechnoMag писал(а):
22.09.2012 01:50
А можно, сделать так: создать видео (без аудио-потока) в котором все изображения подряд (5 штук).
Да ради Бога. Об этом и говорим. Варианты предложены выше.
TechnoMag писал(а):
22.09.2012 01:50
а потом дописать к нему аудио-поток с синхронизацией?
А тут и синхронизация не потребуется. Главное, чтобы костюмчик сидел... то есть, тьфу, чтобы длина видеопотока в секундах совпадала с длиной аудио в секундах.
Тогда

Код: Выделить всё

ffmpeg -i video.avi -i audio.mp3 -acodec copy -vcodec copy result.avi

И всех делов.

А если вы хотите с помощью -vsync -async добиться, чтобы нужные кадры видео попали в нужные моменты аудио, тогда уж проще сделать, как я предлагал выше: создать четыре ролика нужной длины и потом механически их соединить.
Ну, а как рассчитать длительность в секундах, выше уже писали.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 22.09.2012 18:31

> Ну не известно собрана ли версия mencoder в дистрибьютиве c подержкой x264 и xvid.

Проблема не в том собрано или нет, а в том что без реального копирования кадров получается заведомо более кривой файл.

>...с тремя фотографиями отработает менее чем за секунду.
>Я бы на месте ТС все-таки размножил кадры. Это наиболее простой путь
>А можно, сделать так: создать видео (без аудио-потока) в котором все изображения подряд (5 штук).
>И всех делов.

Мыши плакали, ругались...
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 22.09.2012 19:30

Rodegast писал(а):
22.09.2012 18:31
> Ну не известно собрана ли версия mencoder в дистрибьютиве c подержкой x264 и xvid.

Проблема не в том собрано или нет, а в том что без реального копирования кадров получается заведомо более кривой файл.

>...с тремя фотографиями отработает менее чем за секунду.
>Я бы на месте ТС все-таки размножил кадры. Это наиболее простой путь
>А можно, сделать так: создать видео (без аудио-потока) в котором все изображения подряд (5 штук).
>И всех делов.

Мыши плакали, ругались...

Ни твой ни мой вариант ему не подошел. :) Значит дело не в предложеной строчке варианта кодирования. А в чем то ещё.
1. либо mencoder/ffmpeg не переваривают подсунутые фотографии. Значит надо их преобразовать в одно разрежение и навверное желательно в png.
2. либо файл музыки как то преобразован ... не так... и на нем нормально не получается создать синхронизацию. Тогда преобразуем его в wav.
3. либо имеет место и то и другое.

Да кстати в своем варианте я специально использовал ffv1 кодек предпологая что последующий файл будет перекодирован в нужный человеку кодек. Ну соотвесттвенно можно отдельно сделать видео. А потом уже к нему присобачить звук.
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 22.09.2012 20:50

>Ни твой ни мой вариант ему не подошел.Значит дело не в предложеной строчке варианта кодирования. А в чем то ещё.

ИХМО. Если бы дело было в чёмто ещё, то он бы про это давно написал. А так складывается впечатление что для него кактус всётаки вкуснее...
Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 22.09.2012 20:55

Как склеить avi, в один avi без cat?

Код: Выделить всё

ffmpeg -i output1.avi -i output2.avi -i output3.avi release.avi


не работает
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Кодирование видео-клипа из изображений

Сообщение eddy » 22.09.2012 21:33

TechnoMag писал(а):
22.09.2012 20:55
Как склеить avi, в один avi без cat?

Код: Выделить всё

mencoder *.avi -ovc copy -oac copy -o result.avi
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:

Аватара пользователя
TechnoMag
Сообщения: 298
ОС: Debian 8.0 Jessie

Re: Кодирование видео-клипа из изображений

Сообщение TechnoMag » 23.09.2012 00:29

eddy писал(а):
22.09.2012 21:33
TechnoMag писал(а):
22.09.2012 20:55
Как склеить avi, в один avi без cat?

Код: Выделить всё

mencoder *.avi -ovc copy -oac copy -o result.avi



а ffmpeg не умеет? Тут еще важен порядок кодирования файлов.
- Домашний Linux -
Памятки для пользователя
Спасибо сказали:

qwerta
Сообщения: 136
ОС: Debian Wheezy

Re: Кодирование видео-клипа из изображений

Сообщение qwerta » 23.09.2012 01:04

mencoder -ovc copy -oac copy -o result.avi 1.avi 2.avi 3.avi

При условии что все авишки кодированы одинаковыми параметрами.
А начинал я с Xebian
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2218
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14,2

Re: Кодирование видео-клипа из изображений

Сообщение Hephaestus » 23.09.2012 22:41

TechnoMag писал(а):
22.09.2012 20:55
Как склеить avi, в один avi без cat?

Код: Выделить всё

ffmpeg -i output1.avi -i output2.avi -i output3.avi release.avi


не работает
Вижу, Вы подбираетесь к завершению.
Такой вариант и не должен работать. По сути это означает запихивание в один контейнер avi три видеодорожки, а вовсе не последовательное склеивание. А в них, небось, еще и звук есть?

А почему, собственно, склеивать надо без cat? Чем он-то не угодил?
ffmpeg сам по себе не может склеить, но при его участии склеивает cat с использованием fifo. В пакете с ffmpeg есть документация, там есть FAQ, в котором есть пример. Но к данной задаче это малоприменимо, потому что там уже существующий avi разбирается на составные части. А здесь как бы всё наоборот.

Ладно, менкодер осваивать тяжко. Но объясните, чем не устраивает такой вариант:
Получаем десятисекундное видео из первой фоторгафии

Код: Выделить всё

ffmepg -loop_input -t 10 -f image2 -i image1.jpg -vcodec mpeg2video -b 1000k -r 25 -s 320x240 -sameq video1.mpg

то же самое из второй

Код: Выделить всё

ffmepg -loop_input -t 10 -f image2 -i image2.jpg -vcodec mpeg2video -b 1000k -r 25 -s 320x240-sameq video2.mpg

и из третьей

Код: Выделить всё

ffmepg -loop_input -t 10 -f image2 -i image3.jpg -vcodec mpeg2video -b 1000k -r 25 -s 320x240-sameq video3.mpg



Соединяем все вместе:

Код: Выделить всё

cat video1.mpg video2.mpg video3.mpg >video.mpg


Прикручиваем звук

Код: Выделить всё

ffmepg -i video.mpg -i audio.mp3 -vcodec mpeg4 -b 300k -acodec copy result.avi


Длительность каждого видео подбирается, исходя из длины звукового трека.
Недостатком является двойное перекодирование видео.
Избежать можно, если вместо mpg использовать "сырой" формат видео.
Кодировать сразу в avi нельзя, потому что заголовок в контейнере avi не дает механически склеивать файлы. Формат mpg в этом случае - самое то.


Вот, собственно, и все.
Это самый "долгий и неудобный" способ из всех, предложенных в этой теме.
Но даже он занял бы от силы минуты две.



Кстати, о "сыром" формате. Размножение фотографий по количеству кадров и последующее преобразование их в видео - это один из вариантов обработки "сырого" формата. И Вам его предлагали. И даже предлагали скрипт для этой задачи.

Тема висит уже неделю. Вам предложили по крайней мере три рабочих варианта, самый долгий из которых на пару минут работы. А Вы все еще не закончили.
Объясните, чего же Вам не хватает?
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Rodegast
Сообщения: 337
ОС: Linux

Re: Кодирование видео-клипа из изображений

Сообщение Rodegast » 23.09.2012 22:56

> А почему, собственно, склеивать надо без cat? Чем он-то не угодил?

Хотя бы тем что с avi этот способ не пройдёт.

> Но объясните, чем не устраивает такой вариант: Получаем десятисекундное видео из первой фоторгафии

Тут и объяснять ничего нинадо. Просто представь что у тебя более 100 фотографий.
Спасибо сказали: