Обработка видео для публикации в интернет (подготовка к публикации видео на Youtube при помощи FFmpeg)

by Anton Chernousov aka GITA-DEV


Опубликовано: 01 Мар 2018 (последние правки 2 месяца)


Обработка видео для публикации в интернет (подготовка к публикации видео на Youtube при помощи FFmpeg)

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

Сжатие видео-файлов средствами FFMPEG

Конвертируем видео в формат .h264

До недавнего времени .h264 считался стандартом де-факто для видео в WEB (и сейчас считается, так как форматы конкуренты VP8 и VP9 не достигли еще такой популярности), а типовая команда осуществляющая такую конвертацию из видео файла в любом формате (который сможет прочитать ваш FFmpeg) выглядит следующим образом:

$ ffmpeg -i <input-file-any-format>.mov -vcodec h264 -acodec aac -strict -2 <output-video-file>.mp4

Параметры vcodec и acodec задают выходной аудио и видео кодеки, а формат файла источника определяется автоматически.

Конвертируем видео в форматы VP8 и VP9

Форматы VP8 и VP9 сейчас активно продвигаются и вы можете с легкостью конвертировать любые ваши видеофайлы в эти форматы. После того, как я приведу примеры команд, которые я применяю для конвертации видео (аналогично .h264),мы попробуем преобразовать в форматы VP8 и VP9 большой OpenSource мультфильм Big Buck Bunny (кстати, мультик смешной, рекомендую посмотреть).

Для конвертации в формат VP8, я рекомендую использовать команду (я пробовал разные варианты, но этот самый нормальный):

# ffmpeg -i <input-file-any-format>.mov -vcodec libvpx -qmin 0 -qmax 50 -crf 10 -b:v 1M -acodec libvorbis <output-video-file>.webm

Параметры -crf 10 и -b:v 1M задают "качество видео" после преобразования, где -b это битрейт результирующего файла, а -crf "показатель качества" и чем он меньше тем лучше.

Для конвертации в формат VP9, используйте другую команду:

# ffmpeg -i <input-file-any-format>.mov -vcodec libvpx-vp9 -b:v 1M -acodec libvorbis <output-video-file>.webm

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

Перекодирование Big Buck Bunny в формате 4K из формата H264 в формат VP8 заняло около пяти часов (266 минут) (перекодирование производилось на процессоре Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz), а перекодирование того же мультфильма в формат VP9 заняло заняло шесть с половиной часов (383 минуты).

При этом объемы файлов составляли:

  • 300 мегабайт пережатый кодеком VP8
  • 106 мегабайт в случае с VP9

Нормализация видео (перекодирование с высоким уровнем сжатия)

Иногда при записи Let's play видео требуется снизить нагрузку на процессор и для этого мы можем настроить запись видео таким образом, что в результате мы получим файл огромного размера (с минимальной обработкой сжатия на лету) и для приведения такого файла в порядок его требуется нормализовать.

Для нормализации видео-файлов можно использовать команду:

$ ffmpeg -i ./<input-file>.mkv -preset slower  -vcodec h264 -acodec aac ./<output-file>.mp4

Небольшой пример нормализации нескольких видео-файлов проекта Let's play-записи с низким уровнем сжатия:

103M    ./TestPlayStation3-1.mkv
31M     ./TestPlayStation3-1.mp4
1,1G    ./TestPlayStation3-2.mkv
106M    ./TestPlayStation3-2.mp4
1,6G    ./TestPlayStation3-3.mkv
182M    ./TestPlayStation3-3.mp4

Получение сведений о файле (кодек и т.п.)

Если у вас возникли вопросы по формату имеющегося видео-файл, то вы можете воспользоваться командой:

$ ffmpeg -i ./<any-supported-file>.mp4 -hide_banner

Обратите внимание на параметр -hide_banner, он подавляет вывод информации о версии FFMPEG и прочую сборочную техническую информацию. В результате выполнения этой команды вы получите достаточно много информации о имеющемся у вас файле:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './VID_20180309_111755.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2018-03-09T04:17:55.000000Z
    location        : +55.0043+083.0136/
    location-eng    : +55.0043+083.0136/
    com.android.version: 7.0
  Duration: 00:14:00.66, start: 0.000000, bitrate: 12283 kb/s
    Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 12082 kb/s, SAR 1:1 DAR 16:9, 30.20 fps, 30 tbr, 90k tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2018-03-09T04:17:55.000000Z
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 192 kb/s (default)
    Metadata:
      creation_time   : 2018-03-09T04:17:55.000000Z
      handler_name    : SoundHandle
At least one output file must be specified

Выше приведен пример обычного видео-файла снятого на Android-телефон.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .

Блог это некоммерческий проект! Если вам понравился мой блог и то что я пишу помогло вам на практике, то можете сказать спасибо материально.