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?


Интересно, можно ли мета 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 для получения дополнительной информации.


Не могли бы вы предоставить строку кода, чтобы сделать 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, и я понятия не имею, что к чему.
— СИДУ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.