Создание видео со звуком и неподвижным изображением для YouTube

23

Я запускаю следующую команду:

ffmpeg -i audio.mp3 -ar 44100 -f image2 -i logo.jpg -r 15 -b 1800 -s 640x480 foo.mov

Который успешно выводит видео с моим записанным аудио и изображением на нем.

Когда я пытаюсь загрузить его на YouTube, он не может быть обработан независимо от форматов, которые я пробую: .mov, .avi, .flv, .mp4

Есть ли какая-то настройка, которую я пропускаю в приведенном выше, которая генерирует формат, который примет Youtube? Я попытался просмотреть документацию ffmpeg, но я нахожусь над моей головой.

Я провел эксперимент, поставив 2-секундное видео с 30-секундным mp3. Когда я загрузил на YouTube, видео получилось всего 2 секунды. Таким образом, может случиться так, что YouTube просматривает только видео дорожку по длине, и, поскольку картинка имеет длину всего кадра или что-то в этом роде, возможно, это мешает ей.

thekevinscott
источник

Ответы:

13

Вот что сработало:

ffmpeg -i audio.mp3 -f image2 -loop 1 -i logo.jpg 
-r 15 -s 640x480 \
-c:v libx264 -crf 18 -tune stillimage -preset medium \
-shortest foo.mov

В частности, loopопция, которая будет дублировать изображение в виде кадров. Затем ему также понадобится shortestопция, чтобы предотвратить рост и рост файла (таким образом он усекает его до длины самого короткого потока - здесь, аудиофайла).

rОпция изменяет частоту кадров, а также crf 18устанавливает качество (использовать более высокое значение здесь более низкого качества видео). Смотрите здесь для получения более подробной информации: FFmpeg: лучший инструмент для обработки видео и аудио

thekevinscott
источник
2
Не работает для меня Я получаю однокадровый фильм.
Павел Власов
Я работаю на меня сейчас.
molnarg
4

Кусок кода, который работает для меня, с другого форума:

ffmpeg -loop 1 -r ntsc -i image.jpg -i song.mp3 -c:a copy -c:v libx264 -preset fast -threads 0 -shortest output.mkv 
Павел Власов
источник
2

Я взял код Павла, который тоже работал для меня, и сократил его, обрезав ненужные опции:

ffmpeg -loop 1 -shortest -i <audio file> -i <image file> <output video file>

это общая форма, которая работает с любым изображением и аудиофайлом в качестве входных данных и создает видеофайл в качестве выходных данных.

Тем не менее, поскольку ваш видеопоток будет состоять из одного изображения, повторяющегося бесконечно, вы можете установить низкую частоту кадров (то есть количество изображений, которые появляются в секунду) с помощью -r. Обратите внимание, что не все выходные контейнеры допускают низкую частоту кадров. То, что делает avi, так что вы могли бы сделать:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> output.avi

это приведет к созданию видеофайла с частотой кадров 0,1 (т.е. одно изображение каждые 10 секунд) вместо значения по умолчанию 25. Это повлияет на размер файла, но не на качество видео. В конце концов, вы можете установить битрейт аудио, чтобы получить лучшее качество звука -ab. Это команда, которую я на самом деле использую для создания такого рода видео для YouTube:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> -ab 128k output.avi
etuardu
источник
Спасибо. Я побежал, ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.aviно получил «Вариант цикла не найден». Любые идеи?
Полковник Паника
@col Если вам все еще интересно: вам нужен параметр loop перед вводом изображения, а не перед звуком.
slhck
вот что сработало для меня:ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
Karolinger
2

с помощью avconv:

avconv -i input.mp3 -loop 1 -f image2 -i logo.png -r 30 -s 640x480 -ab 128k -ar 44100 -ac 1 -ss 00:00:00.000 -t 01:02:03.123 foo.ogv
ZiTAL
источник
Добро пожаловать в SuperUser и спасибо за ваш ответ. Еще несколько подробностей о том, что вы предлагаете и почему было бы полезно.
Брэд Паттон
1
ответ из-за того, что ffmpeg устарела
ZiTAL
2
Нет, проект ffmpeg продолжается. Был спор, который привел к устаревшему сообщению. См. Stackoverflow.com/questions/9477115/…
Брэд Паттон,
2
Используйте параметры -shortestвывода вместо ручного объявления времени (также используйте ffmpegвместо, avconvесли возможно).
llogan
2
Сделал сценарий bash на случай, если кому-то будет интересно
Dallaylaen
0

Я заставил это работать после долгих экспериментов: https://www.youtube.com/watch?v=qjlDT819Q3s

  1. Преобразуйте изображения в видео согласно https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images :

    ffmpeg -framerate 1/20 -i png/img-%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4

    Здесь я использую несколько изображений и заставляю их меняться каждые 20 секунд.

  2. Объедините достаточное количество копий вышеупомянутого видео, чтобы охватить продолжительность вашего аудио согласно https://trac.ffmpeg.org/wiki/Concatenate . Другие решения, такие как ожидание ffmpeg -i wav.wav -i png.mp4 youtube.mp4правильных действий, в конечном итоге были отклонены YouTube (также такие игроки, как VLC, находятся в замешательстве и не могут искать должным образом). Я предполагаю, что временные позиции должны быть скорректированы в копиях, что ffmpegне происходит, если они не объединены:

    ffmpeg -f concat -i pngs.txt -c copy pngs.mp4

    (где файл pngs.txtсделан вручную, чтобы содержать столько копий, сколько необходимо: копии = длина аудио / видео)

  3. Смешайте ваш аудио с видео, полученным в 2 согласно https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/ :

    ffmpeg -i pngs.mp4 -i wav.wav -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4

Теперь файл youtube.mp4должен быть принят YT.

infojunkie
источник