Recensubs HQ

Posts written by mirkosp

view post Posted: 7/5/2018, 20:20     +1[Emblem-XIII vs. OPF-Itaia] Shingeki no Bahamut: Virgin Souls - Episodio 01 - Recensubs
Semplicemente le recensubs non se le caga più nessuno (come il fansub).
view post Posted: 23/4/2018, 15:02     Strange - Il ghetto dei fansubbers
Tornando in topic, ho fatto un confronto in caso limite e stranger è circa 1.5% più veloce di strange (in media).
In situazioni normali non dovrebbe comportare differenze sostanziali, ma tenetelo presente.

Dal poco che l'ho usato sembra inoltre esente da bug di trim, ma non si sa mai.

Edited by mirkosp - 23/4/2018, 23:09
view post Posted: 18/4/2018, 08:22     Strange - Il ghetto dei fansubbers
Aggiornati alla v1.5 e v2.1: ho parametrizzato il repeat, ora si può decidere di tenere il fill come un blankclip nero (di default resta un freeze).
view post Posted: 17/4/2018, 17:39     +3Strange - Il ghetto dei fansubbers
Strange è una funzione che ho scritto ormai parecchi anni fa per aiutarmi nel filtraggio tramite CL di YATTA.
Nel tempo si è rivelata una delle funzioncine sceme più utili e che mi è capitato più spesso di andare a usare per un motivo o per l'altro, forse più per abitudine.
Recentemente mi sono reso conto di un bug di strange in cui finora non ero incorso per come usavo strange in YATTA, ma che può accadere in condizioni normali in base all'uso.

Per la precisione, non era gestita la situazione in cui il clip di edit fosse di durata diversa rispetto al clip base.
Questo mi torna sovente comodo quando devo apportare modifiche shiftando frame o pezzi di video, quindi non volevo gestire l'eccezione dando un errore, per cui ho corretto facendo sì che, se il video di edit è più lungo, questo viene trimmato alla durata del clip base, se invece è più corto, viene allungato ripetendo il frame finale del clip di edit.
Vi lascio quindi qui la versione aggiornata:
CODICE
#strange v1.5 by mirkosp
#Yet Another function similar to ApplyRange in purpose that works somewhat differently.
#Start and end work exactly like first_frame and last_frame work with trim(), for the
#sake of consistency, which means that you can use end as if it was -num_frames too.
#ofps parameter tells whether to keep the original fps (true) or not (false).
#For reference: http://avisynth.org/mediawiki/Trim

function strange (clip c, int "start", int "end", clip "edit", bool "ofps", bool "repeat") {
#This function only makes sense with filters that return clips to begin with, so no
#point in bothering with strings. It's both easier and better.
start = default(start,0)
end = default(end,0)
edit = default(edit,blankclip(c,length=c.framecount()))#everybody loves blankclip
amount = c.framecount()
ofps = default(ofps,false)
repeat = default(repeat,true)
amountedit = edit.framecount()
edit = amountedit >= amount ? edit.trim(0,amount-1) : repeat ? (edit+blankclip(edit,amount-amountedit)).freezeframe(amountedit,amount,amountedit-1) : edit+blankclip(edit,amount-amountedit)

#Brainfarts check ahead.
start = (start < 0) ? 0 : start
end = (-end > amount-start) ? 0 : end
start = (start > amount-1) ? amount-1 : start
end = (end > amount-1) ? 0 : end

#Match framerate in case user's custom filtering would change it
c = !ofps ? c.assumefps(edit) : c
edit = ofps ? edit.assumefps(c) : edit

#I'm not a good programmer, so I'm not sure if this is slower than it could be.
(start == 0) ? ((end == 0) || (end == amount-1)) ? edit :\
   (end < 0) ? edit.trim(0,end)+c.trim(start-end,0) :\
  edit.trim(0,end)+c.trim(end+1,0) :\
(start == 1) ? ((end == 0) || (end == amount-1)) ? c.trim(0,-1)+edit.trim(start,0) :\
   (end < 0) ? c.trim(0,-1)+edit.trim(start,end)+c.trim(start-end,0) :\
  c.trim(0,-1)+edit.trim(start,end)+c.trim(end+1,0) :\
((end == 0) || (end == amount-1)) ? c.trim(0,start-1)+edit.trim(start,0) :\
   (end < 0) ? c.trim(0,start-1)+edit.trim(start,end)+c.trim(start-end,0) :\
  c.trim(0,start-1)+edit.trim(start,end)+c.trim(end+1,0)
}


Già che stavo mettendo mano al codice, ho deciso di revisionare inoltre del tutto il funzionamento. Al posto di gestire le eccezioni, aggiungo dei frame in testa e in coda.
In questo modo, idealmente, si dovrebbe riuscire a rendere leggermente più rapido il codice di strange, perché ha molti meno if da gestire.
Tuttavia, non avendo usando estensivamente questa versione di strange (anzi, al momento è puramente codice teorico che non ho provato con mano), non ho modo di caldeggiarla senza test su strada.
La lascio qui sotto come funzione a parte, stranger:
CODICE
#strange v2.2 by mirkosp
#Yet Another function similar to ApplyRange in purpose that works somewhat differently.
#Start and end work exactly like first_frame and last_frame work with trim(), for the
#sake of consistency, which means that you can use end as if it was -num_frames too.
#ofps parameter tells whether to keep the original fps (true) or not (false).
#For reference: http://avisynth.org/mediawiki/Trim

function stranger (clip c, int "start", int "end", clip "edit", bool "ofps", bool "repeat") {
#This function only makes sense with filters that return clips to begin with, so no
#point in bothering with strings. It's both easier and better.
start = default(start,0)
end = default(end,0)
edit = default(edit,blankclip(c,length=c.framecount()))#everybody loves blankclip
amount = c.framecount()
ofps = default(ofps,false)
repeat = default(repeat,true)
amountedit = edit.framecount()
edit = amountedit >= amount ? edit.trim(0,amount-1) : repeat ? (edit+blankclip(edit,amount-amountedit)).freezeframe(amountedit,amount,amountedit-1) : edit+blankclip(edit,amount-amountedit)

#Brainfarts check ahead.
start = (start < 0) ? 0 : start
end = (-end > amount-start) ? 0 : end
start = (start > amount-1) ? amount-1 : start
end = (end > amount-1) ? 0 : end
start = start+3
end = (end == 0) ? amount+2 : (end < 0) ? end : end+3

#Match framerate in case user's custom filtering would change it
c = !ofps ? c.assumefps(edit) : c
edit = ofps ? edit.assumefps(c) : edit

#New approach that avoids special case checks and should be slightly faster
frames = blankclip(c,3)
c = frames+c+frames
edit = frames+edit+frames

eclip=edit.trim(start,end)

c.trim(0,start-1)+eclip+c.trim(start+eclip.framecount,0)
return trim(3,amount+2)


}


Se qualcuno di voi riuscisse a confermare che il risultato di stranger è bit exact a quello di strange, gliene sarei molto grato.
Anche eventuali test della velocità di esecuzione di codice tra strange e stranger potrebbero essere interessanti, anche se credo che la differenza di velocità, se realmente inesistente, sarebbe marginale, salvo un grande impiego di strange(r) nello script, che comunque è una situazione che può verificarsi.

Edited by mirkosp - 27/5/2018, 08:34
view post Posted: 30/3/2018, 19:24     Annunci serie vecchie - La bacheca del fansub
In realtà i due titoli pokémon di task nel primo post sono stati rilasciati ai tempi!

Per quanto riguarda Ran, è la serie che più mi spiace di non aver fatto.
view post Posted: 18/2/2018, 11:44     +3La vera guida a come cavolo si encoda per davvero - Episodio 7: IVTC/DeInt/VFR/Cazzi&Mazzi (2) - Guida galattica per fansubbisti
Ehilà!
Come state?
Oggi avevo altra roba da procrastinare, per cui eccoci qua.

In realtà questo passaggio potrebbe essere sintetizzato in:

RTFM: https://avisynth.org.ru/docs/english/exter...lters/tivtc.htm

Visto che ormai la teoria dietro l'IVTC la sapete tutta e quindi siete in grado di comprendere i passaggi, ma vedrò di riportare qui i punti chiave di TIVTC, visto che alcuni concetti si ripresenteranno poi per YATTA (e dovrete stabilire voi quanto essere autistici).


Capitolo 1: L'approccio per persone sane di mente all'IVTC - Il field match con TFM

TFM(d2v="percorso\al\file.d2v")


Capitolo 2: L'approccio per persone sane di mente all'IVTC - La decimazione con TDecimate

TDecimate(mode=1)


Fine!


Capitolo 3: ESSEPI NON PRENDERCI PER IL CULO, NON HAI POSTATO UN CAZZO PER TUTTO IL 2017

Ok, è giunto il momento di dire la verità: non penso che si arrivi ad una ventina di persone in tutto il mondo a cui importa (ancora) veramente così tanto della qualità video per stare a fare queste cose a mano nel 2018.
Ma alla fine questa verità è ciò che ho volutamente ignorato quando ho scritto tutte le parti precedenti della guida, per cui non ha senso smettere di ignorare questo fatto ora, no?
Se siete già arrivati a leggere tutta la guida fino a qui, quindi, o siete malati di mente quanto me, oppure avete davvero del gran tempo da perdere.

Se siete della seconda categoria allora mettersi a encodare i cartoni cinesi non è uno dei modi più utili all'umanità per occupare il tempo. Suggerirei il volontariato, ma non giudico.

Se siete della prima e davvero c'è bisogno di usare gli ovr, probabilmente avete a che fare con un qualcosa che è meglio fare con YATTA.

Pertanto, prendete quando segue come essenzialmente a scopo illustrativo: sono cose di cui ho fatto utilizzo prima di imparare a usare YATTA, che comunque fu creato proprio perché fare queste cose a mano manda in pappa il cervello.

Sostanzialmente, se non dovete sistemare cambi scena scazzati dall'MPEG-2, ma avete un video pulito con un pattern essenzialmente costante (a parte eventuali cambi pattern nei punti delle sigle e dell'eyecatch), vi conviene usare TIVTC ed evitare YATTA.

Ne consegue che in realtà per il fansub, visto che quando si sta gestendo materiale interlacciato si ha tipicamente a che fare con .ts televisivi con i soliti difetti da gestire (più comodi da sistemare con YATTA) o con DVD vecchiotti pieni di casini (in cui TIVTC farebbe errori se lasciato andare in modalità automatica), il più delle volte potrebbe convenire usare YATTA, e TIVTC è sostanzalmente "inutile", ma non è necessariamente vero.

La decisione dipende essenzialmente da quante sistemazioni ci sarebbero da fare rispetto all'IVTC automatico, quanto filtraggio per scena/per frame dovrete fare, e sostanzialmente quanta sbatta avete.
Anche nei casi in cui TIVTC commette errori, il risultato finale è tendenzialmente accettabile e per l'utente medio non esisterà differenza percettibile in playback.
Ma noi siamo qui per essere malati, per cui OVVIAMENTE non ci accontentiamo mica di una cosa logica e sensata come "raggiungere un risultato sufficientemente buono", ma vogliamo necessariamente "raggiungere un risultato inutilmente ottimo".

Nevvero?


Capitolo 4: Approfondiamo TFM

TFM si occupa del field match, ovviamente.
Per farlo, ha bisogno di calcolare tutte le metriche del caso, su cui stabilire come intervenire.
Con i computer d'oggi è un processo che si fa molto più rapidamente che il realtime di riproduzione, ma un tempo tagliare su questa roba serviva, per cui, per evitare di calcolare due volte certa roba, potete pure sputare fuori queste metriche tramite il parametro output, così da capire come sta intervenendo TFM, e poi ridargliele di nuovo in pasto a sé stesso con input, in modo tale che ai successivi usi dello script non ci sia bisogno di ricalcolarle.

Sputar fuori le metriche è utile perché essenzialmente avrete già segnalati i punti in cui TFM non è sicuro di aver fatto bene l'IVTC, dicendovi dove potrebbero esserci comb residui da dover sistemare a mano.
Un'altra cosa che possiamo valutare sono i cambi scena. TFM matcha c/p di default, utilizzando gli n in caso di cambi scena problematici in cui non trova un match. Questo significa che, se trovate dei match n nello script, probabilmente quello è un cambio scena problematico. In alternativa potreste avere una scena molto movimentata con tanta merda, e il match n usciva pulito, ma usandolo sminchiate tutto il movimento e vi beccate pure un dup in mezzo alla scena. Belle cose!

Chiarito come funziona il sistema di metriche, passiamo a qualche parametro di TFM.

Oltre ai classici parametri di order/field (sinceramente trovo un po' inutile averli separati, ma vabbè), il grosso lo fanno mode e PP.
Gli unici mode con un reale senso di esistere sono 0 e 1. Lasciare altre opzioni come automatici sono follia, eventuali altri match sono da stabilire a mano, fine del discorso.

Per PP le cose si fanno "interessanti".
PP 0 lo usate se siete assolutamente certi che non ci siano comb nel video, e volete evitare che per qualche motivo venga fatto del PP, 1 è utile per lasciare degli hint dei frame da postprocessare ma volete lasciare che il postprocess venga fatto poi da TDecimate.

Se vi state chiedendo cosa siano gli hint... in sostanza, nei primi 64 pixel in alto a sinistra del video, il bit meno importante viene sfruttato per veicolare tutte le informazioni utili.
È un sistema mutuato da decomb e che anche fieldhint/telecidehints sfruttano.
In pratica ci si mettono informazioni come le metriche, e si può flaggare il frame come progressivo o interlacciato per sapere se post-processarlo o meno.
La differenza è totalmente trascurabile, ma se volete essere completamente autistici, allora sì, prima di fare IVTC aggiungete un paio di righe nere in alto, da croppare a IVTC ultimato. Questo non lo faccio neanche io, per cui complimenti, mi avete superato.

I valori 2-7 sono "relativamente inutili". Se state leggendo questa guida vorrete sicuramente usare opzioni migliori di quelle interne di TFM per post-processare i field, per cui al più vi ritrovereste a usare il parametro clip2, e quindi usereste o un valore tra 2 e 4 per usare il clip2 così com'è, o un valore tra 5 e 7 per sfruttare la maschera di movimento di tfm. Per quel che ho potuto testare io, la maggior parte delle volte questa maschera di movimento non si è rivelata particolarmente affidabile, e se fate qualche esperimento si noterà benissimo quali pezzi sono presi dal clip2 e quali sono il match.

Per gli altri parametri di TFM...

d2v l'ho già messo sopra. Se avete un d2v, specificarlo fa solo bene, tutto qui.

slow: true (che è ovviamente default), perché nel 2018 non ha senso usare false.

mChroma: come dice bene il manuale, salvo abbiate particolari artefatti sul chroma da impedire un matching affidabile, è meglio lasciarlo su true.

y0/y1: servono per impostare una fetta (in verticale) di video da ignorare per le decisioni. Se avete un .ts con gli avvisi a 60i che passano in basso, impostare i valori di y0 e y1 consente a TFM di azzeccare i match in automatico, e in teoria dovrebbero arrivare metriche accurate a TDecimate che a quel punto non dovrebbe scazzare la decimazione, ma non ci metterei la mano sul fuoco (tanto poi ne riparliamo con gli ovr).

chtresh/chroma/blockx/blocky/MI/mthresh: tutti parametri legati al post-process automatico per decidere se un frame va post-processato o no. In generale, se c'è da fare post-process e non volete essere pesoculo, è bene assicurarsi a mano di quali frame vengono post-processati e quali no, per cui segnalereste a mano negli ovr i frame da post-processare senza che ci pensino questi parametri a doverlo decidere per voi.

E ora, finalmente, veniamo alla roba interessante...

ovr: per passare i file ovr che vi scriverete a manina; della struttura degli ovr ne parlo più sotto.

ovrDefault: per stabilire come comportarsi per il post-process nei frame non indicati a mano. Idealmente, come dicevo sopra, non dovreste lasciare decisione automatiche a tfm, ma fare a mano. Di norma vi ritrovereste a specificare nell'ovr i frame da post-processare e poi impostare ovrDefault a 1 per impedire che vengano post-processati altri frame.

Di input/output ne ho già parlato a inizio capitolo.

OutputC vi crea un file in cui vi indica quali sequenze sono state rilevate come potenziali sequenze progressive e cNum stabilisce quanti frame match c di fila devono esserci per considerare una sequenza da indicare nel file di cui sopra. Sono opzioni potenzialmente utili per sapere già dove andare a controllare per vedere se ci sono sequenze da fare in VFR.

E ora, finalmente...

Con gli OVR potete dire a TFM di TUTTO. Proprio TUTTO.
Ma ovviamente le cose utili sono essenzialmente solo 2:
1) dire a TFM che pattern/match usare
2) dire a TFM che frame post-processare
Il resto si può quasi definire superfluo, per come la penso io, per cui qui starò a spiegare solo le due cose di cui sopra, e se volete guardarvi anche il resto l'RTFM di inizio guida è sempre valido.

Anzitutto, il file di ovr è un semplice txt, in cui dentro indicate un frame (o un range di frame indicato tramite virgola) e poi cosa ci si deve fare.

Per i match, invece, avete a disposizione p, c, n, u, b. I valori u e b sono essenzialmente trascurabili, quel che conta sono ovviamente i classici match p, c, n.
TFM di default matcha p (che è l'opposto di quello che fanno decomb e yatta), per cui avete due opzioni:
- forzare tutti i pattern del video a mano così è tutto in match n
- usare il match automatico di tfm dove è affidabile e specificare il pattern con match p dove in automatico ha problemi
Se volete andare con la prima opzione, tanto vale usare YATTA, per la seconda invece potete aiutarvi con il file di output che è stato sputato fuori per capire dove serve agire.

Per il postprocess invece, + indica che il frame è combed (e quindi da post-processare) e - che il frame è pulito così com'è. Se avete indicato ovrDefault 1, dovrete solo indicare + nei frame/pezzi/pattern che vi interessano.

Dunque, quello che potete fare quindi è:

Indicare un singolo frame e dire cosa va fatto.
Ad esempio, per dire che il frame 10 va post-processato basta scrivere:

10 +

O se il cambio scena al frame 9001 va matchato n al contrario del resto, potete fare:

9001 n

Indicare cosa fare in un gruppo di frame.
Ad esempio, per dire che tutti i frame dal 20 al 30 vanno post-processati basta scrivere:

20,30 +

Indicare cosa fare in un determinato pattern.
E quindi, se avete un pezzo che tfm scaga in automatico, potete forzarlo. Ad esempio, dal frame 50 al 100 potete forzare ccppc facendo:

50,100 ccppc

Potete usare i pattern anche per il post-process. Quindi, per dire che ogni quinto frame dal 200 al 300 va post-processato, potete fare:

200,300 ----+

E... direi che per TFM è tutto.


La parte che riguarda TDecimate la rimando a data da destinarsi, che per oggi ho già scritto abbastanza.

Capitolo 5: Approfondiamo TDecimate

Su TDecimate, per la verità, c'è molto meno da dire che su TFM.

I parametri che analizzerò qui sono mode, cycleR, cycle e ovr.
Ci sono tanti altri parametri, anche utili, per migliorare la decimazione automatica di TDecimate, ma siccome lo scopo ultimo è usare tivtc automatico solo quando la sorgente non ha cose complicate e andare manualmente quando invece lo fossero, analizzare tutto è superfluo, e per il resto quindi vi rimando al RTFM di inizio guida, se foste così interessati.

Di mode, sostanzialmente, ce ne interessa una: 1.
Con mode 1, tdecimate cercherà la stringa più lunga di dup che mantengano lo stesso pattern di decimazione.

CycleR e cycle servono a stabilire il pattern.
CycleR determina quanti frame vadano decimati in un gruppo, mentre cycle quanto è grande il gruppo.
Per il materiale che gestiamo solitamente questo significa CycleR è 1, e cycle è 5, e questo corrisponde al default.

In ultimo ovr.
Creando un file ovr, come per tfm, possiamo dire di preciso a tfm quali frame vadano decimati indicandoli con il meno.
Per cui, per decimare il frame 9001, all'interno dell'ovr scriveremo:

CODICE
9001 -


Possiamo anche specificare un pattern di decimazione, utilizzando il + per dire quali frame tenere.
Se dobbiamo decimare il terzo frame in ogni gruppo di 5 dal frame 20 al frame 209, faremo:

CODICE
20,209 ++-++


Molto semplice.


Con questo ci siamo levati TDecimate dai coglioni.
In realtà se ne potrebbe parlare anche di più, ma volevo semplicemente chiudere questa parte relativamente superflua della guida (e fare un nuovo post dopo anni per memare duro), per cui tant'è.

Se mai vorrò togliermi *davvero* la paglia dal culo, dalla prossima parte dovrei coprire YMC e YATTA...

Edited by mirkosp - 18/4/2020, 13:35
view post Posted: 23/5/2017, 18:34     Effetto "onda" con aegisub? - Il ghetto dei fansubbers
Se non ti interessa che sia identico, ma solo simile, si può emulare facendo qualche magheggio di \fax, \fay e \frz animati col \t con valori diversi ogni qualche carattere, a cui aggiungi un aegisub motion per fare un po' di movimento (e avere tutti i valori dei \t interpolati ogni frame) e poi applicare gradientbycharacter. Ti esce una distorsione animata tutto sommato simile, per l'animazione in uscita. Se vuoi un raffronto del risultato, ho fatto più o meno quello che ho descritto nell'episodio 16 di sangatsu no lion, a 16:48. Non sto a linkarlo, ma se vuoi controllare lo trovi su vvvvid.

PS: Ignora edicolas, dice solo scemenze credendo di essere simpatico.
view post Posted: 4/5/2017, 18:21     NyaaTorrent: il punto della situazione - Il salotto del fansub
Certo che parlare di gente "che preferisce il download allo streaming" e poi tirare fuori HorribleSubs, che sono i rip diretti dello streaming (e quindi qualitativamente hai la stessa cosa...).
view post Posted: 3/5/2017, 21:30     Fansub necrology - Il salotto del fansub
Sto cercando di convincere Compare Crabman a unirsi a noi in questo movimento di neorealismo fansubbiano.
view post Posted: 30/4/2017, 12:26     Stagione primaverile 2017 - La bacheca del fansub
Da quanto ne so su fansubdb va bene tutto finché non ricondividi una versione ufficiale. Quindi banalmente una qualsiasi roba disponibile in Italia, anche in home video, è accettata se la fansubbi tu con traduzione tua al posto di prendere i sub ufficiali.
Motivo in più per distanziarsi da fansubdb per quanto mi riguarda, ma non fansubbando neanche più il problema non mi si pone.
view post Posted: 27/4/2017, 23:02     +1Stagione primaverile 2017 - La bacheca del fansub
Diciamo che in genere gli altri gruppi non licensubbano anche gli editori italiani, cosa che invece tu hai fatto sia con Days sia con All Out (basta guardare nyaa per sgamare le release, eh).
Non che per me faccia differenza, visto che io reputo licensub anche per crunchyroll, ma c'è chi la distinzione la fa, e tu resti licensubber anche in quel caso.
view post Posted: 27/4/2017, 17:49     +1Stagione primaverile 2017 - La bacheca del fansub
Ridicolas licensubba regolarmente la roba in simulcast, lo scopri adesso?
3408 replies since 20/8/2005