Форум: ТЕХНИЧЕСКАЯ ЧАСТЬ
Тема: VapourSynth
автор: Artofeel

сообщение оставил Artofeel , 06 августа 2013, 16:08
Свершилось! Вот она, замена устаревшему AviSynth'у :3
< main >
< doom9 >
< ChangeLog >

В чем преимущества?
-полная мультипроцессорность
-новые цветовые пространства
-язык программирования Python (хотя сомнительно, если ты не проггер)
-практически полная поддержка плагинов Avisynth
-плюс еще что то там, до чего у меня еще руки не дошли проверить..

Специально для особо ленивых жоп, я собрал полный пак всего что нужно (и не очень нужно) для работы.
< http://pc.cd/aCbotalK >
В авхиве запакованно все то что папке рядом. Качайте что нужно.


Для работы необходим < Python >
поселению 3ю версию (32 и 64 бита)

Для автозагрузки плагинов, они должны быть помещены в следующие директории
для 32 битных:
VapourSynth\plugins32
для 64 битных:
VapourSynth\plugins64

для ручной загрузки плагинов, используется следующая строка:
Исходный код

core.std.LoadPlugin(path=r'F:\VapourSynth\filters\avisource.dll')



Для легкого создания скрипта, используйте прикрепленный к этому посту .bat файл
запустите его для инсталляции\удаления
если выбрать добавление в контекстное меню проводника, то создание скрипта осуществляется простой командой:
RMB -> VapourSynth
ну или просто drag-and-drop файлы на самом VapourSynth.bat

в батнике есть два дополнительных режима
debug и advanced
первый для отладки, второй для дополнительных опций
просто откройте .bat файл в блокноте и замените 0 на 1


Далее самое основное для написания скрипта:

Открытие avi файла без альфы
Исходный код

# первые две строчки обязательны
import vapoursynth as vs
core = vs.get_core()
# открытие видео файла; переменная v теперь видео объект
v = core.avisource.AVISource(path=r'c:\video\render.avi')
# добавление пустой альфы, нужно для совместимости
v = core.resize.Bicubic(v, format=vs.COMPATBGR32)
# установка на вывод видео
v.set_output()

"r" перед путем нужна для того чтобы использовать один \ без нее придется писать два: F:\\VapourSynth\\filters

Открытие avi файла с альфой
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.avisource.AVISource(path=r'c:\video\render.avi')
v = core.resize.Bicubic(v[0], format=vs.COMPATBGR32)
v.set_output()

avisource помещает два видео в массив, т.е. v[0] это RGB, а v[1] это Gray альфа
соответственно, простое обращение к "v" как к видео потоку, невозможно.
данная функция обращается к RGB и дорисовывает пустую альфу
resize.Bicubic не делает никакого ресайза, результат побитово совпадает с оригиналом.
а если не добавлять эту строчку и вывести RGB так: v[0].set_output()
получим:
Цитата
VFW module doesn't support RGB24 output                                            

*альфу подобным образом, вывести можно.

Если видео выводится верх тормашками, добавляем перед "v.set_output()", следующую строку
Исходный код

v = core.std.FlipVertical(v)


Открытие любых других форматов через < FFMS2 >:
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.ffms2.Source(source=r"C:\Video\source.mkv")
v.set_output()

Все предельно просто.

Если ffms2 фейлит, можно попробовать < LSMASHSource >:
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.lsmas.LibavSMASHSource(source=r"C:\Video\source.mkv")
v.set_output()

или
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.lsmas.LWLibavSource(source=r"C:\Video\source.mkv")
v.set_output()



Открытие сиквенса
плагин качать < здеcь >
Исходный код

import vapoursynth as vs
core = vs.get_core()
import os
ext = '.png'
dir = r'C:\Video\render/'
srcs = [dir + src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imwrif.Read(srcs)
v = core.std.AssumeFPS(clip=v, fpsnum=30, fpsden=1)
v.set_output()

ext — расширение файлов
dir — директория, обязательно должна оканчиваться на: / иначе файлы не откроются, также не забываем про волшебную "r"
для задания корректного фпс, юзаем AssumeFPS с fpsnum=30, fpsden=1 — где первое это numerator, а второе denominator соответственно.
Если сортировка работает некорректно, например если у вас начало сиквенса на 3х-значном числе (001) а конец на 4-5-значном (5621), то вам следует либо переименовать недостающие файлы, либо использовать следующую строчку для "srcs" переменной
Исходный код
srcs = sorted([dir + src for src in os.listdir(dir) if src.endswith(ext)], key = lambda x: int(x.split("_")[2].split(".")[0]))

где split("_") это символ разделителя между именем и цифрой
Спасибо aZZe :)


Импорт AviSynth скриптов:
плагин качать < здеcь >
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.avsr.Import('C:\Srcripts\MyScript.avs')
v.set_output()

или написание avs скрипта прямо в вайпе:
Исходный код

import vapoursynth as vs
core = vs.get_core()
avs = '''
DGSource("C:\Video\source.dgi")
ConvertToRGB32(matrix="rec709")
'''
v = core.avsr.Eval(lines=avs)
v.set_output()

.vpy скрипт также можно открыть ависинтом, обычным AviSource, при условии что на выходе поддерживаемое видео. Также можно открыть .avs скрипт в VapourSynth через core.avisource.AVISource

Конвертирование цветовых пространств / Глубины цвета / Ресайз
плагин качать < здеcь >
из YUV в RGB
Исходный код

v = core.fmtc.resample(v, css="444", kernel="spline64")
v = core.fmtc.resample(v, w=1280, h=720, kernel="spline64")
v = core.fmtc.matrix(v, mat="709", col_fam=vs.RGB, fulls=1, fulld=1)
v = core.fmtc.bitdepth(v, bits=8, dmode=3)

из RGB в YUV
Исходный код

v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, bits=16, fulls=1, fulld=1)
v = core.fmtc.resample(v, css="420", kernel="point")
v = core.fmtc.bitdepth(v, bits=8, dmode=3)

плагин работает в максимально-качественнном режиме, т.е. только в 4:4:4 и конвертирует 8 бит в float (32 бита) или работает в 16 битах если они были изначально.
Все это направлено на получение более лучшего результата (на мой взгляд спорно) ценой потери скорости вычисления...

dmode=3 — это дихтеринг
дихтеринг срабатывает при следующих условиях:
- при уменьшении глубины цвета с 16\32 до 8, или 32 до 16
- при конвертировании PC Range <-> TV Range у 8\16 битных форматов
собсно может быть:
0 Ordered dithering (Bayer matrix).
1 No dither, round to the closest value.
2 Round, may be a bit faster but possibly less accurate.
3 Sierra-2-4A error diffusion, aka “Filter Lite”. Quick and excellent quality.
4 Stucki error diffusion. Preserves delicate edges better but distorts gradients.
5 Atkinson error diffusion. Generates distinct patterns but keeps clean the flat areas.
6 Floyd-Steinberg error diffusion. Classic.
7 Ostromoukhov error diffusion. Slow, available only for integer input at the moment.

mat="709" — матрица, могёт:
"601" ITU-R BT.601 / ITU-R BT.470-2 / SMPTE 170M. For Standard Definition content.
"709" ITU-R BT.709. For High Definition content.
"240" SMPTE 240M
"FCC" FCC
"YCgCo" YCgCo
"RGB" RGB. Identity, no cross-plane calculations.

fulls=1 — PC Range на входе (если не указывать, то ставится на 1 если RGB на входе)
fulld=1 — PC Range на выходе (если не указывать, то ставится на 0 если YUV на выходе)

css="###" — цветовая субдискретизация:
"444" or "4:4:4" 4:4:4, no chroma subsampling.
"422" or "4:2:2" 4:2:2, horizontal 2x chroma subsampling.
"420" or "4:2:0" 4:2:0, horizontal and vertical 2x chroma subsampling.
"411" or "4:1:1" 4:1:1, horizontal 4x chroma subsampling.
т.к. плагин работает только c 4:4:4, перед операциями нужно конвертить именно в нее, если сорс не в ней.
уменьшение следует добавлять перед строчкой с уменьшением битности.

w=1280, h=720 — ресайз, kernel отвечает за способ, может быть:
"point" Nearest neighbour interpolation. Same as Avisynth’s PointResize.
"rect" or "box" Box filter.
"linear" or "bilinear" Bilinear interpolation. Same as Avisynth’s BilinearResize.
"cubic" or "bicubic" Bicubic interpolation. Same as BicubicResize. The b and c variables are mapped on a1 and a2 and are both set to 1/3 by default.
"lanczos" Sinc function windowed by the central lobe of a sinc. Use taps to specify its impulse length. Same as LanczosResize.
"blackman" Blackman-Harris windowed sinc. Use taps to control its length. Same as BlackmanResize.
"blackmanminlobe" Another kind of Blackman windowed sinc, with a bit less ringing. Use taps for you know what.
"spline16" Cubic spline based kernel, 4 sample points. Same as Spline16Resize.
"spline36" Spline, 6 sample points. Same as Spline36Resize.
"spline64" Spline, 8 sample points. Same as Spline64Resize.
"spline" Generic splines, number of sample points is twice the taps parameter, so you can use taps = 6 to get a Spline144Resize equivalent.
"gauss" or "gaussian" Gaussian kernel. The p parameter is mapped on a1 and controls the curve width. The higher p, the sharper. It is set to 30 by default. This resizer is the same as GaussResize, but taps offers a control on the filter impulse length. For low p values (soft and blurry), it’s better to increase the number of taps to avoid truncating the gaussian curve too early and creating artifacts.
"sinc" Truncated sinc function. Use taps to control its length. Same as SincResize.




Итак, закономерный вопрос: для чего все это нафик нужно?
Ну например:

1. Открыть 10бит рип, правильно.
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.ffms2.Source(source='C:\Video\Steins;Gate\[Yousei-raws] Steins;Gate 01 [BDrip 1920x1080 x264 FLAC].mkv')
v = core.resize.Bicubic(v, format=vs.YUV422P10)
enable_v210=True
v.set_output()

В итоге получаем v210 поток, который корректно открывается в последних експерементальных VDub билдах
т.к. лосслесс компресора для данного видео пока нету, при нарезке нужно выставить режим Direct-Stream-Copy
Полученное таким образом видео, отлично принимается AE
и не смущайтесь строчки
Исходный код
core.resize.Bicubic(v, format=vs.YUV422P10)

она не конвертирует YUV420P8 в YUV422P10, нет
она конвертирует YUV420P10 в YUV422P10, ибо это стандарт v210 видео, т.е. эта строчка не нужна, если видео изначально в 4:2:2


2. Закодить труЪ 10бит
Именно, правельные 10бит десятибитным енкодером, а не 8бит десятибитным енкодером.
Для этого нужно, вывести 16 бит на канал, единственный способ, это Image Sequence, в png (tif на данный момент не поддерживается плагином)

Как вывести 48 битный png, я думаю знают все, но вкраце опишу для AE:
в Output модуле задаем "PNG Sequence", в Depth выставляем "Trillions of Colors"
в настройках рендера, там где "Color Depth" ставим "16 bits per channel"
в итоге получится RGB48 (16+16+16)
Учтите, что АЕ по умолчанию задает трехзначное число, т.е. начало с 000, т.к кол-во кадров может быть болеее 1000 или 10000, нужно выставить 5-6 значный шаблон [#####]

далее делам скрипт, типа этого:
Исходный код

import vapoursynth as vs
core = vs.get_core()
import os
ext = '.png'
dir = 'С:\Video\render/'
srcs = [dir + src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imwri.Read(srcs)
v = core.std.AssumeFPS(clip=v, fpsnum=30, fpsden=1)
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, bits=16, fulls=1, fulld=1)
v = core.fmtc.resample(v, css="422")
v = core.fmtc.bitdepth(v, bits=10, dmode=3)
v = core.resize.Bicubic(v, format=vs.YUV422P10)
enable_v210=True
v.set_output()

и далее запускаем енкод таким образом
Исходный код

F:\VapourSynth\core\vspipe.exe "C:\Scripts\myVapourScript.vpy" - --y4m | x264 - --demuxer y4m --input-range pc --input-depth 10 --output-csp i422 -o out.264

в итоге получаем труъ 10бит которые мало кто увидит, т.к мониторы у большинства 8битные, хе-хе



Ну и на последок, немного "виртуальной магии"
VapourSynth поддерживает Pismo File Mount
Что это такое?
Это что типа локальной виртуальной среды
т.е. можно взять и превратить написанный скрипт в папку в которой будет лежать выходящее видео в Uncompressed формате, размером в десятки-сотни гигабайт, а то и в терабайт, но физически его не существует на самом деле, зато программы (в не зависимости какой битности, хоть 32, хоть 64) будут думать что работают именно с Uncompressed видео :3
Иными словами, это лучще чем avi-пустышки, хотя бы потому что позволяют редактировать скрипт "на лету", да и стабильнее.
Что для этого нужно?
Нужно установить < Pismo File Mount Audit Package > (pfmap-###-win.exe)
Если вы установили вайпосинт до установки pismo, то нужно либо установить вайпосинт заного (там будет галочка для включения), либо открыть коммандную строку и написать следующее:
Исходный код
pfm register "F:\VapourSynth\core64\vsfs.dll"

А далее все просто, нажимает ПКМ на скрипте, и щелкаем "Quick Mount"
Для размонтировки, щелкаем на папке "Unmount"

В новых версия более нет интеграции с системой, есть avfs.exe в корневой дирректории вайпосинта (core32\core64)
Чтобы монтировать скрипт, нужно перетащить его на avfs.exe
А можно сделать ярлык в SendTo (USERPROFILE%\SendTo) для avfs.exe и монтировать скриты через "Отправить"
К слову, вы также можете монтировать avs скрипты.



сообщение оставил Fynjy , 06 августа 2013, 19:51
полезненько, норм написал.

Цитата (Artofeel @ 06 августа 2013, 17:08)
Для работы необходим Python

python х86 ток.


Добавлено (через 2 мин. и 21 сек.):

в смысле без х64.
сообщение оставил Artofeel , 06 августа 2013, 22:31
Цитата (Fynjy @ 06 августа 2013, 22:51)
python х86 ток.
а да
а я думал про что я забыл :)
возможно в следующей версии уже будет 64, т.к. автор обещал именно 64битную поддержку

алсо, поэкспериментировал с плагином ресайза, оказывается можно < уменьшить хрому с минимальными потерями >, даже лучше чем старый ависинт 2.5.8
всего одна полоска между цветами! при том что кое где ее вообще нету!
так что все это дело очень рекомендуется, как и при кодинге, как и при нарезке.
также добавил описания ресайза, там же.

сообщение оставил Artofeel , 14 января 2014, 10:47
в новых версиях добавлена автозагрузка плагинов, поправил инструкцию соответственно
асло, 64 бита :3

сообщение оставил Sef , 01 февраля 2014, 08:34
Привет Всем! Добавтьте в пояснение про avs скрипты еще по одной ("). avs = """   """. Я пол дня парился, пока разобрался  :smile:
сообщение оставил Artofeel , 01 февраля 2014, 12:17
Цитата (Sef @ 01 февраля 2014, 10:34)
Добавтьте в пояснение про avs скрипты еще по одной ("). avs = """   """.
там нет никаких: "
там нужно использовать: '

сообщение оставил Sef , 01 февраля 2014, 15:49
Пардон, мелкий шрифт-не разглядел!  :smile:  А про (") вычитал на doom9, в ветке автора плагина..


сообщение оставил Artofeel , 23 февраля 2014, 11:22
Как истинный BATman написалл батник для two-click создания .vpy скриптов (см. первый пост)
поместите его в корневую директорию VapourSynth'a
создайте ярлык (не копию) в папке:
%APPDATA%\Microsoft\Windows\SendTo
далее:
RMB -> SendTo -> VapourSynth
ну или просто drag-and-drop файлы на самом VapourSynth.bat

в батнике есть два дополнительных режима
debug и advanced
первый для отладки, второй для дополнительных опций
просто откройте .bat файл в блокноте и замените 0 на 1

сообщение оставил Artofeel , 26 февраля 2014, 14:03
изменения в батнике:
— открытие vpy скриптов теперь выводит информацию, плюс есть возможность вывести RAW видео
— добавил что то типа Install модуля, батник копируется на нужное место и предлагается добавиться в контекстное меню проводника (метод с ярлыком в SendTo более не актуален). Также есть Uninstall модуль, они запускаются по двойному клику на батнике (т.е. без входного файла)
— плюс мелкие фиксы, там и там

сообщение оставил Artofeel , 23 марта 2014, 13:10
исправил ошибку при использовании контекстного меню
раньше если путь к файлу содержал пробелы, то ничего не работало
чтобы исправить уже установленную версию, ее нужно удалить
запустить батник > деинсталлировать > установить заново

сообщение оставил Artofeel , 05 апреля 2014, 11:03
изменения в батнике:
— исправил ошибку, теперь имя\путь к файлу, могут содержать ! (восклицательный знак)

сообщение оставил alexxdls , 01 августа 2014, 15:56
Исходный код
d:\TRAILERS\DCP\MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV>"
c:\Program Files (x86)\VapourSynth\core32\vspipe.exe" "myVapourScript.vpy" - -y4
m   | x264 - --demuxer y4m --input-depth 10 --output-csp i444 -o out.264
NULL name pointer passed to createFilter()
Чем может быть вызвана ошибка? Всё сделал по инструкции.
Исходный код
import vapoursynth as vs
core = vs.get_core()
import os
ext = '.png'
dir = r'd:\TRAILERS\DCP\MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV\PNG/'
srcs = [dir + src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imgr.Read(srcs,24,1)
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, bits=16, fulls=1, fulld=1)
v = core.fmtc.bitdepth(v, bits=10, dmode=1)
v.set_output()

сообщение оставил Artofeel , 01 августа 2014, 22:46
а сам скрипт нормально открывается? (тем же VirtualDub'ом)
можно еще попробовать вывести RAW, и его уже кодить
Исходный код
vspipe.exe "myVapourScript.vpy" "путь\имя_файла" -y4m -progress

сообщение оставил alexxdls , 01 августа 2014, 22:52
Я заменил плагин чтения картинок на пофиксенный (по совету с doom9), но теперь другая трабла
Исходный код
d:\TRAILERS\DCP\MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV>"
c:\Program Files (x86)\VapourSynth\core32\vspipe.exe" myVapourScript.vpy - -y4m
 | x264 - --demuxer y4m --input-depth 10 --output-csp i444 -o out.264
Script evaluation failed:
Python exception: matrix: only constant pixel formats are supported.
Traceback (most recent call last):
 File "vapoursynth.pyx", line 1148, in vapoursynth.vpy_evaluateScript (src\cyth
on\vapoursynth.c:18441)
 File "myVapourScript.vpy", line 8, in <module>
   v = core.fmtc.matrix(v, mat="709", bits=16, fulls=1, fulld=1)
 File "vapoursynth.pyx", line 1071, in vapoursynth.Function. (src\cytho
n\vapoursynth.c:17443)
vapoursynth.Error: matrix: only constant pixel formats are supported.
Даб ту же ошибку кажет.
Сиквенс из таких картинок < http://i66.fastpic.ru/big/2014/0801/d3/_9ada951654a9e224662df391d0eee6d3.png?noht=1 >



сообщение оставил Artofeel , 02 августа 2014, 10:53
странно
можно попробовать без fmtc, так
Исходный код
import vapoursynth as vs
core = vs.get_core()
import os
ext = '.png'
dir = r'd:\TRAILERS\DCP\MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV\PNG/'
srcs = [dir + src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imgr.Read(srcs,24,1)
v.set_output()


и если открывает, то
Исходный код
import vapoursynth as vs
core = vs.get_core()
import os
ext = '.png'
dir = r'd:\TRAILERS\DCP\MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV\PNG/'
srcs = [dir + src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imgr.Read(srcs,24,1)
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, css="422", bits=16, fulls=1, fulld=1)
v = core.fmtc.bitdepth(v, bits=10, dmode=1)
enable_v210=True
v.set_output()

сообщение оставил alexxdls , 02 августа 2014, 16:56
Исходный код
---------------------------
VirtualDub Error
---------------------------
Avisynth open failure:
Cannot open clips with varying dimensions or format in vfw
---------------------------
ОК  
---------------------------
и
Исходный код
Failed to evaluate the script:
Python exception: matrix: Function does not take argument(s) named css
Traceback (most recent call last):
 File "vapoursynth.pyx", line 1148, in vapoursynth.vpy_evaluateScript (src\cython\vapoursynth.c:18441)
 File "D:/TRAILERS/DCP/MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV/myVapourScript.vpy", line 8, in <module>
   v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, css="422", bits=16, fulls=1, fulld=1)
 File "vapoursynth.pyx", line 1044, in vapoursynth.Function. (src\cython\vapoursynth.c:17125)
vapoursynth.Error: matrix: Function does not take argument(s) named css



сообщение оставил Artofeel , 02 августа 2014, 17:50
Цитата
Cannot open clips with varying dimensions or format
это без fmtc, да?
похоже что сиквенс состоит из неодинаковых картинок (разного разрешения)
или же там RGB48\RGB64
тогда еще попробуй такую команду
Исходный код
vspipe.exe myVapourScript.vpy - -info
и запость то что он там выдаст

Цитата
vapoursynth.Error: matrix: Function does not take argument(s) named css
ах, да
так надо
Исходный код
import vapoursynth as vs
core = vs.get_core()
import os
ext = '.png'
dir = r'd:\TRAILERS\DCP\MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV\PNG/'
srcs = [dir + src for src in os.listdir(dir) if src.endswith(ext)]
v = core.imgr.Read(srcs,24,1)
v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, bits=16, fulls=1, fulld=1)
v = core.fmtc.resample(v, css="422")
v = core.fmtc.bitdepth(v, bits=10, dmode=1)
enable_v210=True
v.set_output()

и если открывается такое, то х264 нужно указать вместо --output-csp i444
Исходный код
--output-csp i422 --input-range pc

сообщение оставил alexxdls , 03 августа 2014, 11:22
Там PNG48 16 бит на канал
Исходный код
SET VIDEOSOURCEFILE=mockingjay_tlr3_ru_239_01.mxf
SET XYZDIR=J2C\
SET RGBDIR=PNG\

asdcp -x %XYZDIR% "%VIDEOSOURCEFILE%"

FOR /F %%i IN ('dir /B "%DECODEDIR%*.j2c"') DO (
convert "%XYZDIR%%%i" -alpha Off -gamma 0.3846153 -recolor "3.2404542 -1.5371385 -0.4985314 -0.9692660 1.8760108 0.0415560 0.0556434 -0.2040259 1.0572252" -gamma 2.2 -depth 16  "%RGBDIR%%%~ni.png"
DEL "%XYZDIR%%%i"
)
Использую 64-битный IM c HDRI
Все картинки одинаковые (по стуи не могут быть разными? т.к. это DCP)
Исходный код
Я через VapourSynthEditor проверяю скрипты. Последний вариант всё равно выдаёт[code]Failed to evaluate the script:
Python exception: matrix: only constant pixel formats are supported.
Traceback (most recent call last):
 File "vapoursynth.pyx", line 1148, in vapoursynth.vpy_evaluateScript (src\cython\vapoursynth.c:18441)
 File "D:/TRAILERS/DCP/MOCKINGJAY-PT1_TLR-1_S_RU-XX_RU_51_2K_LION_20140729_DLA_IOP_OV/myVapourScript.vpy", line 8, in <module>
   v = core.fmtc.matrix(v, mat="709", col_fam=vs.YUV, bits=16, fulls=1, fulld=1)
 File "vapoursynth.pyx", line 1071, in vapoursynth.Function. (src\cython\vapoursynth.c:17443)
vapoursynth.Error: matrix: only constant pixel formats are supported.
:sad:

сообщение оставил Artofeel , 03 августа 2014, 12:26
ну matrix у fmtc ругается на входящий формат, нужно его выяснить, такой командой (соответственно без fmtc кода)
Исходный код
vspipe.exe myVapourScript.vpy - -info

алсо, попробуй открыть только первую картинку так
Исходный код
v = core.imgr.Read("путь к файлу")




Добавлено (через 24 мин. и 52 сек.):

Цитата (alexxdls @ 03 августа 2014, 14:22)
Использую 64-битный IM
ImageMagick же?
там встроенный механизм уменьшения количества цветов (без потерьный)
т.е. скорее всего у тебя в сиквенсе есть как 48бит так и 24бита, а то и 8 бит

сообщение оставил Artofeel , 05 августа 2014, 14:23
подправил немного батник
— у сиквенса улучшена обработка hi-depth
— альфа у RGB теперь должна корректно обрабатываться (т.е. пропускаться)

сообщение оставил alexxdls , 05 августа 2014, 14:55
Цитата
ImageMagick же?
там встроенный механизм уменьшения количества цветов (без потерьный)
т.е. скорее всего у тебя в сиквенсе есть как 48бит так и 24бита, а то и 8 бит
Точно, на чёрных кадрах 1 бит.
Цитата
подправил немного батник
В 1 посте?

сообщение оставил Artofeel , 05 августа 2014, 16:47
Цитата (alexxdls @ 05 августа 2014, 17:55)
В 1 посте?
ага

сообщение оставил alexxdls , 07 августа 2014, 07:48
http://forum.doom9.org/showthread.php?p=1689202#post1689202
сообщение оставил Artofeel , 07 августа 2014, 12:50
ннда..паламали
год назад, все работало

сообщение оставил alexxdls , 07 августа 2014, 12:52
Работает с VS r19, но это не вариант - использовать старую ревизию, некоторых функций нужных нет.
сообщение оставил alexxdls , 08 августа 2014, 16:20
Решил использовать 19-ю версию, т.к. получилось добавлять бордюры незелёного цвета.
Осталось только загадкой, как определить размеры видео? Нашёл getFrameHeight и getFrameWidth.  Через что их вызывать? Или можно другим способом? Цель - автоматическое определение высоты при ширине 1920 для функции ресайза.

сообщение оставил Artofeel , 08 августа 2014, 16:59
Цитата (alexxdls @ 08 августа 2014, 19:20)
Осталось только загадкой, как определить размеры видео?
так?
Исходный код
i = core.text.ClipInfo(v)
print(i)

print(i) только в shell'е питона будет виден
по сути надо написать код который будет искать значение Width

сообщение оставил alexxdls , 08 августа 2014, 17:27
А в VS разве никак не определить?
сообщение оставил Artofeel , 08 августа 2014, 18:49
а, i.width это и будет ширина
все что там есть
Исходный код
format
fps_den
fps_num
height
num_frames
width

юзай help(i.format) чтоб узнать что есть там

сообщение оставил Artofeel , 05 сентября 2014, 15:11
пификсил батник
— восстановлена работоспособность на версии r24

ридер сиквенса остался старый (не рабочий), позже перепишу под новый

сообщение оставил Artofeel , 13 сентября 2014, 15:57
добавил в батник новый плагин для открытия сиквенса
он для тест версии #2 < dropbox > | < mediafire >

сообщение оставил VitalyF , 14 сентября 2014, 17:09
Подскажите, что с Vapoursynth r24, vspipe не работает? Вот такая диагностика >>

Цитата
D:\_x264>vspipe "test5.vpy" - -y4m | x264 - --demuxer y4m --input-depth 10 --output-csp i422 -o out.264
Unknown argument: -y4m
x264 [error]: could not open input file `-'


И такое сообщение на всех скриптах, что вы выше публиковали, хотя на Vapoursynth r23 они работали.
И чем тогда можно заменить эту строку

Цитата
vspipe "test5.vpy" - -y4m | x264 - --demuxer y4m --input-depth 10 --output-csp i422 -o out.264

как с помощью батника это можно заменить?

PS
для Windows x64



сообщение оставил Artofeel , 14 сентября 2014, 22:25
Цитата (VitalyF @ 14 сентября 2014, 20:09)
Подскажите, что с Vapoursynth r24, vspipe не работает?
а, точно
батник поправил, гайд забыл...
там немного поменялись опции
вместо -y4m теперь --y4m или просто -y

сообщение оставил Artofeel , 01 октября 2014, 16:44
Изменения в батнике
- добавил возможность сохранения PC диапазона при RGB->YUV конверсии
- теперь скрипт можно откодировать в AVC (x264) или HEVC (x265), для этого необходимо указать в батнике полный путь к энкодерам и далее просто натравить его на .vpy скрипт.


Добавлено (через 22 час. 37 мин. и 14 сек.):

- поправил RGB кодирование у x264
сообщение оставил VitalyF , 18 декабря 2014, 11:19
Подскажите, пожалуйста, как убрать интерлейс??
... и почему-то при кодировании HDTV.ts удваивается
fps с 25-ти до 50-ти

Исходный код
import vapoursynth as vs
core = vs.get_core()
v = core.ffms2.Source(source=r"video.ts")
v = core.fmtc.resample(v, w=1280, h=720, kernel="spline64")
v.set_output()


Исходный код
vspipe "test5.vpy" - --y4m | x264 - --demuxer y4m --qp 0 --crf 23 -o video.mkv



сообщение оставил Artofeel , 18 декабря 2014, 17:52
Цитата (VitalyF @ 18 декабря 2014, 13:19)
Подскажите, пожалуйста, как убрать интерлейс??
nnedi3 ?
< https://github.com/dubhater/vapoursynth-nnedi3 >
не могу потестить, нету интерлейсного сорса :(
Цитата (VitalyF @ 18 декабря 2014, 13:19)
и почему-то при кодировании HDTV.ts удваивается
ну так интерлейс же
25 кадров чётных + 25 кадров не чётных
или что то пытается его задавить и выдает в итоге удвоенный фпс
толком с интерлейсом не работал...

сообщение оставил VitalyF , 18 декабря 2014, 20:01
Спасибо большое!! nnedi3  я нашёл,
но не знаю как прикрутить его... (((
вот небольшой пример - 48 мб
< http://multi-up.com/1021252 >
Как бы вы составили скрипт для него?

сообщение оставил Artofeel , 19 декабря 2014, 14:56
из документации ffms2
Цитата
Interlaced H.264 is decoded in an odd way; each field gets its own full-height frame and the fieldrate is reported as the framerate, and furthermore one of the fields (odd or even) may "jump around". To get the correct behavior, you can try setting fpsnum and fpsden so that the framerate is halved (may or may not work). This issue is caused by libavcodec.

т.е. нужно указывать фпс (fpsnum= , fpsden= )
такое работает
Исходный код
import vapoursynth as vs
core = vs.get_core()
v = core.ffms2.Source(source=r"lw04sample.ts", fpsnum=25, fpsden=1)
v = core.nnedi3.nnedi3(v, field=0)
v.set_output()



сообщение оставил VitalyF , 19 декабря 2014, 21:43
Спасибо огромное за скрипт!!!
Сегодня весь день голову ломал, вот что получилось в итоге
Цитата
import vapoursynth as vs
core = vs.get_core()
v = core.ffms2.Source(source=r"sample.ts", fpsnum=25, fpsden=1)
v = core.fmtc.resample(v, w=1280, h=720, kernel="spline64")
v = core.nnedi3.nnedi3(v, opt=2, field=0, fapprox= 4)
v.set_output()    


< video.mkv >
Обратите внимание на последних кадрах, где аплодируют, заметно ускоренное воспроизведение
хотя Frame rate : 25.000 fps
Похоже что тест я неудачно выбрал...
Ещё раз спасибо!!!

PS

Отдал resize и fps на x264
получилось побыстрее и качественнее
Цитата
import vapoursynth as vs
core = vs.get_core()
v = core.ffms2.Source(source=r"sample.ts")
v = core.nnedi3.nnedi3(v, opt=2, field=0)
v.set_output()  

Цитата
vspipe "test10.vpy" - --y4m | x264 - --demuxer y4m --qp 0 --crf 23 --vf resize:1280,720,1:1 --ssim --fps 25000/1000 -o video.mkv  

< video.mkv >



сообщение оставил Artofeel , 20 декабря 2014, 20:21
Цитата (VitalyF @ 19 декабря 2014, 23:43)
Отдал resize и fps на x264
получилось побыстрее и качественнее
фпс _НЕОБХОДИМО_ указывать в ffms2, иначе деинтерлейс скорее всего буит кривой
ресайз конечно побыстрее в x264, но не как не качественнее, так как fmtc работает в 16 битах

сообщение оставил Artofeel , 07 апреля 2016, 18:38
Изменения в батнике
- фикс мелких багов
- добавлен пресет для x264 — "Proxy" (~1GB на ~25 минут), видео которое можно смело закидывать в редактор, оно довольно шустро декодируется и при этом будет Frame-accurate. Главное не забудьте при финальном рендере подменить сорс на оригинальный, качественный.
- возможность кодировать видео "пакетно" (т.е. все .vpy файлы в директории) !!возможны баги!!




Добавлено (через 21 час. 3 мин. и 56 сек.):

upd:
- фикс бага со скобками в имени файла.
- фикс бага кодирования прокси (файл не муксился в .mp4 контейнер)

сообщение оставил Artofeel , 16 июня 2016, 17:32
Изменения в батнике
- добавил опцию для создания AVI-пустышек, работает через старый-добрый ависинт... соответственно нужен он и ffdshow, соответственной разрядности. В батнике нужно прописать путь к makeAVIS.exe
- опция на монтирование через pismo (VSFS) + создание символической ссылки на .avi файл, рядом со скриптом или где хотите. (*символические ссылки работают только в NTFS файловых системах)

сообщение оставил Artofeel , 18 июня 2016, 17:25
- makeAVIS.exe теперь ищется автоматически, если ffdshow установлен с плагином для ависинта, то все должно найтись.
- исправлен баг при создании AVI-пустышек с сообщением о том что сорс более 8 бит (хотя на деле RGB32)

сообщение оставил Artofeel , 12 августа 2016, 16:52
Изменения в батнике
- исправлено несколько критичных ошибок
- добавлены опции на кол-во кэширования кадров и путь к сохранению индексов ffms (по умолчанию %TEMP%)

сообщение оставил Artofeel , 14 августа 2016, 12:57
+ небольшое критическое исправление в fmtc.resample
сообщение оставил Artofeel , 26 августа 2016, 15:21
Изменения в батнике
- еще одно исправление в fmtc =_=''
- немного изменил x265 пресет



сообщение оставил mad_max , 02 марта 2017, 06:47
Здравствуйте уважаемые форумчане.
Прошу вашей помощи, научите работать с VapourSynth.
Есть файл с такими данными:
Format : Matroska
Format version : Version 2
File size : 1.64 GiB
Duration : 23mn 42s
Overall bit rate mode : Variable
Overall bit rate : 9 888 Kbps
Format : Matroska
Format version : Version 2
File size : 1.64 GiB
Duration : 23mn 42s
Overall bit rate mode : Variable
Overall bit rate : 9 888 Kbps
Нужно надергать из файла небольшие кусочки видео продолжительностью 10 секунд с промежутком между ними 50 секунд (ну или все тоже самое, но только не в секундах, а фреймах).  А потом объединить их в один файл, что бы пройтись по нему 1-ым проходом для анализа перед кодированием в h265.
Сначала я попробовал это сделать с помощью ffmpeg под Ubuntu-ой. Набросал небольшой скрипт. С помощью
ffmpeg -i "$input_file" -ss 00:0:00 -t 00:00:20 -vcodec copy -acodec copy "$out_file"
вырезаю кусочки, а потом объединяю их в фай.
ffmpeg -f concat -safe 0 -i $out_file_list -vcodec copy -acodec copy $file
Но итоговый файл получается битый. Видимо таким способом нарушается его структура.
Почитал в интернетах и понял, что файл нужно прогнать через  VapourSynth. Но вот не могу понять как с ним правильно работать.
Установил под win 2012 следующее:
python-3.5.3-amd64
VapourSynth-R35
VapourSynthEditor-r15-64bit (портабл версия, другой на сайте нет)
vlc-2.2.4-win32
XviD4PSP 7
StaxRip-x64-1.4.0.0-stable (портабл версия)
Не совсем понимаю логику дальнейших манипуляций. Может есть гайд на русском или что-то еще, объясняющее как правильно работать?
Заранее благодарен за любую помощь!

сообщение оставил Artofeel , 02 марта 2017, 10:32
mad_max, а в < VirtualDub > слабо нарезать?
ну если хочется по хардкору, то можно и вайпе через < Trim >
Исходный код
v = core.std.Trim(v, first=100, last=50)

начало на 100 кадре, конец на 50 (т.е. +50 кадров начиная со 100, а не 50 с оригинального 0)
полный код наверно так будет выглядеть
Исходный код
v1 = core.std.Trim(v, first=100, last=50)
v2 = core.std.Trim(v, first=200, last=30)
v3 = core.std.Trim(v, first=400, last=80)
v4 = core.std.Trim(v, first=600, last=150)
v = v1+v2+v3+v4


Добавлено (через 10 мин. и 18 сек.):

Цитата (mad_max @ 02 марта 2017, 09:47)
ffmpeg -i "$input_file" -ss 00:0:00 -t 00:00:20 -vcodec copy -acodec copy "$out_file"

-vcodec copy
это кстати копирование сжатия, т.е. итоговый файл не будет битый только если это какой то старый DivX и ему подобные (и то не факт) или MPEG1\2
H264\H265 можно порезать, но только от начала, т.е. первого I-кадра, то бишь 0
воспроизведение разреза со второго и последующих, неизбежно приведут к артефактам при декоде, вроде это как то связано с реф-фреймами

сообщение оставил mad_max , 02 марта 2017, 11:48
Цитата
mad_max, а в VirtualDub слабо нарезать?

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

Спасибо за подсказку по поводу Trim.

Меня больше интересует, что мне потом делать с файлом *.vpy?
Таким вот образом передавать кодировщику?
vspipe --y4m script.vpy - | ffmpeg -i pipe: encoded.mkv

сообщение оставил Artofeel , 02 марта 2017, 16:54
Цитата (mad_max @ 02 марта 2017, 14:48)
Таким вот образом передавать кодировщику?
левая половина правильно
правая не знаю, не пользуюсь ffmpeg
ачо x265 напрямую нельзя?

сообщение оставил mad_max , 03 марта 2017, 06:21
Цитата
ачо x265 напрямую нельзя?

Наверно можно. Просто для меня вся это тема в новье, потому и обратился за помощью.

сообщение оставил Artofeel , 05 марта 2017, 14:28
Изменения в батнике
- исправил монтирование AVI, так как в новых версия более нет dll'ки, теперь вместо нее avfs.exe который в < разы быстрее >

добавил к первому посту < LSMASHSource >:
Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.lsmas.LibavSMASHSource(source=r"C:\Video\source.mkv")
v.set_output()

Исходный код

import vapoursynth as vs
core = vs.get_core()
v = core.lsmas.LWLibavSource(source=r"C:\Video\source.mkv")
v.set_output()

также сделал пак всего что нужно для работы
< http://pc.cd/aCbotalK >

Powered by Ikonboard 3.1.2a
Ikonboard © 2001 Jarvis Entertainment Group, Inc.