Alex Lapshin (lapshinji) wrote,
Alex Lapshin
lapshinji

Categories:

Скрипты для видео


фото и видео в посте — собственные

Чтобы не потерялось и чтобы не искать долго.

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

Обойдемся программками попроще, к тому же они еще и мультплатформные.
(Я не программист, на этих файлах все мои практические познания в программировании останавливаются)



Сначала простое, хардкор оставим напоследок.


Перекодировать видео, чтобы и размер небольшой, и качество смотрибельное, чтобы не стыдно было:

Скачиваем ffmpeg — универсальный перекодировщик, больше пока ничего не надо. (Еще лучше его самому скомпилировать, потому что по соображениям патентной чистоты из скачиваемых версий убраны самые интересные/качественные библиотеки. Про компиляцию — ниже в «хардкоре»)



ffmpeg.exe -i входной_файл.avi выходной_файл.mp4

(Можно сунуть вообще в командную строку). На входе любой видеофайл, на выходе — перекодированный в приемлемое (по умолчанию) качество… тоже любой видеофайл. Если заменить, например, .mp4 на .mov, закодирует в формате Quicktime и так далее. Допустимые кодеки выбираются в зависимости от расширения, но можно выбрать и самому. По умолчанию нынче это стандарт: видео в h264 и звук в aac.

Но чтобы руками каждый раз имена не набирать, можно сделать командный файл:


cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A "converted/%%~nxA"
pause


Скопировать и сохранить в виде файла, скажем, convert.bat
Важно — прописать путь, где у вас лежит ffmpeg (у меня h:\media-autobuild_suite-master\local64\bin-video), а дальше можно сохранить его, например, на рабочий стол и кидать в него видеофайлы мышкой, причем можно сразу много (есть ограничения на длину командной строки, если ничего не происходит, загребите мышкой файлов поменьше)
В папке, где видеофайлы, создает папку "converted" и кидает туда перекодированные.

Вот такая версия дописывает к имени файла еще "conv", чтобы не путать с исходником (следите за руками):


cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A "converted/%%~nAconv%%~xA"
pause


Качеством можно манипулировать:

ffmpeg.exe -i входной_файл.avi -c:v libx264 -c:a libfdk_aac выходной_файл.mp4

-c:v показывает, каким кодеком жать видео, а -c:a — аудио. В данном случае лучшим из h264 — x264, а звук — в лучший из AAC-кодеков fdk_aac (но его может не оказаться в вашей версии ffmpeg, так что будьте внимательны. Об ошибках ffmpeg обычно внятно пишет.)

ffmpeg.exe -i входной_файл.avi -c:v libx264 -preset veryslow -crf 18 выходной_файл.mp4

…закодирует видео с «архивным» качеством и тщательно: -preset указывает на глубину анализа видео и, соответственно, скорость кодирования (линейка такая: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo. По умолчанию скорость средняя: medium. Левее быстрее, но гаже, правее медленнее, но качественнее. Про placebo понятно, что будет супермедленно, суперкачественно и визуально не отличаться от slower или veryslow). Для обычного «просмотрового» видео medium достаточно, поэтому его можно не указывать, оно по умолчанию.
-crf указывает на метод и силу сжатия видео: Constant Rate Factor (-crf) позволяет делать качество каждого кадра одинаковым (то есть при просмотре не полезут неожиданно квадраты и пятна), но поскольку оно зависит от сложности картинки (и количества шума в ней), то размерр файла немножко непредсказуем. По умолчанию -crf 23 (можно не указывать, картинка на стопкадре видно, что чуть портится, но в движении не заметно), для архивации выше -crf 18 лучше не задирать, а то размер становится конским. -crf 1 дает видео без сжатия: удобно для монтажа, но просто чудовищный размер файла. -crf 49 дает ужасающее качество.
Качеством видео можно манипулировать и по другому, чтобы оно помещалось в нужный размер, но сейчас в эти дебри лезть не стоит.

ffmpeg.exe -i входной_файл.avi -c:a libfdk_aac -cutoff 18000 -b:a 192k выходной_файл.mp4

…закодирует звук в AAC с приличным качеством: 192 килобита вместо 128 по умолчанию (хорошо для концертов, скажем) и полосой среза не в 12000 герц, а в «аудиофильские» 18000.

Ну и разумеется все это можно замешивать в батник, например:


cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A -c:v libx264 -preset veryslow -crf 18 -c:a libfdk_aac -cutoff 18000 -b:a 192k "converted/%%~nAconv%%~xA"
pause






Про звук. Спустя два с половиной года после покупки аудиорекордера Tascam DR-05 Алекс догадался, почему все длинные видео приходится досихронизировать руками: это не мистические скачки/пропадания в длинных звуковых файлах, а тупо кварц в рекордере чуть быстрее, чем надо, и поэтому каждый час звук торопится на пару секунд.

Открыл монтажку, взял длинный (больше часа) видеоролик, снятый камерой одним планом, нашел звук, записанный рекордером в этом же месте, совместил начала и посмотрел, насколько разбежалось в конце.
Получилась простая математика:

372361 кадр исходник видео (в монтажке показывается количество кадров)
372325.6 кадров до этого же места в звуке
Поделил одно число на другое, получил коэффициент замедления:
1,000095078071451

Скачал sox — это такой ffmeg для звука, конвертит любое аудио в любое и позволяет им манипулировать.

Команда получилась вот такая:

sox.exe входной_звук.wav выходной_звук.wav tempo 1.000095078071451

И вот такой bat-файл (очень похожий на предыдущие):

cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-audio\sox.exe" %%A "converted/%%~nAconv%%~xA" tempo 1.000095078071451
pause


Кинул файлы из рекордера, получил перекодированные в папке converted. Синхронизироваться стало на ура.



Смешное применение ffmpeg: создание цейтраферного видео. (Интересно, что киношники и люди, пришедшие из видео, говорят «цейтрафер», когда хотят козырнуть знаниями, а фотографы говорят «таймлапс»)

Скажем, скачали вы вот такое крутое железнодорожное видео:



А смотреть-то его и некогда, оно ж в реальном времени. На помощь приходит ffmpeg:

ffmpeg.exe -i входное_видео.mp4 -filter:v "setpts=0.1*PTS" -filter:a "atempo=2.0,atempo=2.0,atempo=2.0,atempo=1.25" выходное_видео.mp4

…оно ускоряет все события (и не уводит звук в писк) в десять раз.
(сразу в виде батника:)

cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A -filter:v "setpts=0.1*PTS" -filter:a "atempo=2.0,atempo=2.0,atempo=2.0,atempo=1.25" "converted/%%~nxA"
pause


Поскольку кино становится в десять раз короче, трех часовое видео (180 минут) превращается в достаточно разумные 18.
А 2 минуты 46 секунд превращаются в 17 секунд:



Причем если на итоговое видео снова натравить этот скрипт, оно станет еще в десять раз быстрее (итого в сто!) но будет совсем не для нервных.

В общем виде ускоритель выглядит так:

ffmpeg.exe -i входное_видео.mp4 -filter:v "setpts=0.5*PTS" -filter:a "atempo=2.0" выходное_видео.mp4

…здесь он ускоряет события в два раза. Фильтр для видео (-filter:v) setpts изменяет отсчеты (presentation timestamps, PTS) видео, указывая, сколько кадров выкидывать. Коэффициент 0.5 оставляет каждый второй кадр, 0.1 — каждый десятый и так далее. Фильтр для звука (-filter:a) atempo работает ровно наоборот, указывая, насколько ускорять или замедлять звук. 1.25 — на четверть быстрее, 2.0 — в два раза. Проблема в том, что меньше 0.5 он не замедляет, и больше 2 он не ускоряет. Но можно воспользоваться цепочкой фильтров, и ускорение в десять раз выглядит как "atempo=2.0,atempo=2.0,atempo=2.0,atempo=1.25", то есть 2×2×2×1,25=10

Если можно обойтись без звука, можно вместо всей звуковой части вставить -an или -c:a none, что то же самое (codec: audio none):

ffmpeg.exe -i входное_видео.mp4 -filter:v "setpts=0.5*PTS" -an выходное_видео.mp4

Еще примерчик с картинки для привлечения внимания:








Редкостное применение ffmpeg: создание видео с интерлейсом, зато плавного.
При слове «интерлейс» знающие люди хватаются за пистолет голову, но иногда его не избежать. Скажем, если, как сейчас модно, вы снимали видео в 50 (или 60) кадров в секунду, то бОльшая часть «железных» видеоплееров, медиатанков и плееров встроенных в ТВ, воспроизвести его сможет максимум с качеством 1280х720. Все дело в том, что «железо», в том числе спутниковое, держит стандарт в пределах level 4.1, а это значит, что больше 30 кадров в FullHD (1920x1080) ни-ни. Но хочется-то смотреть записи со спутника и рипы блюреев с «блюрейным» качеством и «плавной» картинкой!



Оказывается, так тоже можно с помощью ffmpeg.
Но тут уже колдунство, поскольку включаются дополнительные и неочевидные опции кодирования:

cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A -pix_fmt yuv420p -c:v libx264 -level 4.1 -flags +ilme+ildct -x264opts tff=1 "converted/%%~nxA.mp4"
pause


-level 4.1 задает предельный уровень стандарта (а то кодек на радостях запросто накрутит до 5 уровня, а его уже никто из железа не съест), остальные заклинания уговаривают кодек кодировать в чересстрочную развертку, interlace.

Но это если на входе тоже 50i или 60i, с видеокамеры, спутника (.ts) или файл из рипа блюрея, скажем, с концертом:


(вон там внизу написано "1920×1080i", это наш случай.

В файлах со спутника типа .ts может быть написано так:
Complete name : R:\TIF 2015\20150802_TOKYO IDOL FESTIVAL 2015 Day2_BSスカパー!.ts
Format : MPEG-TS
File size : 12.6 GiB
Duration : 2h 1mn
Overall bit rate mode : Variable
Overall bit rate : 14.9 Mbps
Duration : 2h 1mn
Bit rate mode : Variable
Maximum bit rate : 24.0 Mbps
Width : 1 440 pixels
Height : 1 080 pixels

Display aspect ratio : 16:9
Frame rate : 29.970 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Interlaced

Для экономии со спутника идет не только Interlaced, но и не 1920, а 1440 точек в ширину, которое уже в телевизоре растягивается до 1920. Ffmpeg такие тонкости обычно понимает, если все сделано правильно, и телевизор и плееры со свежими кодеками показывают картинку правильно.


Если же видеокамера снимает в 1080p50, то есть «честные» 50 (или 60) кадров в секунду, то в колдунство надо добавить еще маленький фильтр -vf interlace:



cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A -vf interlace -pix_fmt yuv420p -c:v libx264 -level 4.1 -flags +ilme+ildct -x264opts tff=1 "converted/%%~nxA.mp4"
pause





Преобразование частоты кадров:

Часто бывает так, что основной материал снят в 25 кадров, а всякие подсъемки велись на мобильник, и он снимает, например, 30 кадров в секунду. Если все это прямо так засунуть в монтажку, то монтажка начнет ресемплить кадры, создавая недостающие промежуточные, и начинается производственный ад:





Можно попробовать сделать disable resample, отключить ресемплирование на монтаже, тогда будет выбираться ближайший к нужной частоте кадр. Но тогда начнется неприятное подергивание картинки, потому что какие-то кадры будут показываться два раза, а какие-то просто выкидываться. Самое радикальное и логичное решение — замедлить видео до нужной частоты: сделать, например, из 30 → 25.
Для этого понадобятся ffmpeg, sox и еще mp4box:

ffmpeg -y -i %1 -vcodec copy -an -bsf:v h264_mp4toannexb test_track1.h264
ffmpeg -y -i %1 -acodec pcm_s16le -ar 48000 -ac 2 audio.wav
sox -V3 audio.wav output.wav tempo 0.8341675008341675
MP4Box -add test_track1.h264:fps=25 -new video_out.mp4
ffmpeg -y -i video_out.mp4 -i output.wav -c copy "%~n1_conv.mov"

(все можно наверняка сделать проще, но вот это работает у меня, а значит ок). Сохранить в .bat -файл, например "30-25convert.bat", запускать командой 30-25convert.bat имя_конвертируемого_файла.
Первая строка сохраняет видео из файла в raw, сырой формат h264 (предполагается, что фотоаппарат снимает в h264. Если нет, можно вначале перекодировать способами, которые описаны выше).
Вторая строка сохраняет звук в wav, для максимального качества.
Третья строка замедляет звук, чтобы он был синхронным с замедленным с 30 до 25 видео, на 16%.
Четвертая строка хватает сырое видео и превращает его в mp4 с новой частотой кадров (fps=25).
Пятая строка берет полученное видео и звук и собирает их в .mov. (Не в mp4 — потому что mp4 не умеет работать с wav-файлами, а лишнее сжатие на монтаже вредно.)

Если звук не нужен, можно оставить только первую и четвертую строку, и тогда на входе, кстати, может быть любая частота кадров, а на выходе всегда будет 25. Но без звука.

Точно такой же преобразователь из 50 → 25, «рапид» (замедленная съемка) в два раза, причем со звуком и без потерь:


ffmpeg -y -i %1 -vcodec copy -an -bsf:v h264_mp4toannexb test_track1.h264
ffmpeg -y -i %1 -acodec pcm_s16le -ar 48000 -ac 2 audio.wav
sox audio.wav output.wav tempo -l 0.5
MP4Box -add test_track1.h264:fps=25 -new video_out.mp4
ffmpeg -y -i video_out.mp4 -i output.wav -c copy "%~n1_conv.mov"




Хардкор

Короче говоря, ffmpeg очень интересная штука, и пользоваться ей легко и удобно. Но есть тонкости.
Проще всего скачать уже готовый дистрибутив с сайта разработчика, но есть неприятный момент — в скомпилированой для свободного доступа версии есть не всё. Тем не менее «несвободные» библиотеки доступны, и их можно скачать и скомпилировать самому. Или найти менее утонченных создателей дистрибутивов, которых подобные мелочи не парят. У собственной компиляции один плюс — всегда будет свежая версия программы. Линуксоиды компилят все и по любому поводу, у них сама операционка на этом построена, а вот в Windows все чуть сложнее. Поэтомум самый простой способ — использовать пакет автокомпиляции, который сам скачает исходники и сам скомпилирует.

Например, media-autobuild_suite.
Скачать, распаковать в папку, запустить .bat-файл, ответить на вопросы (при первом запуске), через несколько часов (!) на выходе будет россыпь всех полезных программ, включая все использованные выше, в свежайших версиях. Ну, это в идеальной ситуации.

После первого запуска в подкаталоге BUILD окажется файлик с настройками ffmpeg — ffmpeg_options.txt. В нем расписано, какие библиотеки компилировать внутрь программы. Я использую вот такие:


--enable-libass
--enable-libmp3lame
--enable-libsoxr
--enable-libtwolame
--enable-libvorbis
--enable-libxvid
--enable-libdcadec
--enable-libfreetype
--enable-fontconfig
--enable-libfribidi
--enable-opengl
--enable-libvpx
--enable-libx264
--enable-libx265
--enable-nonfree
--enable-nvenc
--enable-libfdk-aac


Самое важное там три последних строчки — включение несвободных библиотек, включение аппаратного кодирования (о нем ниже, в бонус-треке), включение лучшей библиотеки кодирования звука в aac.

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

Примечание: Японцы написали свой компилятор для кодирования под их видеосайт Niconico, там все еще несколько запутанней.




Бонус-трек: Nvidia Encoder

У кого в компе стоят последние поколения видеокарт от NVIDIA (после GeForce 600), могут воспользоваться «бесплатным» кодированием в H264, довольно приличного качества, но с довольно большим битрейтом по умолчанию.
Это позволяет порой довольно сэкономить во времени кодирования, особенно если малый размер не критичен — скажем, кодируется на Ютуб или просто «позырить».

Например, кодирование «цейтраферного» видео длиной в много часов с ускорением в 10 раз из примеров выше выглядит так:


cd %~dp0
mkdir converted
FOR %%A IN (%*) DO "h:\media-autobuild_suite-master\local64\bin-video\ffmpeg.exe" -i %%A -filter:v "setpts=0.1*PTS" -filter:a "atempo=2.0,atempo=2.0,atempo=2.0,atempo=1.25" -vcodec nvenc "converted/%%~nxA"
pause


…добавляется строчка -vcodec nvenc, указывающая, что для видеокодирования надо использовать «железный» кодек NVENC. Но поддержка его должна быть «вшита» в ffmpeg, поэтому стоит найти такую версию либо скомпилировать ffmpeg с nvcod самому.
Есть еще тонкость — у NVIDIA программно на уровне драйверов отключено nvcod-кодирование больше чем в два потока, поэтому параллельно больше двух видео в этот формат не посчитаешь. Линуксоиды это как-то победили, впрочем.
У AMD-Radeon'ов такая система называется VCE, у Intel — QuickSync, поддержка последнего точно тоже может встраиваться в ffmpeg, но подробностей я не знаю.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 7 comments