1 (edited by Igni Serpens 23-10-2016 11:32:21)

Topic: Генерация Vapoursynth-скриптов для Linux

Пользуюсь SVP4 под Ubuntu. Есть ли у него возможность генерации скрипта для offline-преобразования файлов как в Windows? Хочу создавать файлы с максимальным качеством для последующего просмотра уже без нагрузки на видеоадаптер и процессор. Или, может быть, где-то есть готовые скрипты?

Сделал свою настройку интерполяции, заглянул в последние использованные скрипты, скопировал оттуда скрипт. Но он не работает.

# This script was generated by SVP 4 Manager.
# Check https://www.svp-team.com for more details.

import vapoursynth as vs
core = vs.get_core(threads=7)

core.std.LoadPlugin("/home/igni/bin/SVP4/plugins/libsvpflow1_vs64.so")
core.std.LoadPlugin("/home/igni/bin/SVP4/plugins/libsvpflow2_vs64.so")

clip = video_in
clip = clip.resize.Bicubic(format=vs.YUV420P8)

crop_string  = ""
resize_string = ""
super_params     = "{scale:{up:0},gpu:1,rc:true}"
analyse_params   = "{main:{search:{coarse:{distance:-8},type:2}},refine:[{thsad:250}]}"
smoothfps_params = "{gpuid:11,rate:{num:5,den:2},algo:13,mask:{area:1000},scene:{blend:true}}"

demo_mode   = 0
stereo_type = 0

########## BEGIN OF base.py ##########
# This file is a part of SmoothVideo Project (SVP) ver.4
# This is NOT the full Vapoursynth script, all used variables are defined via
# JScript code that generates the full script text.

def interpolate(clip):
    input = clip
    if crop_string!='':
        input = eval(crop_string)
    if resize_string!='':
        input = eval(resize_string)

    super   = core.svp1.Super(input,super_params)
    vectors = core.svp1.Analyse(super["clip"],super["data"],input,analyse_params)
    smooth  = core.svp2.SmoothFps(input,super["clip"],super["data"],vectors["clip"],vectors["data"],smoothfps_params,src=clip,fps=container_fps)
    smooth  = core.std.AssumeFPS(smooth,fpsnum=smooth.fps_num,fpsden=smooth.fps_den)

    if demo_mode==1:
        return demo(input,smooth)
    else:
        return smooth

if stereo_type == 1:
    lf = interpolate(core.std.CropRel(clip,0,(int)(clip.width/2),0,0))
    rf = interpolate(core.std.CropRel(clip,(int)(clip.width/2),0,0,0))
    smooth = core.std.StackHorizontal([lf, rf])
elif stereo_type == 2:
    lf = interpolate(core.std.CropRel(clip,0,0,0,(int)(clip.height/2)))
    rf = interpolate(core.std.CropRel(clip,0,0,(int)(clip.height/2),0))
    smooth = core.std.StackVertical([lf, rf])
else:
    smooth =  interpolate(clip)
########### END OF base.py ###########


smooth.set_output()

Пробовал запустить его через vspipe:

vspipe --y4m ~/bin/vapour/fullqua.py - | ffmpeg -i pipe: encoded.mkv

Но получил ошибку, что переменная clip не определена:

Script evaluation failed:
Python exception: name 'video_in' is not defined
Traceback (most recent call last):
  File "src/cython/vapoursynth.pyx", line 1491, in vapoursynth.vpy_evaluateScript (src/cython/vapoursynth.c:26972)
  File "/home/igni/bin/vapour/fullqua.py", line 10, in <module>
    clip = video_in
NameError: name 'video_in' is not defined

Вбил имя файла вручную (clip = "/tmp/video.mp4"), после чего вышла другая ошибка:

Script evaluation failed:
Python exception: 'str' object has no attribute 'resize'
Traceback (most recent call last):
  File "src/cython/vapoursynth.pyx", line 1491, in vapoursynth.vpy_evaluateScript (src/cython/vapoursynth.c:26972)
  File "/home/igni/bin/vapour/fullqua.py", line 11, in <module>
    clip = clip.resize.Bicubic(format=vs.YUV420P8)
AttributeError: 'str' object has no attribute 'resize'

Решил, что изменение размера всё равно ни к чему, закомментировал эту строку и снова запустил. Получил следующее:

Script evaluation failed:
Python exception: Super: argument clip was passed an unsupported type (expected clip compatible type but got str)
Traceback (most recent call last):
  File "src/cython/vapoursynth.pyx", line 1491, in vapoursynth.vpy_evaluateScript (src/cython/vapoursynth.c:26972)
  File "/home/igni/bin/vapour/fullqua.py", line 53, in <module>
    smooth =  interpolate(clip)
  File "/home/igni/bin/vapour/fullqua.py", line 34, in interpolate
    super   = core.svp1.Super(input,super_params)
  File "src/cython/vapoursynth.pyx", line 1370, in vapoursynth.Function.__call__ (src/cython/vapoursynth.c:25121)
vapoursynth.Error: Super: argument clip was passed an unsupported type (expected clip compatible type but got str)

Я так понимаю, переменная clip должна быть не адресом файла, а видеопотоком? Как же его в таком случае передать в скрипт?
Можете помочь с решением этой проблемы? Ничего под Linux по этой теме не нашёл.

Re: Генерация Vapoursynth-скриптов для Linux

примерно как-то так

core.std.LoadPlugin(path='path/to/ffms2.so')
clip = core.ffms2.source(source='path/to/video',threads=1)

это не рабочий код, а направление для поиска wink

3 (edited by Igni Serpens 23-10-2016 13:11:52)

Re: Генерация Vapoursynth-скриптов для Linux

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

clip = core.ffms2.Source("/tmp/video.mp4")

которая подгружает нужный файл. Ещё всплыл косяк с неизвестной скрипту переменной container_fps, которую прописал вручную (рядом с переменной clip) со значением 60. И получилось прекраснейшее божественное плавное 60-fps видео без тормозов, артефактов и нагрузки на железо! В живом режиме мой комп бы такие настройки не потянул (да и мало чей бы потянул)! Кодировался он с такими настройками со скоростью 12 fps - в пять раз более низкой, чем нужно в живом режиме!
Вот такой получился скрипт (~/bin/vapour/fullquality.py):

# This script was generated by SVP 4 Manager.
# Check https://www.svp-team.com for more details.

import vapoursynth as vs
core = vs.get_core(threads=7)

core.std.LoadPlugin("/home/igni/bin/SVP4/plugins/libsvpflow1_vs64.so")
core.std.LoadPlugin("/home/igni/bin/SVP4/plugins/libsvpflow2_vs64.so")

clip = core.ffms2.Source("/tmp/video.mp4")
clip = clip.resize.Bicubic(format=vs.YUV420P8)
container_fps = 60

crop_string  = ""
resize_string = ""
super_params     = "{scale:{up:0},gpu:1,rc:true}"
analyse_params   = "{block:{w:8},main:{search:{coarse:{distance:-12,bad:{sad:2000}},type:2}},refine:[{thsad:250}]}"
smoothfps_params = "{gpuid:11,rate:{num:5,den:2},algo:23,mask:{area:1000,cover:80},scene:{}}"

demo_mode   = 0
stereo_type = 0

########## BEGIN OF base.py ##########
# This file is a part of SmoothVideo Project (SVP) ver.4
# This is NOT the full Vapoursynth script, all used variables are defined via
# JScript code that generates the full script text.

def interpolate(clip):
    input = clip
    if crop_string!='':
        input = eval(crop_string)
    if resize_string!='':
        input = eval(resize_string)

    super   = core.svp1.Super(input,super_params)
    vectors = core.svp1.Analyse(super["clip"],super["data"],input,analyse_params)
    smooth  = core.svp2.SmoothFps(input,super["clip"],super["data"],vectors["clip"],vectors["data"],smoothfps_params,src=clip,fps=container_fps)
    smooth  = core.std.AssumeFPS(smooth,fpsnum=smooth.fps_num,fpsden=smooth.fps_den)

    if demo_mode==1:
        return demo(input,smooth)
    else:
        return smooth

if stereo_type == 1:
    lf = interpolate(core.std.CropRel(clip,0,(int)(clip.width/2),0,0))
    rf = interpolate(core.std.CropRel(clip,(int)(clip.width/2),0,0,0))
    smooth = core.std.StackHorizontal([lf, rf])
elif stereo_type == 2:
    lf = interpolate(core.std.CropRel(clip,0,0,0,(int)(clip.height/2)))
    rf = interpolate(core.std.CropRel(clip,0,0,(int)(clip.height/2),0))
    smooth = core.std.StackVertical([lf, rf])
else:
    smooth =  interpolate(clip)
########### END OF base.py ###########


smooth.set_output()

Только поток получился без звука. Но наложить звук из оригинала при помощи ffmpeg - это уже не проблема. Получилась вот такая строка для создания интерполированного видео:

ffmpeg -i video.mp4 -vn -acodec copy sound.mkv; vspipe --y4m ~/bin/vapour/fullquality.py - | ffmpeg -i pipe: encoded.mkv -i sound.mkv

Короче, я дико доволен, что есть возможность предсоздания файлов. Именно на этом вам стоит делать ставку, уважаемые разработчики! Сделать удобный интерфейс для кодирования группы файлов через GUI. Потому что благодаря этому можно сделать это всего лишь раз и смотреть видео где угодно и сколько угодно, не мучая своё железо. Также появляется возможность создать очень качественное сглаживание на маломощном компьютере, которое в живом режиме создать нереально.

Re: Генерация Vapoursynth-скриптов для Linux

Да, в старом SVP3 была полу-автоматическая возможность через пункт "скопировать скрипт под XVid4PSP". Может в будущем появится мини-менеджер, куда просто нужно ввести переменные, и он создаст что-нибудь)

5 (edited by dlr5668 23-10-2016 14:58:07)

Re: Генерация Vapoursynth-скриптов для Linux

есть же staxrip. Один раз вставил скрипт и все готово.

Re: Генерация Vapoursynth-скриптов для Linux

Staxrip только для Windows существует. Да и не каждый обычный пользователь вообще поймёт, что это за скрипты и куда чего вставлять. Я говорю о создании встроенного в сам SVP интерфейс для домохозяйки, чтобы вообще не думать ни о каких скриптах, о том как работает программа и не устанавливать доп софт. Так программа станет более популярной. Благо, мне кажется, особых усилий это не потребует. Я так уже написал скрипт, который максимально автоматизирует все описанные выше действия - нужно только передать ему имена входящего/выходящего файлов и выбрать качество интерполяции (от чего будет зависеть время кодирования) и всё.

7 (edited by Igni Serpens 23-10-2016 19:03:11)

Re: Генерация Vapoursynth-скриптов для Linux

Правда в результате такого преобразования видео у меня получается какое-то замыленое, пропадает чёткость оригинала. Пока не понял, по какой причине.
P.S. Уже разобрался - кодек в ffmpeg выбирается автоматически и качество его далеко не самое лучшее - надо задавать свой.