|
|
View previous topic
::
View next topic
|
Author |
Message |
Joined: 04 Mar 2006
Posts: 2744
Location: Θεσσαλονίκη




















|
Posted: Tue Apr 07, 2009 3:22 pm
Post subject: Homebrew Avisynth Scripts
|
|
|
Μιας και τώρα τελευταία το filtering είναι της μοδός (  ), είπα να ανοίξω κι ένα thread για να ποστάρουμε homebrew τεχνικές και script που χρησιμοποιούμε, ώστε να διευκολύνουμε τη ζωή τη δική μας αλλά και όσων θέλουν να ασχοληθούν!
Παρακαλώ όσοι ποστάρουν, να γράφουν στο Θέμα τον τίτλο του script, στο Περιεχόμενο να ποστάρουν τον κώδικα μέσα σε [code] tags, αλλά και ένα παράδειγμα χρήσης του script, επίσης μέσα σε [code] tags. Σε αντίθετη περίπτωση, τα ποστ θα γίνονται είτε EDIT είτε DELETE για να διατηρείται η ομοιομορφία και η χρηστικότητα του topic. _________________ Διαβάστε τους Κανόνες του Forum! Τα greeklish απαγορεύονται!
Διαβάστε το Playback FAQ
Feeling... nauseous already? Wait to see my anime list first...
And remember, fansubbing is NOT serious business...
Last edited by Gpower2 on Wed Feb 29, 2012 2:12 pm; edited 2 times in total
|
|
Back to top
|
|
Joined: 04 Mar 2006
Posts: 2744
Location: Θεσσαλονίκη




















|
Posted: Tue Apr 07, 2009 3:28 pm
Post subject: Goverlay
|
|
|
Μιας και το μόνο που κυκλοφορεί έξω για overlays είναι το avisign, το οποίο προσωπικά το απεχθάνομαι  , είπα να γράψω ένα πιο απλό και εύχρηστο script για εσωτερική και μη χρήση. Ορίστε λοιπόν:
Code:
|
#####################################################
# #
# Goverlay v2.0 #
# #
# c1 - Original Video clip #
# c2 - Overlay Clip (RGBA) #
# startf - start frame (of original video) #
# endf - end frame (of original video) #
# convert - convert original video to RGBA or not #
# #
#####################################################
function Goverlay(clip c1, clip c2, int "startf", int "endf", bool "convert"){
startf = default(startf, 0)
endf = default(endf, startf+FrameCount(c2))
convert = default(convert, false)
part1=c1.trim(0,startf-1)
part2=c1.trim(startf,endf)
part3=c1.trim(endf+1,0)
part2= convert?part2.ConvertToRGB32().overlay(c2, mask=c2.showAlpha()):part2.overlay(c2.ConvertToYV12(), mask=c2.showAlpha())
part2= convert?part2.ConvertToYV12():part2
return part1+part2+part3
}
|
Παράδειγμα χρήσης:
Code:
|
avisource("C:\Garslan\AnimeClipse\GTO\GTO_Episode1_Workraw_Final.avi")
ts1=avisource("C:\Garslan\AnimeClipse\GTO\ep01_tb2_21434_-_21517.avi")
ts2=avisource("C:\Garslan\AnimeClipse\GTO\ep01_tb3_66506_-_66650.avi")
ts3=avisource("C:\Garslan\AnimeClipse\GTO\ep01_tb_18138_-_18219.avi")
ts4=avisource("C:\Garslan\AnimeClipse\GTO\ep01_titlos_6808_-_6934.avi")
goverlay(ts1,21434)
goverlay(ts2,66506)
goverlay(ts3,18138)
goverlay(ts4,6808)
|
Καινούρια έκδοση με δυνατότητα διαφορετικής μάσκας:
Code:
|
#####################################################
# #
# Goverlay v2.6 #
# #
# c1 - Original Video clip #
# c2 - Overlay Clip (RGBA) #
# mask - Mask clip #
# startf - start frame (of original video) #
# endf - end frame (of original video) #
# convert - convert original video to RGBA or not #
# #
#####################################################
function Goverlay(clip c1, clip c2, clip mask, int "startf", int "endf", bool "convert")
{
startf = default(startf, 0)
endf = default(endf, startf + FrameCount(c2))
convert = default(convert, false)
mask = default(mask, c2)
part1=c1.trim(0, startf - 1)
part2=c1.trim(startf, endf)
part3=c1.trim(endf + 1, 0)
part2= convert ? part2.ConvertToRGB32().overlay(c2, mask=c2.showAlpha()) : part2.overlay(c2.ConvertToYV12(), mask=mask.showAlpha())
part2= convert ? part2.ConvertToYV12() : part2
final = startf == 0 ? ((endf > framecount(c1) - 1) ? part2 : part2 + part3) : ((endf > framecount(c1) - 1) ? part1 + part2 : part1 + part2 + part3)
return final
} |
Παράδειγμα χρήσης:
Code:
|
Avisource("Ep017_lossless.avi")
logo_a=avisource("..\logo_1a.avi")
goverlay(logo_a, logo_a, 1255) |
Παρατηρήσεις:
- Θεωρώ ότι το script θα υπάρχει με την ονομασία Goverlay.avsi
- Πλέον δε χρειάζεται σαν input το end frame
- Καλό είναι να αποφεύγεται το convert=true, απλά μπήκε επειδή μου ζητήθηκε
- Δε χρειάζεται η εντολή return στο τέλος
Tip
Το ξέρατε ότι αν σώσετε τα script με κατάληξη .avsi και όχι την απλή .avs, το avisynth τα φορτώνει αυτόματα χωρίς να χρειάζεται import;  _________________ Διαβάστε τους Κανόνες του Forum! Τα greeklish απαγορεύονται!
Διαβάστε το Playback FAQ
Feeling... nauseous already? Wait to see my anime list first...
And remember, fansubbing is NOT serious business...
Last edited by Gpower2 on Sun Mar 04, 2012 4:26 pm; edited 3 times in total
|
|
Back to top
|
|
Joined: 11 Dec 2006
Posts: 676
















|
Posted: Thu Aug 13, 2009 3:19 am
Post subject: Neo106 IVTC Combo
|
|
|
Προσφατα χρησιμοποιησα το παρακατω combo για ivtc σε anime με 36% Film, τιγκα στα combed frames και εκει που το τριπλο combo του tritical (μετα απο απειρο configuration) και το telecide εβγαζαν αθλια αποτελεσματα.Οπου δεν εφυγαν τα combed frames εγιναν απλως παρα πολυ ανεκτα σε σημειο που καποιες φορες ουτε καν τα προσεχες.
Code:
|
#για video με πρωτο field το πανω.
#Μπορουμε δοκιμαστικα να καλεσουμε την
#SeperateFileds() για να δουμε ποιο field (πανω η κατω)
#εμφανιζεται πρωτο στο video μας.
AssumeTFF()
#οριζουμε δικο μας smart bober και οχι τον default του smartdecimate.
#Εγω επελεξα τον DGBob.
my_bobbing=DGBob(mode=1, order=1, thresh=70)
#χωριζουμε τα frames σε fields για να αυξηθει το frame accuracy απο τον
#decimator μας-ταυτοχρονα αυξανεται το fps του video σε 2x.
#H τελευταια εκδοση του smartdecimate καλει μονη της την SeparateFields()
SeparateFields()
#βαζοντας σαν πρωτες παραμετρους 24 (στοχος για τελικο framerate με
#ολοκληρωμενα progressive frames και οχι fields) και 60(αρχικο framerate)
#στο smartdecimate, του δινουμε εντολη για 3:2 pulldown. Σαν αρχικο
#framerate εχουμε ακριβως 60 γιατι το smartdecimate στρογγυλοποιει το
#αποτελεσμα του 29.97x2=59.94. Πιο σωστο θα ηταν να χρησιμοποιήσουμε
#σαν παραμετρους 23976 και 59940, οι τιμες αυτές ομως ειναι πολυ μεγαλες
#και θα επρεπε να προβουμε σε απλοποιηση.
SmartDecimate(24, 60, tel=0.5, bob=my_bobbing)
#smoothing σε frames που εμειναν combed artifacts
SmoothDeinterlace(tff=true, lacethresh=20, edgethresh=50)
#Τελος θελουμε το video να τρεχει σε 23.976 fps (24 frames per 1.001 seconds).
AssumeFPS(24, 1001, false)
|
Προτεινεται και το antialiasing του lexalkon για ακομη καλυτερα αποτελεσματα.
Code:
|
eedi2().spline36resize(width, height).turnright().eedi2().spline36resize(height, width).turnleft() |
Τα παραπανω φιλτρα υπαρχουν στο http://avisynth.org/warpenterprises/ καθενα με τις οδηγιες του. _________________ Επισκεφτείτε το κανάλι μας πατώντας εδώ
Για τα τελευταία releases επισκεφθείτε τον tracker μας
Για να δείτε την πρόδο των projects πηγαίνετε στο Project Status πατώντας εδώ
Ζητάτε ευγενικά χωρίς να απαιτείτε

|
|
Back to top
|
|
Joined: 30 May 2005
Posts: 740
Location: $root_dir













|
Posted: Wed Feb 29, 2012 4:59 am
Post subject: Modified Signs Overlay
|
|
|
Αν και έχει περάσει πολύς καιρός, κάλιο αργά παρά ποτέ. Είχα κάνει κάποτε μια διόρθωση στο Signs_overlay, γιατί δεν δεχόταν overlay διάρκειας 1 frame. Δεχόταν από 2 και πάνω.
Τροποιημένη έκδοση του sign, που υποστηρίζει sign 1 frame:
Code:
|
function sign( clip c , int "start_frame" , int "end_frame" , int "offset" , string "mode" , int "x" , int "y" )
{
offset = Default( offset , 0 )
mode = Default( mode , "Blend" )
end_frame = Default( end_frame , 0 )
x = Default( x , 0 )
y = Default( y , 0 )
start_frame = Default( start_frame , 0 )
overlay_frame = SIGN_FRAME
assert( defined( c ) , "You must have a working video clip to be overlayed" )
end_frame = SIGN_OVERLAY.isclip ? ( ( end_frame > 0 ) ? end_frame : start_frame + SIGN_OVERLAY.framecount - 1 - SIGN_FRAME ) : end_frame
start_frame = SIGN_OVERLAY.isclip ? ( ( start_frame >= 0 ) ? start_frame : end_frame - SIGN_OVERLAY.framecount + 1 + SIGN_FRAME ) : start_frame
assert( start_frame <= end_frame , "Starting Frame (" + string( start_frame ) + ") must be smaller than Ending Frame (" + string( end_frame ) + ")!" )
assert( ( start_frame >= 0 ) && ( end_frame >= 0 ) , "Starting (" + string( start_frame ) + ") and Ending Frame (" + string( end_frame ) + ") must not be smaller than 0" )
assert( end_frame < c.framecount , "The number of frames being overlayed must not be bigger than the number of frames in the clip you're overlaying on (end frame = " + String( end_frame ) + ")" )
o = SIGN_OVERLAY.isclip() ? SIGN_OVERLAY.assumefps( c ).trim( overlay_frame + offset , overlay_frame + end_frame - start_frame ) : ""
global SIGN_FRAME = SIGN_FRAME + end_frame - start_frame + 1
start_frame = start_frame + offset
sign_overlays = lcase( mode ) == "splice" ? o : ( SIGN_OVERLAY.isclip() ? c.trim( start_frame , end_frame ).overlay( o , x , y , o.showalpha , mode=mode ) : "" )
return \
SIGN_OVERLAY.isclip() ? \
( start_frame > 0 ? \
( end_frame < c.framecount( ) - 1 ? \
c.trim( 0 , -start_frame ) ++ sign_overlays ++ c.trim( end_frame + 1 , 0 ) : \
c.trim( 0 , -start_frame ) ++ sign_overlays ) : \
( end_frame < c.framecount( ) - 1 ? \
sign_overlays ++ c.trim( end_frame + 1 , 0 ) : \
sign_overlays ) \
) : c.trim( start_frame , end_frame )
} |
Και με την ευκαιρία, του είχα προσθέσει μερικά fancy features. Δεν τα έγραψα σε ξεχωριστό script γιατί υπάρχουν global μεταβλητές στο sign.
Πολλές φορές θα θέλαμε να περάσουμε μεταβλητή video στο avisign, αλλά αναγκαζόμαστε να περάσουμε καρφωτό path και filename.
Η συνάρτηση clipSign μας επιτρέπει να δώσουμε σαν όρισμα μεταβλητή video αντί για καρφωτό path:
Code:
|
function clipSign( clip c , clip v , bool "rescale" , string "alpha_file" , string "colorspace" )
{
rescale = Default( rescale , false )
colorspace = Default( colorspace , "" )
colorspace = UCase( colorspace )
alpha_file = Default( alpha_file , "" )
v = converttorgb32(v)
global SIGN_FRAME = 0
global SIGN_OVERLAY = rescale ? ( ( alpha_file != "" ) ? mergeargb( avisource( alpha_file ) , v.showred , v.showgreen , v.showblue ) : v ).assumefps( c ).lanczos4resize( c.width , c.height ) : ( ( alpha_file != "" ) ? mergeargb( avisource( alpha_file ) , v.showred , v.showgreen , v.showblue ) : v ).assumefps( c )
global SIGN_OVERLAY = colorspace == "YV12" ? SIGN_OVERLAY.converttoyv12( ) : ( colorspace == "YUY2" ? SIGN_OVERLAY.converttoyuy2( ) : ( colorspace == "RGB" ? SIGN_OVERLAY.converttorgb( ) : ( colorspace == "RGB24" ? SIGN_OVERLAY.converttorgb24( ) : ( colorspace == "RGB32" ? SIGN_OVERLAY.converttorgb32( ) : SIGN_OVERLAY ) ) ) )
return c
} |
Επίσης, μπορεί να θέλουμε να δώσουμε ένα ξεχωριστό video σαν alpha mask. Η συνάρτηση clipSignAlpha δέχεται και ένα όρισμα μεταβλητής video που αντιπροσωπεύει το alpha κανάλι:
Code:
|
function clipSignAlpha( clip c , clip v , clip a)
{
v = converttorgb32(v)
global SIGN_FRAME = 0
global SIGN_OVERLAY = mergeargb(a , v.showred , v.showgreen , v.showblue ).assumefps( c )
return c
} |
Μια φορά χρειάστηκε να κάνω Tweak στο overlayed video, οπότε έφτιαξα και μια παραλλαγή που να παίρνει και παραμέτρους Tweak:
Code:
|
function clipSignTweak( clip c , clip v, float "hue", float "sat", float "bright", float "cont")
{
hue = Default(hue, 0.0)
sat = Default(sat, 1.0)
bright = Default(bright, 0.0)
cont = Default(cont, 1.0)
v2 = converttoyv12(v)
v2 = Tweak(v2, hue=hue, sat=sat, bright=bright, cont=cont)
v2 = converttorgb24(v2)
global SIGN_FRAME = 0
global SIGN_OVERLAY = mergeargb(v.showalpha , v2.showred , v2.showgreen , v2.showblue ).assumefps( c )
return c
} |
Αντίστοιχα, μπορεί να θέλουμε να κάνουμε ImgSign, το οποίο να κάνει Fade-in και Fade-out. Στην συνάρτηση FadeImgSign μπορούμε να ορίσουμε πόσα frames από το συνολικό overlay θέλουμε να καταλαμβάνει το Fade-in, και πόσα το Fade-out:
Code:
|
function FadeImgSign( clip c , string "filename" , int "length", int "fadein_num", int "fadeout_num")
{
length = Default( length , 30)
fadein_num = Default( fadein_num , 10 )
fadeout_num = Default( fadeout_num , 10 )
v = imagesource( file=filename , start=0 , end=length - 1 , use_devil = true , pixel_type="RGB32" )
a = v.ShowAlpha()
a = FadeIn0(a, fadein_num)
a = FadeOut0(a, fadeout_num)
v = MergeARGB(a, v.ShowRed(), v.ShowGreen(), v.ShowBlue())
global SIGN_FRAME = 0
global SIGN_OVERLAY = v
return c
} |
Και επειδή συχνά τα λογότυπα των anime μπορεί να έχουν μια πολύ ελαφριά και ανεπαίσθητη θολούρα, η παρακάτω παραλλαγή μας επιτρέπει να βάλουμε και λίγο Blur στο Logo μας, για να δένει καλύτερα με την εικόνα:
Code:
|
function FadeImgSignBlur( clip c , string "filename" , int "length", int "fadein_num", int "fadeout_num", float "blur_level")
{
length = Default( length , 30)
fadein_num = Default( fadein_num , 10 )
fadeout_num = Default( fadeout_num , 10 )
blur_level = Default( blur_level , 0 )
v = imagesource( file=filename , start=0 , end=length - 1 , use_devil = true , pixel_type="RGB32" )
v = Blur(v, blur_level)
a = v.ShowAlpha()
a = FadeIn0(a, fadein_num)
a = FadeOut0(a, fadeout_num)
v = MergeARGB(a, v.ShowRed(), v.ShowGreen(), v.ShowBlue())
global SIGN_FRAME = 0
global SIGN_OVERLAY = v
return c
} |
Και γιατί να μην μπορούμε να βάλουμε και hardsubbed υποτίτλους, με offset συγκεκριμένο frame, για να κάνουμε time-shifts στα credits ή κάποιο άλλο hardsubbed στοιχείο, χωρίς να πειράζουμε κάθε φορά το .ass αρχείο; Η παρακάτω συνάρτηση μας δίνει και αυτή τη δυνατότητα:
Code:
|
function AssSign(clip c, string filename, int start_frame) {
c1 = Trim(c, 0, start_frame - 1)
c2 = Trim(c, start_frame, 0)
c2 = TextSub(c2, filename)
return c1+c2
} |
Last edited by Left64Vegeta on Mon Mar 05, 2012 12:37 am; edited 1 time in total
|
|
Back to top
|
|
Joined: 04 Mar 2006
Posts: 2744
Location: Θεσσαλονίκη




















|
Posted: Sun Mar 04, 2012 4:59 pm
Post subject:
|
|
|
Ένα από τα πιο γνωστά προβλήματα στο filtering, είναι το antialiasing, δηλαδή, πώς θα κάνουμε τις γραμμές λείες χωρίς να έχουν σκαλοπατάκια.
Πριν κάποια χρόνια, ο lexalkon βρήκε ψάχνοντας μια τεχνική, η οποία πραγματικά έχει θεαματικά αποτελέσματα. Πλέον το χρησιμοποιούμε σχεδόν πάντα, αλλά ποτέ δεν κάθισε κανένας να το κάνει μια function να τελειώνουμε.
Ε, μου ήρθε έμπνευση και σας προσφέρω το script.
Code:
|
#####################################################
# #
# lexalkon Antialising v1.0 #
# #
# c1 - Original Video clip #
# #
#####################################################
function lexAntialias(clip c1)
{
final = c1.eedi2().spline36resize(c1.width, c1.height).turnright().eedi2().spline36resize(c1.height, c1.width).turnleft()
return final
} |
Χρήση:
Τόσο απλό κι ωραίο!
Στο μέλλον θα του προσθέσω κι άλλα καλούδια που χρειάστηκα, αλλά προς το παρόν αυτό φτάνει και περισσεύει.  _________________ Διαβάστε τους Κανόνες του Forum! Τα greeklish απαγορεύονται!
Διαβάστε το Playback FAQ
Feeling... nauseous already? Wait to see my anime list first...
And remember, fansubbing is NOT serious business...
|
|
Back to top
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|
|
Powered by phpBB © 2001, 2002 phpBB Group
|
|
|
 |
|
|
|