Повторная выборка видео H264 для снижения частоты кадров при сохранении высокого качества изображения

Вот вывод mplayer для интересующего видео:

br@carina:/tmp$ mplayer foo.mov 
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing foo.mov.
libavformat file format detected.
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0, -alang eng
VIDEO:  [H264]  1280x720  24bpp  59.940 fps  2494.2 kbps (304.5 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 15999->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1280x720 => 1280x720 Planar YV12

Я хотел бы использовать ffmpeg, mencoder или какой-либо другой транскодер видео для командной строки, чтобы повторно сэмплировать это видео на более низкую частоту кадров без потери качества изображения. То есть каждый кадр должен оставаться максимально четким.

попытки

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • Целевая частота кадров - 25 кадров в секунду - достигнута, но отдельные кадры являются "блочными".
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • Видео эффективно не для просмотра.

Помогите!

Это выглядит как достаточно простой вариант использования. Я очень удивлен, что очевидные вещи не работают. Что-то не так с моим подходом?

3 ответа

Решение

Многое изменилось с момента публикации в 2012 году. Я добавляю этот ответ для таких людей, как я, которые находят это в поисковых системах. Мне повезло со следующим:

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

Вот краткое объяснение того, что делает каждый параметр:

  • -y: перезаписать выходные файлы без запроса
  • -i source.mp4: имя входного файла
  • -r 25: выходная частота кадров (в кадрах в секунду)
  • -s 160x90: размер выходного кадра (в пикселях) - вставляет фильтр видео масштаба
  • -c:v libx264: выходной видеокодер
    • -c:v коротка для -codec:v а также -vcodec
  • -b:v 3M: битрейт видео (в бит / с) передается в кодировщик libx264
  • -strict -2: регулирует соответствие стандартам; -2 допускает экспериментальные функции - требуется для включения встроенного аудиокодера FACmpeg AAC в сборках более старых, чем версия 2015-12-05, см. здесь, AAC теперь является аудиокодером по умолчанию.
  • -movflags faststart: переместить индекс в начало выходного файла (параметры, специфичные для формата mov и mp4)

Для более подробной информации смотрите официальную документацию.

Как указал Энди Т, вы обязательно должны перекодировать видео, но это не означает, что качество должно быть снижено каким-либо заметным образом.

Во-первых, убедитесь, что вы не используете старое программное обеспечение. Видеокодеки - это быстро развивающаяся область, которая значительно продвигается каждые несколько недель. В настоящее время x264 является самым современным программным обеспечением для кодирования видео. Это, вероятно, то, что использует mplayer, но вы можете получить самый последний реальный релиз с www.x264.nl

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

Затем используйте это как вход для x264. Я предлагаю вам использовать вспомогательное программное обеспечение, такое как Staxrip (поместите самый последний 32-битный 8-битный канал x264 в StaxRip\Applications\x264.

Если вам нужно абсолютное наилучшее качество при наименьшем размере файла, когда вы вряд ли заметите разницу, используйте командную строку, например, такую ​​(с x264):

x264 --preset placebo --tune film --crf 22 --level 4.1 --threads 1 --thread-input --sar 12:11 --output "<target>" "<source>"

У Staxrip есть опции, позволяющие переключать пресет на плацебо, настраивать источники фильма (если конечно это не анимация) и уменьшать количество потоков до 1.

Вы можете изменить "--crf 22" на 21 для более крупного и лучшего качества видео, но я обнаружил, что CRF22 очень трудно заметить разницу, даже если сравнивать кадр за кадром. Любое изменение в других настройках, вероятно, приведет к снижению качества или увеличению размера файла без повышения качества. Увеличение количества потоков значительно улучшит скорость кодирования (очевидно, в многоядерных системах), но очень немного снизит качество (или в этом случае, потому что мы используем CRF, основанный на качестве, немного увеличит размер файла, как под 1% на 4 темы).

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

Если вы хотите быть абсолютно уверены, что полученное видео выглядит максимально близко к выводу VirtualDub, никто не сможет заметить разницу с помощью CRF17, но файл будет довольно большим. Вы также можете просто сжать вывод VirtualDub (ну, не так уж и плохо!).

Вы должны перекодировать ваше видео в любом случае. Транскодирование означает, что вы декодируете свой поток, меняете частоту кадров (в простом случае отбрасываете кадры), а затем снова кодируете. Конфигурация кодирования и даже кодек не зависят от того, как изначально было закодировано ваше видео, поэтому вы можете использовать все, что подходит для ваших нужд. Если вам нужно максимально возможное качество, просто закодируйте с высоким профилем в качестве первой попытки. Затем вы можете попытаться отрегулировать это еще больше, играя с многочисленными параметрами кодирования h.264.

Другие вопросы по тегам