Aggiornamento Marzo 18/00
1. NON usare il Panasonic per singole codifiche da .wav a .mp2. Il risultante .mp2 non sarà sincronizzato con il video in questione. Usando DVMPEG per codificare da .wav a .mp2 (sebbene la qualità non sia buona come con il Panasonic), verrà creato un audio .mp2 che sarà sincronizzato con il video. Ma, se mettiamo il .avi ed il .wav assieme nel Panasonic, ecco che l'.mpg risultante sarà sincronizzato. Strano vero?
Problemi di sincronizzazione audio e video: Come e Perchè.
Fin dal prima versione del Powerip risalente alla metà del 1999, la gente si è sempre imbattuta nel problema di determinare la corretta velocità del video e dell'audio nel convertire un flusso NTSC mpeg-2 audio/video in un qualsiasi altro formato (es. mpeg-1, avi, asf, o DivX) per ottene la perfetta sincronia fra i due.
Questo problema di sincronia fra audio e video è dovuto da una non-corretta conversione del flusso video mpeg-2 (sia usando Powerip, che mpeg2avi o qualunque altro programma attualmente disponibile). Questo documento non vuole screditare Squeezer o il Flask, bensì va considerato come un supporto, così FORSE la spiegazione contenuta può essere utilizzata per perfezionare sia Squeezer che il Flask -- o addirittura l'AGrabber plugin. Da notare però che ci sono state un bel numero di conversioni perfettamente "sincronizzate" fatte con utilities come "SQUEEZER" e "FLASK". Ma vi sono anche dei casi in cui nessuna conversione produce una totale "sincronia" fra video e audio.
Perchè? Proviamo a dare un'occhiata al procedimento di trasferimento di un filmato da pellicola di 35mm ad un formato video NTSC, per vedere in concreto "la radice" del nostro male.
Conversione da pellicola di 35mm a video NTSC
I film di solito vengono fatti sul negativo di una pellicola da 35mm. Questo formato ha una velocità di 24 FRAME al secondo. Un Frame è la più piccola unità del formato FILM. Il video NTSC è un formato "field-based" di 59.94 FIELD al secondo. Un Field è la più piccola parte del formato Video. 2 Fields diventano 1 FRAME. Quindi, questi 59.94 FIELD al secondo equivalgono a 29.97 FRAME al secondo. Adesso vediamo la differenza: 1 secondo in un FILM (24 frame) NON è uguale ad 1 second nel Video NTSC (29.97 frame).
Per poter "centrare" la giusta velocità in un Video NTSC, la conversione dal formato FILM al formato Video NTSC, appunto,va fatta con un particolare procedimento chiamato "2:3 pulldown" o TELECINE. Quest'ultimo, in parole povere, dice "di aggiungere 6 frames cosi un 24 fps diventa un 30fps -- che è NETTAMENTE differente da un 29.97fps". Il problema a cui si giunge quando si procede ad un trasferimento TELECINE è : QUALI 6 FRAMES devono essere aggiunti -- o RIPETUTI?
Alcuni gruppi di film/moviemaker/videomaker/ingegneri crearono una STANDARDIZZAZIONE di questa conversione TELECINE. Dal momento che un Video FRAME consiste in 2 Fields, perchè non creare il formato FILM in un solo Field, dal momento che è l'unità elementare per entrabi i formati? Vediamo come si articola tutto il procedimento:
1. Un 24 FRAMES diventa un 48 FIELDS
A |
B |
C |
D |
A primo |
A ultimo |
B primo |
B ultimo |
C primo |
C ultimo |
D primo |
D ultimo |
Il Frame A si separa in 2 fields: Aprimofield +Aultimofield. Così, 4 Frames diventano 8 Fields, e 24 Frames diventano 48 Fields. Questo materiale "field-based" viene poi TELECINATO in un Segnale Video NTSC. Dal momento che il TELECINE è una conversione STANDARDIZZATA, ecco che dobbiamo rispettarne le regole ;). La regola è RIPETERE_IL_PRIMO_FIELD ( tecnicamente REPEAT_FIRST_FIELD) in una sequenza 2:3.
4 FRAMES (8 FIELDS) diventano 5 FRAMES (10 FIELDS)
(Ora per praticità indicheremo come primo = top e come ultimo = bottom, secondo la dicitura originale dell'autore ).
A |
B |
C |
D |
Atop |
Abottom |
Atop |
Bbottom |
Btop |
Cbottom |
Ctop |
Cbottom |
Dtop |
Dbottom |
Da un'attenta visione è possibile vedere una sequenza del tipo At Al At seguita da Bl Bt, poi da Cl Ct Cl e poi da Dt Dl. Ma, dal momento che 1 FRAME è composto da 2 FIELDS, ecco che la sequenza diventa AA AB BC CC DD. Ciò che noi abbiamo ora è una conversione di 4 frames SOLIDI in 5 frames, i quali sono composti da 3 FRAMES SOLIDI e 2 FRAMES INTERLACCIATI. Per INTERLACCIAMENTO io mi riferisco ad un FRAME composto da 2 FIELDS provenienti da 2 sorgenti di FRAMES DIFFERENTI. Il frame AB è un esempio.
Quindi, 4 FRAMES diventano 5 FRAMES, così 24 diventano..... 30, PERFETTO! Perfetto? Non credo, non così facilmente. Il Video NTSC è a 29.97fps, quindi la RIPRODUZIONE di un 30fps deve essere rallentata a 29.97fps, che ci porta ad introdurre il concetto di FRAME_PERSO (tecnicamente DROP_FRAME).
Non associamo però il concetto di DROP_FRAME come "FRAMES che vengono letteralmente RIMOSSI o PERSI". In una sequenza Video a 30fps, un "DROP_FRAME time code" conta accuratamente i video frames in relazione al tempo reale. Il DROP_FRAME time code conta ciascun video frame ma, quando quel .03 finalmente aggiunge un video frame, lui salta (o perde) un numero. Non viene perso un film o un video frame, viene semplicemente saltato un numero e si prosegue a contare. Questo ci permette di ottenere una temporizzazione precisa. Quindi se noi tagliamo una scena usando il drop frame time code, e la durata letta del flusso video è 30 minuti e 0 frames, allora possiamo star certi che tale durata sarà veramente di 30 minuti. Confusione? Bene, in parole povere, il DROP_FRAME in sostanza EQUIVALE a RALLENTARE la riproduzione di un normale 30fps alla corretta VELOCITA' di 29.97fps di un NTSC. Nel campo dell' MPEG-2, questo significa che i frames 00 e 01 vengono persi o SALTATI dal time code, all'inizio di ogni minuto ad eccezzione per tutti quei minuti che sono sempre multipli di 10.
Solo ORA è tutto A POSTO.
Telecine in Video MPEG-2
In un Video Mpeg-2, collocare frames a 30fps in 1 secondo crea un file di dimensioni nettamente superiori anzichè svolgere lo stesso lavoro ma con soli 24 frames. Se fate i calcoli, vedrete che 1 secondo di 24 frames è RIDOTTO DEL 20% rispetto ad 1 secondo a 30fps. Ma,come già visto prima, il video NTSC deve essere a 29.97fps. Pertanto ciò significa che TUTTI i filmati che provengono da una pellicola da 35mm devo essere dapprima TELECINATI, successivamente CODIFICATI nel flusso Video Mpeg-2 a 29.97fps, giusto? ..... NO!
Un buona cosa del Video Mpeg-2 è che contiene alcuni FLAGS o PROGRAMMAZIONI, che consentono di segnalare al SOFTWARE o all' HARDWARE di svolgere un TELECINE durante la riproduzione del Video stesso. Dal momento che i FRAMES INTERLACCIATI che realizzano il 29.97fps sono field(s) RIPETUTI, significa che sono RINDONDANTI, e quindi CESTINABILI. E' sufficiente settare i FLAGS in modo tale da "avventire" il player che deve realizzare un TELECINE. Credetemi, è POSSIBILE farlo ;). Il vantaggio di tutto ciò è che i film POSSONO essere salvati nei loro originali 24 FRAME al secondo, risparmiando così il 20% di spazio occupato dal file in uscita!.
I FLAGS in questione sono i seguenti: REPEAT_FIRST_FIELD, TOP_FIELD_FIRST. Le regole da applicare a questi FLAGS seguono la STANDARDIZZAZIONE. Comunque non è il caso di allarmarsi circa il procedimento :). Qui possiamo vedere alcuni esempi:
3. Aggiunte dei Flags T_F_F e R_F_F
Top Field First 1 |
Top Field First 0 |
Top Field First 0 |
Top Field First 1 |
Repeat First Field 1 |
Repeat First Field 0 |
Repeat First Field 1 |
Repeat First Field 0 |
A |
B |
C |
D |
Atop |
Abottom |
Atop |
Bbottom |
Btop |
Cbottom |
Ctop |
Cbottom |
Dtop |
Dbottom |
Come possiamo vedere, il Valore 1 per entrambi T_F_F e R_F_F farà in modo che il player VISUALIZZI IL FRAME A nella sequenza Atop Abottom Atop, mentre il Valore 0 per entrambi T_F_F e R_F_F farà in modo che il palyer VISUALIZZI IL FRAME B nella sequenza Bbottom Btop.
Quando il T_F_F vale 0 ed il R_F_F vale 1 (FRAME C), il player visualizzerà il FRAME C nella sequenza Bbottom Btop Bbottom e così via. Dal momento che è una conversione STANDARDIZZATA, è possibile ripetere i Valori del T_F_F e del R_F_F come segue:
Sequenza T_F_F : 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
Sequenza R_F_F : 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
Quindi, noi abbiamo uno stream Video Mpeg-2 CONTENENTE 24 FRAMES al secondo con i flags TFF e RFF abilitati. Questo porterà alla creazione di CONFLITTI fra i 24fps contro i 30fps e lo STANDARD Video VERBATIM 29.97fps NTSC. Per risolevere questo problema, ci sono altre 2 opzioni che possono essere applicate ad uno stream Video Mpeg-2, e sono l' FPS flag ed il DROP_FRAME flag.
Quando l' FPS flag, contenuto nell'header di uno stream Video Mpeg-2, viene PROGRAMMATO, ecco che quest'ultimo farà in modo che il player VISUALIZZI lo stream video ad una VELOCITA' ben definita. Cioè, se l' FPS flag è settato a 29.97fps, ecco che lo stream Video verrà riprodotto esattamente a 29.97 frames al secondo.
Quando il valore del flag DROP_FRAME vale 1, ecco che il player si RICORDERA' che i frames 00 e 01 all'inizio di ogni minuto vanno ignorati, ad eccezione per tutti quei minuti che sono multipli di 10. Il risultato ottenuto è praticamente lo stesso che si ottiene nel settare l' FPS flag a 29.97fps.
Quindi i video stream Mpeg-2 NTSC "immagazzinati" a 24 FRAMES, ma riprodotti a 29.97fps si fanno in QUESTO modo. Ora che abbiamo capito il procedimento, siamo pronti ad INVERTIRLO, per ottenere così una totale sincronizzazione fra Audio e Video nel momento in cui RI-CONVERTIREMO il nostro filmato da video stream Mpeg-2 NTSC - 24 FRAME ad un qualunque altro formato che vogliamo noi.
Come? Iniziamo con "mpeg2avi", un'utility che permette di convertire un Video stream Mpeg-2 in un formato .avi (con i codecs che vogliamo noi).
4. Mpeg2avi, VideoMatrix o Graphedit
Dopo un'attenta lettura al file readme.txt che è allegato assieme all'utility, possiamo convertire un Video stream Mpeg-2 Video in un .avi a 24fps ESATTI. Ritengo OVVIO che mpeg2avi converta i FRAMES in modalità DISPLAY_ORDER e non in modalità CODED_ORDER. Se tale conversione viene fatta in modalità CODED_ORDER, allora siamo totalmente rovinati.
Un'altra possibilità è quella di usare l'utility VideoMatrix, che converte uno stream Video Mpeg-2 in un formato .avi BASANDOSI sulla RIPRODUZIONE dello stream Video Mpeg-2. Questa utility GARANTISCE che la conversione viene fatta in modalità DISPLAY_ORDER.
Oppure, se si ha familiarità con il Graphedit, è possibile usare anche questa utility per convertire un Video Mpeg-2 in un .avi. Tutte e tre queste utility DEVONO dare un .avi risultante a pieni 720x480 ed a 24 FRAMES al secondo. Questo 720x480 24fps è un REQUISITO.
5. M2VInfo
questa utility è stata scritta per facilitare l'analisi del comportamento dei FLAGS e dei loro valori in uno stream Video Mpeg-2. E' un'utility basata su DOS a riga di comando che va usata come segue:
C:\M2VInfo filename.m2v > dump.txt
E' possibile arrestare il processo, perchè attualmente solo le informazioni del primo GOP sono necessarie per determinare il modello dei valori dei FLAGS ed il loro comportamento.
Un esempio del file dump.txt è il seguente:Type 1 tff 1 rff
1 temp_reference 2
Type 3 tff 0 rff 1 temp_reference 0
Type 3
tff 1 rff 0 temp_reference 1
Type 2 tff 1 rff 0 temp_reference
5
Type 3 tff 0 rff 0 temp_reference 3
Type 3 tff 0 rff 1
temp_reference 4
Type 2 tff 0 rff 1 temp_reference 8
Type 3 tff
1 rff 1 temp_reference 6
Type 3 tff 0 rff 0 temp_reference 7
Type
2 tff 0 rff 0 temp_reference 11
Type 3 tff 1 rff 0 temp_reference
9
Type 3 tff 1 rff 1 temp_reference 10
Note:
Type-1 = I Frame
Type-2 = P Frame
Type-3 = B Frame
temp_ref = DISPLAY ORDER
rff = Repeat_First_Field flag
tff = Top_Field_First flag
Ora, ciò che dobbiamo fare è ricostruire il DISPLAY
ORDER. Io l'ho fatto partendo dal dump.txt sopra riaggiustando i
Frames rispettivamente in accordo con il temp_ref. order
B B I B B
P B B P B B P
Poi mettiamo ordine anche nel T_F_F e nel R_F_F.
0 1 1 0 0 1 1 0 0 1 1 0
1 0 1 0 1 0 1 0 1 0 1 0
Ora abbiamo la sequenza seguente nel DISPLAY_ORDER:
B B I B B P B B P B B P
0 1 1 0 0 1 1 0 0 1 1 0
1 0 1 0 1 0
1 0 1 0 1 0
Quindi, dal momento che a noi interessa sol osapere quale sia la sequenza TELECINE CORRETTA....ci basta prendere i primi 5 frames dalla sequenza sopra, ed assumere che sia una sequenza A B C D E:
A B C D E
Applichiamo la sequenza sopra ai valori del T_F_F e del R_F_F, e seguiamo correttamente il primo valore del T_F_F, così sapremo qual è lo STARTING FIELD. Io ho fatto così:
AlAu AlBu BlCu ClCu DlDu ElEu El
Lo STARTING_FIELD della sequenza sopra è Al = Frame A lower field. Separiamo la sequenza sopra in pezzi da 1 frame (contenenti 2 fields), e potremo calcolare la sequenza TELECINE con il .M2V come segue:
W S S W W W
Quindi, la sequenza WSSWW è l' ESATTA SEQUENZA TELECINE di questo particolare .M2V
I restanti flags, come FPS, DROP_FRAME, ecc, vanno comunque inclusi. Sono proprio questi i fattori determinanti per il calcolo della corretta sequenza TELECINE che è usata da un particolare Video Mpeg-2. Ci sono 5 sequenze TELECINE ritenute valide: WSSWW, SSWWW, SWWWS, WWWSS, WWSSW.
W = Whole Frame (Frame Intero)
S = Separate Field (Frame Separato)
Dal file dump.txt, poi, possiamo ricavare la sequenza TELECINE per ricostruire il 2:3 pulldown in un .avi a 24fps. Ecco quindi che noi EMULIAMO il normale DISPLAY_ORDER di un Video Mpeg-2 mentre lo RIPRODUCIAMO come un normale AVI. In breve, noi CONVERTIAMO un .avi a 24fps in un .avi NTSC a 29.97fps. E' importante usare la corretta sequenza TELECINE E il corretto STARTING FIELD. Quando la ricostruzione ci da' dei lower_field all' INIZIO del DISPLAY_ORDER, ecco che ciò che dobbiamo fare è prendere la nostra conversione COSI COM'E'. Sia la SPECIFICA SEQUENZA TELECINE che lo STARTING FIELD sono IMPORTANTISSIMI per creare una sincronizzazione audio/video accurata al 100%.
Al momento della stesura di questo documento, I riesco ad usare solo l'Adobe After Effect per la corretta conversione da 24fps a 29.97fps perchè è il solo ad essere in grado di applicare entrambi i fattori determinanti descritti sopra contemporanenamente. Certo, è possibile fare tutto questo direttamente con un qualunque ENCODER, ma la conversione che salta fuori non è conforme al processo TELECINE STANDARD. I comuni encoders infatti applicano il calcolo del "4° frame ripetuto" per passare da 24fps a 29.97fps (30fps drop frame). In breve sarebbero così:
Cio che creano gli attuali TELECINE Encoders è: AA BB CC DD DD EE FF GG HH HH
Il corretto passaggio TELECINE deve essere: AA AB BC CC DD EE EF FG GG HH
Da come è possibile vedere, il fattore dello STARTING FIELD è applicato ovunque (anche l'encoder Panasonic ha tale opzione). Se questo errore compare in tutta un 'ora di conversione Video, ecco che la sincronizzazione audio SARA' persa. Viste come stanno le cose, ecco che io preferisco usare l'Adobe After Effect (nonstante sia un programma piuttosto complesso), ALMENO FINO A QUANDO non ci sarà un nuovo metodo.
6. Adobe After Effects
Riguardo a questa parte io non sono veramente in grado di dire molto. Occorre SAPERE come lavora l'Adobe After Effects. Questa è la ragione per cui voglio trovare un modo per semplificare questa parte, o in parole povere, una strada alternativa PER NON USARE L' ADOBE AFTER EFFECTS. Diciamo però che, in linee generali, ciò che faccio con l'After Effects è questo:
Carico l'.avi a 24fps.
Creo una nuova composizione a 29.97fps.
Importo l'.avi a 24fps nella nuova composizione appena creata.
Setto il fattore determinante dello STARTING FIELD (top or bottom – nell' Adobe è UPPER o LOWER), e la corretta sequenza TELECINE (una delle sequenze seguenti: WSSWW, SSWWW, SWWWS, WWWSS, WWSSW).
Realizzo il filmato.
Tutte questa operazioni vengono fatte a 720x480. Il filmato .avi risultante sarà a 29.97fps, in pieno accordo con la STESSA SEQUENZA TELECINE di trasferimento che era stata programmata nel Video Mpeg-2 -- THE DISPLAY_ORDER. Questo avi diventerà poi il sorgente per la conversione in ALTRI formati, oppure se viene scelto il codec DIVX già in partenza, ecco che allora ora occorre aggiungerci lo stream Audio.
7. Conversione dell' Audio
Usate Graphedit per importare qualunque tipo di di formato audio.Ciò che dobbiamo fare è linkare le varie connessioni fra le boxes del programma.
Eliminare il RENDERER box
Inserimento filtri (Insert filters) -- Audio Decompressor -- PCM
Insert filters -- Directshow filters -- WAVE DEST
Insert filters -- Directshow filters -- FILE WRITER (nominatelo AUDIO.WAV)
Colleghiamo le varie sezioni --- PCM --- WAVE DEST --- FILE WRITER
Premiamo il pulsante PLAY
Alla fine di tutto avremo 2 files: VIDEO.AVI e AUDIO.WAV. Ora dobbiamo decidere cosa farne. Possiamo:
8. Convertire a Mpeg-1 secondo la direttiva VideoCD
Carichiamo l'encoder Panasonic Mpeg-1
Diamo in input i files VIDEO.AVI e AUDIO.WAV
Settiamo la conversione allo standard/template VCD NTSC
Settiamo il MERGE/BLEND FIELD in accordo con il fattore STARTING FIELD. Se il Video Mpeg-2 originario parte con un LOWER field, allora settiamo LOWER FIELD come base del FIELD BLENDING nel Panasonic. Se il Video Mpeg-2 di sorgente è Anamorfico, aggiungiamo le corrette BANDE NERE alle estremità SUPERIORE ed INFERIORE del VIDEO (buoni valori sono 66 e 67).
Diamo il via alla codifica.
Al termine della conversione avremo un Mpeg-1 VCD Compliant (352x240) a 29.97fps; da notare: la sequenza video che salterà fuori sarà, come dire, piuttosto "liscia" ("smoothly" è il termine inglese più corretto! :-) )
Il vantaggio di uno stream Video/Audio Mpeg-1 a 29.97fps è che è possibile editarlo nel IFilm Mpeg-1 editor, mentre se fosse stato a 23.976fps non sarebbe stato possibile.
Nello scrivere questo documento, ho cercato di descrivere una situazione il più precisa possibile proprio per aiutare a rispondere alle domande relative alla sincronizzazione Audio e Video, e spero che un coder possia dare ulteriore aiuto a SEMPLIFICARE il processo. Io so che sia lo SQUEEZER che il FLASK sono in grado di creare una TOTALE SINCRONIA. Ma dal momento che ci sono anche voci che smentiscono quest'ultima, FORSE può aiutare a fare il punto della questione, e magari potrebbero anche saltare fuori soluzioni per una PERFETTA sincronizzazione a/v adatte a QUALUNQUE conversione.
Alcune idee che ritengo valide sono le seguenti:
Riscrivere l' mpeg2avi (codice sorgente disponibile) affinchè NON CONVERTA SOLO i CODED FRAMES in un Video Mpeg-2.Più precisamente, deve tener conto anche dei valori del TFF, del RFF e del DISPLAY_ORDER, in modo tale che la conversione da Video Mpeg-2 24 FRAMES ad un .avi a 29.97 fps possa essere eseguita in 1 PASSO. Questo porterà un minor degrado qualitativo.Con il metodo di conversione che ho descritto in questo Documento, per passare da un Video Mpeg-2 ad un Video Mpeg-1 occorre passare attraverso un 24fps avi --- un 29.97fps avi – ed infine all' Mpeg-1.
Se ciò che è stato descritto sopra non fosse possibile, un ragazzo mi ha informato circa un'opzione di Frameserver (in sospensione....on the fly) nell'ultimo VDUB (v. 1.3a). Ecco che magari forse qualcuno può scrivere un filtro di ricostruzione 2:3 pulldown per il VDUB, che esegua la corretta ricostruzione TELECINE nel VDUB. Tale filtro deve includere le opzioni STARTING FIELD e TELECINE SEQUENCE che devo essere usate per ricostruire un 24fps .avi a 29.97fps .avi secondo il calcolo fatto nel M2VInfo. Aggiungere questo filtro con quello relativo al RESIZE che è già presente nel VDUB, noi possiamo così AVVIARE IL FRAMESERVING dell' avi, e poi LANCIARE l' LSX Mpeg Encoder aprendo un .avi FRAMESERVED In questo modo noi possiamo realizzare CBR Mpeg-1 VCD compliant oppure CBR (e VBR) Mpeg-2 SVCD compliant Video. Nota: Questa opzione di frameserver nel VDub funziona solo nei sistemi operativi Win2K e NT. Sotto Win98 non funziona.
Scrivere un filtro directshow di ricostruzione 2:3 pulldown per il Graphedit, così potremo, con 1 SOLA operazione, passare da un Mpeg-2 Video Audio ad un DIVX o ad un AVI.
Qualcuno è pronto?
Cordiali saluti,
robshot
17 Marzo 2000 – Tradotto il 20 Agosto 2002