image + audio = mp4: как сделать видео меньше?

12

Я использую ffmpeg, чтобы добавить JPG в MP4, чтобы сделать MP4.

Поскольку для создания видео используется только одно изображение, мне интересно, есть ли способ уменьшить размер видео?

Команда:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Результаты:

  • image.jpg = 26,7 КБ (изображение не очень четкое)
  • audio.mp3 = 64,6 млн (54 минуты)
  • output.mp4 = 80.6M (результат видео не очень четкий, музыка все еще хорошая)

Это разумный размер для MP4?

Sidu
источник
Интересно, можно ли мета mp4 так, чтобы он воспроизводил только mp3 и держал экран фиксированным на одном jpg, чтобы сохранить размер :)
SIDU
Каков целевой игрок, устройство или сайт для вывода?
Llogan
Я пытаюсь загрузить .mp4 на Youtube.com
SIDU

Ответы:

18

Для загрузки на YouTube

H.264: самые маленькие файлы

Этот метод использует libx264 для кодирования видео H.264. Это медленнее, чем метод потокового копирования ниже, но потенциально выдает файл меньшего размера.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Потоковое копирование: самый быстрый процесс

Этот метод просто потоковое копирование (без кодирования) изображения в контейнер MKV. Это очень быстро, но если размер важен, чем приведенный выше метод может создать файл меньшего размера.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube принимает практически все, поэтому эти команды используют несколько приемов для ускорения кодирования или уменьшения размера файла и поддержания высокого качества, поскольку YouTube перекодирует все, что вы ему дадите. Возможно, вашему плееру это не понравится, но YouTube это понравится.

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


Самая широкая совместимость для любого игрока

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Это должно играть практически на всем, кроме очень древних устройств (измените -profile:v mainна, -profile:v baselineесли это так).

  • Если ваш аудиовход уже AAC, измените -c:a aacна, -c:a copyчтобы избежать ненужного перекодирования.

  • Время кодирования будет больше, а размер файла будет больше, чем приведенные выше команды YouTube.

  • См. FFmpeg Wiki: H.264 для получения дополнительной информации.

llogan
источник
Не могли бы вы предоставить строку кода, чтобы сделать a.jpg + a.mp3 = a.mp4 в 1280 * 720 с самыми низкими кадрами в секунду, разрешенными YouTube? Кроме того, поскольку есть только одна работа, мне нужно удалить "-loop 1"? Заранее спасибо.
СИДУ
@SIDU Существующая команда выполняет то, что вы запрашиваете (кроме вывода MKV вместо MP4), но я не знаю, какая самая низкая частота кадров, поддерживаемая YouTube. Вам просто придется экспериментировать. Зачем вам MP4, когда вы просто загружаете на YouTube?
Llogan
Я попробовал, но там написано:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules
@NineCattoRules Трудно сказать без дополнительной информации. Используйте сайт pastebin, чтобы показать свою полную ffmpegкоманду и полный вывод консоли из команды, а затем укажите ссылку в комментарии.
Llogan
Спасибо, я переустановил FFMPEG с помощью репозитория mc3man и теперь работает хорошо!
NineCattoRules
3

Только с той информацией, которую вы предоставили, я могу придумать.

Пойдем по частям:

Поскольку к видео добавлено только одно изображение. Мне интересно, есть ли способ уменьшить размер видео, например, заставить скорость передачи в секунду = 1 вместо 28?

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

То, о чем вы говорите, это кадры в секунду (fps), а не битрейт. И ты прав в концепции. Бининг только одного неподвижного изображения 1 кадр / с не будет проблемой.

Это разумный размер для mp4? Имеет ли значение размер изображения?

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

Должен ли я изменить размер jpg до 1080 * 720 и сделать дополнительные настройки в ffmpeg для вывода в формате 720p (что тогда является настройкой ffmpeg :)?

Разрешение, которое вы говорите, это 1280x720.

Я не вижу смысла в -loop 1опции здесь, это только замедлит процесс. Вы использовали, -shortestпотому что файл имеет более 1 входного потока? Если нет, то нет причин использовать его. Поскольку вы использовали, -acodec copyя должен предположить, что вы не хотите перекодировать его.

Для вывода 720p 1fps без перекодирования и не касаясь битрейта:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Запишите случай, когда у него более одного входного потока, и вы хотите, чтобы ffmpeg завершил кодирование на самом коротком потоке:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Теперь, если вам нужно изменить битрейт (скажем, 1024k в качестве примера);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Смотрите: Ограничить выходной битрейт

-c: копия = Копировать входной аудиопоток, чтобы мы не перекодировали.

-b: v = битрейт, указанный как (не точно) постоянный.

-bufsize = Это интервал, в котором рассчитывается средний битрейт. Означает самое низкое качество изображения с большей потерей, но более точные битрейты в соответствии с указанным в -b: v .

-s = фактический размер видео выхода.

-framerate = частота кадров ввода, которую мы хотим использовать для вывода.

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

Исходя из того, что вы говорите, информации, которую вы предоставляете, и того, что вы пытаетесь сделать, я думаю, что ваша цель - встроить обложку альбома в mp3. Если это ваша цель, это будет лучше соответствовать вашим требованиям:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = Спецификатор метаданных ffmpeg для вывода файла из infile. В этом случае ( ноль ) глобальные метаданные.

-map 0 = входной поток 1 (аудио).

-map 1 = входной поток 2 (изображение).

Если здесь ничего не соответствует вашим запросам, пожалуйста, дайте больше информации.

Фенрир
источник
Подумайте об использовании -framerateв качестве параметра ввода и об удалении вывода -r: в противном случае будет использоваться стандартная частота кадров ввода 25, а затем ffmpegбудут пропущены кадры -r 1. Если вы просто объявите входную частоту кадров, то на выходе будет использоваться та же частота кадров.
Llogan
Спасибо. Не знал этого. Отредактировано, чтобы отразить предложенные изменения.
Фенрир
Спасибо за урок. Моя оригинальная строка кода ffmpeg была копией-вставкой из поиска Google, и я понятия не имею, что к чему.
СИДУ