Соедините одно изображение + один аудиофайл, чтобы сделать одно видео с помощью 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 вокруг и нашел дюжину предлагаемых решений (предположительно к этому самому самому вопросу), ни один из которых не работает.

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

146 голосов | спросил matteo 4 Maypm11 2011, 21:19:03

10 ответов


113

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

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.

ответил UltraDEVV 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 26 Sep 2014 20:46:55 +0400 2014, 20:46:55
32

Вы делаете это way сложнее , чем это должно быть. 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 open - лучший способ отладки вашей командной строки - путем чтения сообщений об ошибках он генерирует. Они чрезвычайно специфичны - и лучшая документация FFmpeg - но тяжелая работа разработчиков теряется, если вы разрешите закрыть окно, прежде чем сможете их прочитать.

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

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

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

ответил 16 SunEurope/Moscow2012-12-16T18:21:53+04:00Europe/Moscow12bEurope/MoscowSun, 16 Dec 2012 18:21:53 +0400 2012, 18:21:53
27

Еще проще:

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: -)

ответил PJ Brunet 26 Mayam14 2014, 06:09:30
13

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

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

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

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

ответил fguillen 28 Jpm1000000pmWed, 28 Jan 2015 23:16:15 +030015 2015, 23:16:15
7

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

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

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

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

ответил ComputerDruid 22 Mayam11 2011, 04:40:56
4

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

  

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

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

ответил Colonel Panic 16 AMpWed, 16 Apr 2014 02:15:45 +040015Wednesday 2014, 02:15:45
1

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

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

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

ответил 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2014 15:44:09 +0400 2014, 15:44:09
0

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

ответил 22 J000000Tuesday14 2014, 16:15:39
0

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

Вы можете установить входную и выходную папку, а также формат, в котором вы хотите включить видео. В этом случае я установил его в 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
ответил Suraj Jain 12 J000000Wednesday17 2017, 19:20:17
-1

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

-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"
ответил Phani varma 24 Mayam16 2016, 10:43:03

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132