167

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

Я хочу, чтобы 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

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

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

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

10 ответов10

128

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

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

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

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 со встроенным кодером AAC ffmpeg .

38

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

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

pause

Единственные атрибуты, которые вы должны указать, - это input filenames, output codecs и output filename (в том числе ipso, output container ).

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

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

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

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

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

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

31

Еще проще:

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

14

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

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

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

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

8

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

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

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

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

4

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

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

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

1

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

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

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

0

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

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
-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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .