Привет я использую ffmpeg для добавления a.jpg к an.mp3 для создания mp4
Как существует только одно изображение, добавленное к видео. Я задаюсь вопросом, существует ли способ уменьшить размер видео, например, вызвать скорость передачи / второй = 1 вместо 28?
Поскольку это - неподвижное изображение, никакая потребность измениться. просто останьтесь неподвижными.
Обновленный:
a.jpg = 26.7K (image not so clear)
a.mp3 = 64.6M (54 minutes)
a.mp4 = 80.6M (video result is not so clear, music still good)
И вот cmd строка:
$ ffmpeg -loop 1 -i a.jpg -i a.mp3 -shortest -acodec copy a.mp4
И я сделал другой тест с разумным размером изображения приемлемого качества видео:
a.jpg = 151K
a.mp3 = 5.1M (5 minutes)
a.mp4 = 9.2M
И вот выходной результат:
Действительно ли это - разумный размер для mp4? Размер изображения имеет большое значение? Я должен изменить размер jpg к 1 080 * 720 и установить дополнительные настройки в ffmpeg для вывода как 720 пунктов (что ffmpeg устанавливает затем :)?
Этот метод использует 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 для получения дополнительной информации.
Я могу придумать только ту информацию, которую вы предоставили.
Давайте разберемся по частям:
Поскольку к видео добавлено только одно изображение. Мне интересно, есть ли способ уменьшить размер видео, например, принудительно установить битрейт в секунду = 1 вместо 28?
Поскольку это неподвижное изображение, менять не нужно. просто оставайтесь на месте.
То, о чем вы говорите, это кадров в секунду (fps) , а не битрейт. И вы правы в концепции. Сделайте всего одно неподвижное изображение 1 кадр / с - не проблема.
Это разумный размер для mp4? Имеет ли значение размер изображения?
В этом случае размер изображения не будет иметь большого веса, потому что мы имеем дело только с одним неподвижным изображением. Если бы это было высококачественное видео, то это была бы другая проблема.
Следует ли мне изменить размер jpg до 1080 * 720 и сделать дополнительные настройки в ffmpeg для вывода в формате 720p (тогда каковы настройки ffmpeg :)?
Разрешение вы говорите, что это 1280x720.
Я не вижу здесь смысла в параметре -loop 1
, это только замедлит процесс. Вы использовали -shortest
, потому что у файла более 1 входного потока? Если нет, то нет причин использовать его. Поскольку вы использовали -acodec copy
, я должен предположить, что вы не хотите его перекодировать.
Для вывода 720p 1 кадр / с без перекодирования и без изменения битрейта:
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: a copy = Копировать входной аудиопоток, чтобы мы не перекодировали его.
-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 для вывода файла из файла. В этом случае ( ноль ) глобальные метаданные.
-map 0 = Входной поток 1 (аудио).
-map 1 = Входной поток 2 (изображение).
Если здесь ничего не подходит для ваших запросов, дайте дополнительную информацию.