Вопрос: Соедините одно изображение + один аудиофайл, чтобы сделать одно видео с помощью FFmpeg


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

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

Мне не очень-то интересно, какой видеокодек используется для вывода, но очень важно, чтобы я мог использовать «копию» в качестве аудиокодека (т. Е. Копировать аудиопоток без его перекодирования).

Какая правильная командная строка будет делать это?

Я пытался:

ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi

и попробовал много комбинаций с и без -s 640x360, -loop_input, -shortest, -t xxx, -r 0.1 (искусственно низкая частота кадров в надежде на то, что видео будет больше) и -f image2

Либо я получаю ошибки, либо получаю видеофайл продолжительности одного кадра.

Я googled вокруг и нашел дюжину предлагаемых решений (предположительно к этому самому самому вопросу), ни один из которых не работает.

Может ли кто-нибудь предложить рабочую команду и объяснить обоснование этого?


148
2018-05-04 17:19


Источник


Я просто попробовал вашу командную строку, и она работала, как ожидалось. Ваша проблема может заключаться в звуковом формате. Выполняет ли транскодирование звук? - Captain Giraffe
Под «как ожидалось» вы имеете в виду, что получившееся видео имеет такую ​​же продолжительность, что и аудиовход? Вы играли в нее? Разве это не одноразовый? - matteo
Звуковой формат не является проблемой, транскодирование звука работает - matteo
У меня тоже был вопрос о параметрах, и это стоило мне часов! Слишком плохо эти проблемы не рассматриваются в помощи. gregoire.org/2009/12/05/fun-with-ffmpeg - Paul Gregoire
это лучше, чем выбранный ответ, я экспериментировал и быстро, а размер файла маленький.ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi - Muhammad Umer


Ответы:


Порядок опций в командной строке имеет значение. Следующие работы для моего случая:

ffmpeg -loop 1 -shortest -y -i image8.jpg -i sound11.amr -acodec copy -vcodec mjpeg result.avi

В более общем случае, где image.jpg а также audio.wav ваш ввод, вы можете использовать следующую команду, адаптированную из FFmpeg wiki:

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4

Это будет использовать libx264 кодировщик и обеспечить лучшее сжатие, чем кодек MJPEG, использованный выше. Аудио - это AAC, со встроенным ffmpeg AAC.


115
2017-12-16 14:21



Почему файлы в конечном итоге намного больше [размер изображения] + [размер аудиофайла]? Я ожидаю, что сжатие видео сойдет с ума с постоянной рамкой? - Alec Jacobson
Это зависит от используемого вами видеокодека. Если вы копируете команды в моих примерах, я использую mjpeg в качестве кодека, который сжимает каждый кадр отдельно, поэтому не имеет никакого преимущества тот факт, что все кадры равны. Кроме того, я думаю, что даже другие кодеки будут каждый раз перекодировать весь кадр, то есть каждый N-й кадр, поэтому вы получите гораздо меньший файл, но все же намного больше, чем размер изображения + звука. Они делают это, потому что (а) в противном случае декодер должен будет прочитать весь файл с самого начала, даже если вы просто хотите перейти к последнему кадру и - matteo
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to. - wim
Этот ответ в настоящее время обсуждается по мета. - DavidPostill♦
@matteo нажмите «изменить» под ответом, а в правом нижнем углу появится кнопка с надписью «community whatever», и вы переключите ее и сохраните - TankorSmash


Вы делаете это путь Сильнее чем это должно быть. FFmpeg намного умнее, чем вы даете ему кредит - он знает, что вы хотите, чтобы видео было такой же длины, как и ваша звуковая дорожка.

ffmpeg -i still.png -i narrate.wav -acodec libvo_aacenc -vcodec libx264 final.flv

pause

Единственные атрибуты вы иметь для определения input filenames, output codecs, и output filename (который eo ipso включает output container,).

Конечно, имеет смысл начать с неподвижного изображения, которое имеет те же размеры, что и ваше видео; если вы используете выделенный редактор изображений вместо указания выходных измерений для встречи FFmpeg, вам нужно убедитесь, что ваши входные размеры - это четные числа,

Размер выходного файла один из самых распространенных разворотов FFmpeg; некоторые кодеки более ограничены в размерах вывода, чем другие, но ни один вывод не может иметь атрибуты высоты или ширины нечетного числа.

pause команда в конце командного файла открывается CLI - лучший способ отладки вашей командной строки - это прочитать сообщения об ошибках он генерирует. Они чрезвычайно специфичны - и лучшая документация FFmpeg - но тяжелая работа разработчиков пропадает, если вы разрешите закрыть окно, прежде чем сможете их прочитать.

Командная оболочка имеет переключатель cmd /k который поддерживает открытое окно, в котором вы можете запускать те же самые инструкции из вашего пакетного сценария в командной строке.

FFmpeg а также avconv оба помогут вам использовать -c:aдля -acodec а также -c:vдля -vcodec в конце концов, но старые инструкции прекрасно работают в строках, которые я использую.

Нота Бене: Каждое совершение имеет идиосинкразии. Если ваша командная строка не работает без видимых причин, часто бывает полезно попробовать другую сборку - или следовать за развилкой libav, где наиболее активные разработчики FFmpeg были в течение последних нескольких лет. Их инструмент перекодирования был переименован avconv но ваши командные файлы должны работать с одним из них.


32
2018-05-26 02:09



Я должен использовать другую версию, чем youurs (если вы пробовали свою команду, и она работает, как вы описываете), потому что, как я уже упоминал в вопросе, я уже пробовал вашу ту же самую команду, и я получаю видео с продолжительностью 1 кадр (доля секунды), а не продолжительность аудиофайла. Я ожидал, что это будет умным, но (в моей версии) это оказалось не так. - matteo
Привет, Маттео, да, я выполнил этот код, и да, он работает как рекламируемый. Я уверен, что есть много полудухов, которые были бы настолько небрежны, чтобы делать такие заявления без их тестирования, поэтому я постараюсь не обижаться :) В следующем посте ниже я поставлю ссылки Pastebin на вывод консоли FFmpeg и MediaInfo данные о входных файлах и файле окончательного вывода. Мои входные файлы, мой командный файл, мой выходной файл находятся в GoogleDrive, где они находятся свободно загружаемый, если вы хотите протестировать их против своей сборки FFmpeg.
@ShinMuraoka Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53 Ни ваше решение, ни решение @matteo не работали для меня. Кроме того, я загрузил ваши файлы с Google Диска, но он не дал ожидаемого результата (выходной файл был черным, содержал только аудио). Пожалуйста, помогите мне найти правильную команду для использования. - coding_idiot
«no output может иметь атрибуты высоты или ширины нечетного числа» Не верно. Установите pix_fmt на то, что не имеет поддиапазонов цветности, например rgb24 или yuv444p, затем убедитесь, что кодек и контейнер поддерживают его и не имеют никаких дополнительных ограничений. Что касается pix_fmt, FFmpeg менее интеллектуальный; он предполагает yuv420p (который имеет передискретизацию цвета), если вы не сообщите об этом иначе. - Jonathan Baldwin
как насчет нескольких изображений? Мне нужно, чтобы изображение изменилось в определенное время на другое изображение. Я хотел бы иметь возможность указать их в командной строке с параметром времени для каждого из них.


Еще проще:

ffmpeg -i ep1.png -i ep1.wav ep1.flv

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

Обновление: я заметил, что YouTube испытывает трудности с обработкой видео (застрял на 95%). Я думаю, потому что есть только один кадр. Решение, которое я нашел, чтобы сделать YouTube счастливым: добавьте больше фреймов. Кроме того, я добавил-acodec copy для сохранения качества звука. Тебе нужно -shortest или он петли навсегда. (Он останавливается в конце кратчайшего потока, который является звуком, потому что цикл изображения бесконечен.) Порядок ваших параметров очень важен для скорости, так как фильтры (и такие) обрабатываются в указанном порядке. Если вы измените порядок этих параметров, результаты резко отличаются. 

ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv

Также обратите внимание, что я дважды установил частоту кадров, это не случайность - первая частота кадров для входа, вторая - для выхода. Если вы сделаете это правильно, должен быть только один кадр в секунду видео, что означает, что он кодирует относительно быстро. Также я установил разрешение на 720p, что означает, что вы должны получить HD-звук на YouTube :-)


27
2018-01-28 20:16



Также возможно, что ваш аудиофайл не будет совместим с вашим контейнером .flv. В этом случае вы должны просто попробовать другой (выходной) контейнер, например .webm, .avi или любой другой формат, пока не найдете формат контейнера, совместимый с вашим аудиофайлом. - PJ Brunet
Использовал это для .JPG и .MP3, чтобы MP4 работал отлично. FLV, созданный мной из JPG / MP3, не работал, что может быть как в предыдущем предупреждении комментариев.
Обновленная версия работает для Youtube. Я думал, что он застрял на 95%, но, в конце концов, он сработал. - Basj
получил это: No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457) ... это работает: ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4 - NineCattoRules
как насчет нескольких изображений? Мне нужно, чтобы изображение изменилось в определенное время на другое изображение. Я хотел бы иметь возможность указать их в командной строке с параметром времени для каждого из них.


Версия, которая работала для меня:

 ffmpeg -loop 1 -y -i pic.jpg -i sound.amr -shortest video.mp4

Оформить заказ -shortest должен быть перед выходным файлом, если нет, я получаю следующую ошибку:

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


13
2018-05-22 00:40



Спасибо за это. Большинство других ответов не работало для меня (используя ffmpeg на Alpine linux). Этот ответ имеет самую короткую команду, которая безупречно работала для меня. - DannyB


Из справочной страницы ffmpeg:

ffmpeg [[infile options][-i infile]]... {[outfile options] outfile}...

Как вы выяснили, параметры вторжения должны быть до вторжения, к которому они применяются.

Однако это не ошибка, а просто механизм, с помощью которого вы можете указать, к каким аргументам относятся.


7
2018-04-15 22:15



как насчет нескольких изображений? Мне нужно, чтобы изображение изменилось в определенное время на другое изображение. Я хотел бы иметь возможность указать их в командной строке с параметром времени для каждого из них.


Это сработало для меня

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.mp3 -acodec copy -vcodec libx264 video.avi

Я нашел vcodec libx264 создал гораздо меньше файлов, чем mpjeg (10 МБ, а не 100 МБ).


4
2017-09-18 11:44



-shortest является опцией вывода и может игнорироваться как опция ввода, когда вы ее используете. - LordNeckbeard


Я пытался сделать так: @matteo, но без звука и @Colonel PanicЛучшее решение:

ffmpeg -loop 1 -shortest -y -i still.png -vcodec libx264 -t 10 video.avi

Мне нужно было добавить аргумент продолжительности в секундах (-t 10).


1
2017-07-22 12:15



-shortest является вариантом вывода, но вы используете его как вариант ввода. Переместите его перед выходным файлом, и вы можете устранить -t 10, но тогда ваш ответ будет почти таким же, как и другие. - LordNeckbeard


ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4


0
2017-07-12 16:20



Можете ли вы объяснить, как работает ваша команда? - neelsg
Этот ответ не сильно отличается от других простых «комментариев-ответов» здесь. - LordNeckbeard


Если кто-то хочет их конвертировать, попробуйте это.

Вы можете установить входную и выходную папку, а также формат, в котором вы хотите, чтобы видео было. В этом случае я установил его в AVI.

Этот ответ Соедините одно изображение + один аудиофайл, чтобы сделать одно видео с помощью FFmpeg Мне очень помогли.

 @echo off
 set "sourcedir=C:\Users\CodeHard\Desktop\BOX\Newfolder"  
 set "outputdir=C:\Users\CodeHard\Desktop\BOX\Converted" 

 PUSHD "%sourcedir%"

 for %%F in (*.mp3) DO ffmpeg -r 1 -loop 1 -i abc.jpeg -i "%%F" -acodec copy -r 1 -shortest -vf scale=1280:720 "%outputdir%\%%F.avi"  

 POPD

0
2018-05-24 07:43





Попробуйте эту команду. Это сработало для меня.

-y -i /storage/emulated/0/images.jpg -i /storage/emulated/0/audio.wav -acodec aac -vcodec mpeg4 -s 480*320 -f mp4 -r 2 /storage/emulated/0/output.mp4"

-1



Это неполная команда, которая не может работать. Хотя я могу исправить и отладить вашу команду, я не буду выполнять вашу работу за вас, поэтому, пожалуйста, отредактируйте свой ответ и исправьте его самостоятельно. Я также заметил, что ваш размер видео не тот, что хотел Matteo. - karel