Идет активная разработка SECAM-фильтра, альфа-версии от разных участников уже доступны.
Версия mertvoprog для ffmpeg:
У ffmpeg’овских фильтров куча ограничений, geq максимум 9 регистров может, ну и вообще оно люто костыльное и медленное. На полноценном ЯП лучше выйдет, тупо жахнем yuv420p через пайп в него и из него.
Мы почитали матчасть и вроде наконец поняли, как SECAM-факелы образуются: из-за того, что там цветность и свет в одной модуляции, а полоса цветности внутри полосы цветности — в местах резких перепадов яркости сигнал яркости пересекает сигнал цветности, и декодер цветности некоторое время отслеживает не тот сигнал. Чтобы это произошло — производные сигналов в точке пересечения должны быть примерно равны (посему это случается не в любых таких местах, а лишь в некоторых).
Выраженно красные/синие факелы потому, что из-за намного большей ширины полосы яркости для декодера цветности сигнал вне полосы цветности — это лютый перегруз.
Следить «не за тем сигналом» декодер может долго. Мы нашли запись арабского телевидения, там это особенно наглядно: на однотонных зелёных простынях факелы просто огромные.
Факелы же в произвольных местах кадра возникают из-за шума в сигнале яркости: резкие перепады возникают в произвольных местах. Ещё перепад яркости в VBI тоже может восприниматься декодером цвета, отчего возникает полоса факелов у левого края.
Короче, надо будет это всё формализовать и закодить. А то в ffmpeg-реализацию заложены более грубые принципы, а ещё она ложно срабатывает на кадрах без цветности, чего вообще быть не должно. Можно даже изи добавить режим «пропадания цвета», с выводом OSD PAL/AUTO
/MESECAM/AUTO
:3
#!/bin/sh
ffmpeg -i video.mp4 -lavfi '
nullsrc=s=80x360, geq=lum=128:cb=128+tan(random(12389)*1.5)*4*sin(Y/10):cr=128[blue_noise];
nullsrc=s=80x360, geq=lum=128:cr=128+tan(random(22893)*1.5)*5*sin(Y/10):cb=128[red_noise];
[0:v] geq=
lum=p(X+0.5*sin((Y+100*T)/5)\,Y)+(random(3)*10-5):
cb=p(X+2*sin((Y+T*20)/10)\,Y):
cr=p(X+2*sin((2+Y+T*20)/10)\,Y)
[distorted];
[blue_noise][red_noise] blend=all_mode=lighten [secam_noise];
[secam_noise] scale=w=6*iw:h=ih,setsar=1/1 [secam_noise_widened];
[distorted] geq=cr=
st(mod(X\,8)+1\, clip(lum(X/SW\,Y/SH)-cr(X\,Y)/5-cb(X\,Y)/3\, 0\, 255))\;
st(9\, cos(Y*3+5*T)*8)\;
cr(X\,Y)+clip(exp(
max( max( max(
ld(clip(1\, 1\, ld(9)))\,
ld(clip(2\, 1\, ld(9)))
)\, max(
ld(clip(3\, 1\, ld(9)))\,
ld(clip(4\, 1\, ld(9)))
))\, max( max(
ld(clip(5\, 1\, ld(9)))\,
ld(clip(6\, 1\, ld(9)))
)\, max(
ld(clip(7\, 1\, ld(9)))\,
ld(clip(8\, 1\, ld(9)))
)))
/51)*sin(cos(Y*3)+sin(T))*5-lum(X/SW\,Y/SH)/2\, 0\, 255-cr(X\,Y)):
cb=cb(X\,Y):lum=lum(X\,Y) [distorted_fired];
[distorted_fired][secam_noise_widened] blend=shortest=1:all_mode=grainmerge [out]' -map '[out]' \
-filter_threads 2 \
result.mp4
Результат: https://0x0.st/iBRI.mp4
##########
Версия Thetan для frei0r: https://github.com/xoffy/secamiz0r
Результат: https://0x0.st/iBRU.mp4
Представляю местной публике свой генератор факелов (цветовых помех) SECAM: https://github.com/xoffy/secamiz0r.
Факелы SECAM это такие красные и синие (редко зелёные и чёрные) горизонтальные полосы, характерные для системы цветного аналогового ТВ SECAM, от которых каждый из вас когда-то давно пытался избавиться. В отличие от бездуховных помех NTSC и PAL, наши родные советские помехи намного зрелищнее и красивее. Одним словом, aesthetic.
Если вы и ваша тульпа по каким-то причинам не понимаете, о чём идёт речь, то вот.
Проєкт реализован в виде плагина для frei0r — замшелого свободного API для видеоэффектов.
Сборка:
$ git clone https://github.com/xoffy/secamiz0r
$ cd secamiz0r
$ meson build
$ cd build
$ ninja
$ mkdir -p ~/.frei0r-1/lib
$ cp secamiz0r.so ~/.frei0r-1/lib/secamiz0r.so
meson
, инклуды frei0r
и библиотека gavl
.Проверка через ffmpeg:
$ ffplay -f lavfi -i testsrc=size=768x576 -vf 'frei0r=secamiz0r'
Фильтр имеет 4 параметра (вещественные числа от 0 до 1), которые в ffmpeg можно указать следующим образом:
-vf 'frei0r=secamiz0r:0.3|0.15|0.15|0.3'
- процент случайных факелов;
- процент факелов на перепадах яркости;
- процент факелов на перенасыщенных местах;
- цветовой шум.
Ещё важно учитывать, что для корректной работы плагинов frei0r в ffmpeg требуется, чтобы изображение было строго 4:3, иначе по какой-то причине всё съедет. Можно использовать либо 640x480, либо 768x576.
Кроме того, плагины frei0r можно применить в видеоредакторах Pitivi или Kdenlive.