Это должно быть довольно тривиально, но я не могу найти способ заставить его работать.
Я хочу, чтобы 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
Либо я получаю ошибки, либо получаю видеофайл продолжительностью один кадр.
Я погуглил и нашел дюжину предложенных решений (предположительно по этому же вопросу), ни одно из которых не работает.
Кто-нибудь может предложить рабочую команду и объяснить обоснование этого?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Ответы:
Порядок параметров в командной строке имеет значение. Следующие работы для моего случая:
В более общем случае, где
image.jpg
и когдаaudio.wav
вы вводите данные, вы можете использовать следующую команду, адаптированную из вики FFmpeg :Это будет использовать
libx264
кодировщик и обеспечит вам лучшее сжатие, чем кодек MJPEG, использованный выше. Звук AAC, со встроеннымffmpeg
кодером AAC.источник
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.
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
это работает лучше !!!?! ??!?!Ты делаешь это намного сложнее, чем должно быть. FFmpeg намного умнее, чем вы можете себе представить - он знает, что вы хотите, чтобы видео было той же длины, что и ваша звуковая дорожка.
Единственные атрибуты вы есть , чтобы указать , являются
input filenames
, тоoutput codecs
иoutput filename
(что ео силу самого включает в себяoutput container
,).Конечно, имеет смысл начать с неподвижного изображения, которое имеет те же размеры, что и ваше возможное видео; если вы используете специальный редактор изображений вместо указания выходных размеров для соответствия FFmpeg, вам необходимо убедиться, что ваши входные размеры являются четными числами .
Размер вывода является одним из самых распространенных зависаний FFmpeg; некоторые кодеки более ограничены в выходных измерениях, чем другие, но ни один из выходных данных не может иметь атрибутов высоты или ширины с нечетным числом.
pause
Команда в конце пакетного файла держит открытую CLI - лучший способ отладки командной строки, читая сообщения об ошибках , которые он генерирует. Они чрезвычайно специфичны - и лучшая документация, которую имеет FFmpeg - но тяжелая работа разработчиков будет потрачена впустую, если вы позволите закрыть окно, прежде чем сможете их прочитать.Командная оболочка имеет переключатель,
cmd /k
который поддерживает открытое окно, в котором вы можете выполнить те же самые инструкции из вашего пакетного сценария в командной строке.FFmpeg и avconv заставят вас использовать
-c:a
в конечном итоге-acodec
и-c:v
для-vcodec
, но старые инструкции хорошо работают в сборках, которые я использую.Nota Bene: Каждый коммит имеет свои особенности. Если ваша командная строка дает сбой без видимой причины, часто бывает полезно попробовать другую сборку или перейти к libav , где последние два года самые активные разработчики FFmpeg работали . Их инструмент транскодирования был переименован в avconv, но ваши командные файлы должны работать с любым из них.
источник
Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53
Ни ваше решение, ни решение @matteo не помогли мне. Кроме того, я загрузил ваши файлы с Google Диска, но он не дал ожидаемого результата (выходной файл был черным и содержал только аудио). Пожалуйста, помогите мне определить правильную команду для использования.Еще проще:
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 :-)
источник
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
Версия, которая работала для меня:
Оформить заказ опция
-shortest
должна быть перед выходным файлом, если нет, я получаю следующую ошибку:Самый короткий параметр (завершить кодирование при самом коротком вводе) не может быть применен к входному файлу pic.jpg - вы пытаетесь применить параметр ввода к выходному файлу или наоборот. Переместите эту опцию перед файлом, которому она принадлежит. Ошибка анализа параметров входного файла pic.jpg.
источник
Из справочной страницы ffmpeg:
Как вы обнаружили, варианты infile должны предшествовать infile, к которому они применяются.
Это не ошибка, а всего лишь механизм, с помощью которого вы можете указать, к каким аргументам infile будут применяться.
источник
Это сработало для меня
Я обнаружил, что vcodec
libx264
создал файлы намного меньшего размера, чемmpjeg
(10 МБ, а не 100 МБ).источник
-shortest
является опцией вывода и может игнорироваться как опция ввода, так как вы ее используете.Я пытался сделать как @matteo , но без звука, и решение @Colonel Panic работало лучше всего:
Я только должен был добавить аргумент продолжительности в секундах (
-t 10
).источник
-shortest
это опция вывода, но вы используете ее в качестве опции ввода. Переместите его перед выходным файлом, и вы можете удалить-t 10
, но тогда ваш ответ будет почти таким же, как и остальные.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
источник
Если кто-то хочет конвертировать их, попробуйте это.
Вы можете установить входную и выходную папку, а также формат, в котором вы хотите, чтобы видео было. В этом случае я установил AVI.
Этот ответ Объединение одного изображения + одного аудиофайла для создания одного видео с использованием FFmpeg мне очень помогло.
источник
Попробуйте эту команду. Это работает для меня.
источник