Использование ffmpeg для кодирования видео высокого качества [закрыто]


92

У меня есть набор видеокадров, сохраненных в виде изображений в каталоге, и я пытаюсь закодировать их в видео хорошего качества, однако каждая настройка и каждый формат, который я пробую, создают очень заметные артефакты.

Основная команда такова:

ffmpeg -r 25 -i %4d.png myvideo.mpg

и я пробовал флаги minrate и maxrate. Подойдет любой из форматов {mpg, avi, mov, flv}.

Есть предложения по настройкам? Конечный размер файла не является проблемой.


7
На моем Mac, я использую следующую команду: ffmpeg -r 20 -f image2 -i myImage%04d.png -f mp4 -q:v 0 -vcodec mpeg4 -r 20 myVideo.mp4. Я обнаружил, что для увеличения частоты кадров мне пришлось указать ее как для входных, так и для выходных файлов. Мне кажется, этот кодек работает - возможно, вам не нужно его указывать. Я просто хотел включить то, что сделал, потому что потратил много времени, работая над этим. Единственным недостатком является то, что мои входные изображения высококонтрастные (синие и красные шары на белом фоне), а позже в фильме все шары начинают становиться одного темного цвета - нежелательный эффект контраста.
jvriesem

Спасибо @jvriesem! Это отлично сработало для меня.
Дэн Лёвенгерц

Я предлагаю задать этот вопрос в StackOverflow для мультимедийных систем
Хамед

Версия c ++ stackoverflow.com/a/43464269/6180077 Посетите эту ссылку для работы с приложением для записи экрана в формате FFMPEG c ++ mp4.
Абдулла Фарвиз

проверьте эту ссылку, которая демонстрирует программную запись видеофайла с использованием библиотек FFMPEG: stackoverflow.com/a/43464269/6180077
Абдулла Фарвиз,

Ответы:


64

Пара вещей:

  • Вам необходимо установить битрейт видео. Я никогда не использовал minrate и maxrate, поэтому не знаю, как именно они работают, но, установив битрейт с помощью -bпереключателя, я могу получать видео высокого качества. Вам нужно выбрать битрейт, который предлагает хороший компромисс между сжатием и качеством видео. Возможно, вам придется поэкспериментировать с этим, потому что все зависит от размера кадра, частоты кадров и количества движения в содержимом вашего видео. Имейте в виду, что скорость DVD обычно составляет около 4-5 Мбит / с для 720x480, поэтому я обычно начинаю с этого и решаю, нужно ли мне больше или меньше, а затем просто экспериментирую. Например, вы можете добавить -b 5000kв командную строку, чтобы получить более или менее битрейт DVD-видео.

  • Вам необходимо указать видеокодек. Если вы этого не сделаете, ffmpeg по умолчанию будет использовать MPEG-1, который довольно старый и не обеспечивает такого же сжатия, как MPEG-4 или H.264. Если ваша версия ffmpeg построена с поддержкой libx264, вы можете указать ее -vcodec libx264как часть командной строки. В противном случае -vcodec mpeg4также будет работать лучше, чем MPEG-1, но не так хорошо, как x264.

  • Есть много других дополнительных опций, которые помогут вам добиться наилучшего качества при минимальных битрейтах. Посмотрите здесь несколько примеров.


6
Постоянный битрейт плохо сказывается на качестве. Лучше использовать постоянный коэффициент скорости (это один из режимов работы x264). Например: ffmpeg -i … -c:a copy -c:v libx264 -crf 18 -preset veryslow …. 18 - это CRF с очень незначительной потерей качества, но битрейт, вероятно, будет низким. И вы можете попробовать более высокие значения CRF, если вам нужен файл меньшего размера. Как видите, это довольно просто.
Отображаемое имя

обратите внимание, что -b должно быть перед видео, но после ввода -i
mateuszb

47

Вам нужно указать параметр -vb, чтобы увеличить битрейт видео, иначе вы получите значение по умолчанию, которое создает меньшие видео, но с большим количеством артефактов.

Попробуйте что-то вроде этого:

ffmpeg -r 25 -i %4d.png -vb 20M myvideo.mpg


1
это прекрасно работает для меня, спасибо;)
thiago.adriano26

16

Перед созданием видео убедитесь, что PNG полностью непрозрачны.

например, с помощью imagemagick, дайте им черный фон:

convert 0.png -background black -flatten +matte 0_opaque.png

Судя по моим тестам, ни битрейта, ни кодека недостаточно, чтобы видео выглядело хорошо, если вы загрузите ffmpeg PNG с прозрачностью


Это решило проблему для меня.
Matěj Kripner

Эта подсказка решила действительно раздражающее низкое качество видео. Большое спасибо.
dasmy

0

Если вы не выполните какую-либо постобработку, видео никогда не будет лучше исходных кадров. Также, как и в книжке-книжке, если у вас есть большой «прыжок» между ключевыми кадрами, это будет выглядеть забавно. Обычно вам нужно достаточно "анимации движения" между ключевыми кадрами, чтобы получить плавную анимацию. HTH


Изначально изображения взяты из видеоряда. Они только что немного подрезали, масштабировали и еще много чего не сделали с помощью imagemagick. Эффекты определенно являются артефактами сжатия. Теперь я видел этот пост, в котором, кажется, есть ответ: stackoverflow.com/questions/3158235/…
CakeMaster

@CakeMaster Я не упомянул сжатие с потерями, потому что в вашем примере есть изображения ".png". .png может быть с потерями, но я считаю, что это не так. .jpg почти всегда с потерями, поэтому при их использовании возникают артефакты. Если вы можете, вы можете повторно сохранить свои файлы .png со сжатием без потерь.
JustBoo,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.