Conversione e riparazione dei video .TS

Traduzioni completate e raccolte di links.

Conversione e riparazione dei video .TS

Messaggioda Aurelicornus » 28/06/2013, 16:44

Apro un capitolo su questo tipo di file video che alcuni registratori del DTV utilizzano per salvare i dati, nel caso ne abbiate uno anche voi e abbiate i miei stessi problemi. Io ne ho uno che mi presenta un problema: l'inizio dei files spesso sono "rotti", lo stream video manca di alcuni frames iniziali creando un "vuoto". Ho fatto la spiacevole scoperta che questa cosa crea un enorme problema quando voglio usare questi files in un programma di video-editing, perché mi desincronizza l'audio, il quale inizia anche mezzo secondo prima del video.
Questo mi ha dato un bel problema per un pezzo perché è difficile correggere un video desincronizzato se neanche puoi aprirlo in un video-editor, e si tratta della tua fonte originale. I miei file .TS inoltre hanno anche alcuni problemi negli streams, errori che non si possono correggere essendo nella fonte originale.

Io ho risolto usando FFMPEG (o il suo gemello Libav) su Linux con alcune funzioni di base e convertendo tutto il video in un formato di "archivio", per poi riconvertirlo di nuovo in seguito in un formato per l'uso finale.

La mia procedura:
- Correggere gli errori.
I miei files TS, oltre alla desincronia, hanno spesso errori negli stream, come cecksum sballati, frame "incomplete", e simili. Dato che questi files sono gli "originali" e sono stati registrati così, non c'è modo di correggerli, e fortunatamente nella quasi totalità dei casi non ho trovato vere corruzioni nei frames (cioè che mancano o siano imparziali). Nonostante questo, passarli subito in un formato "finale" lo trovo sconventiente, perché questi errori potrebbero avere qualche ripercussione nella conversione di certi formati.

Per correggere la desincronia, ho rimediato iniziando la conversione qualche secondo dopo l'inizio del video, cioè dicendo al programma di saltare tutto il pezzo dove mancano i frames video. Con questo trucchetto, FFMPEG mi inizia la conversione in un punto dove audio/video sono in sincronia. Se possibile, posiziono l'inizio a 5 secondi circa prima dell'inizio dell'episodio, dato che FFMPEG non ha una ricerca precisa (non è stato fatto per questo).

Per gli errori nello stream, converto video e audio in un formato Lossless: in questo modo ho una copia perfettamente fedele all'originale, con la stessa qualità e con i dati registrati in maniera corretta, ma senza perdere dati (e perciò qualità) che invece subirei con formati più comuni come DivX. Convertire da un Lossy farebbe solo deteriorare la qualità, e le registrazioni da Cartoonito non sono il massimo.
A questo per il video uso l'FFV1: ci sono pochissimi video codec Lossless puri, e l'FFV1 è forse l'unico che sia facile da trovare e sia affidabile (due qualità che gli altri formati mancano). Ci sono altri formati, ma non sono efficenti oppure sono closed-source e disponibili solo per certi OS. Alternative all'FFV1 sono il precedente Huffyuv, ma è tecnicamente inferiore. L'H264 (quello dei DVD) ha anche una modalità Lossless sistemando il quantizzatore a 0, ma sconsigliano di usarlo per questo scopo perché, diversamente dall'FFV1, l'H264 non effettua una copia "bit a bit" fedele all'originale, e per qualsiasi operazione di Video-editing o riconversione bisognerebbe farla su una fonte originale o che sia una copia fedele.
L'FFV1 ha il difetto di produrre file enormi: un episodio di FiM mi richiede anche 5 GB di spazio sull'HD!

Per l'audio sto adottando Flac, che è apprezzato da tempo per l'affidabilità ed efficenza.

Come container, ho adottato da lungo tempo il Matroska per gli usi comuni, anche questo giudicato uno dei più robusti e flessibili.

FFMPEG su Linux usa principalmente la linea di comando, dunque ecco la mia:

Codice: Seleziona tutto
ffmpeg -i (file sorgente) -acodec flac -vcodec ffv1 -ss (inizio video, in formato HH:MM:SS) -t (quanto video convertire, in HH:MM:SS) (file di output)


-i (file sorgente) : File di input.
- acodec: codec audio da usare, su FFMPEG per il flac il codice è "flac"
- vcodec: anche in questo caso, il codice è "ffv1" per ffv1. (na: non sempre i codici dei codec corrispondono ai loro nomi).
Sia Flac e sia ffv1, essendo formati di compressione "pura", hanno pochi parametri, e principalmente solo di tipo "tecnico" che per i bisogni generici come i nostri sono di scarso interesse. I parametri disponibili si trovano nelle documentazioni in rete, oppure nelle guide di FFMPEG.
La documentazione di ffv1 è quasi introvabile, vi avverto: ci sono solo 2 parametri che non vengono descritti da NESSUNA parte, ma riguardano la gestione degli stream come registrazione dei dati, e non la qualità della codifica.

-ss e -t: -ss indica il punto in cui FFMPEG deve iniziare a registrate. Se indicato DOPO il parametro -i, FFMPEG non fa una vera ricerca ma inizia a registrare solo dopo aver raggiunto quel punto. Viene giudicato più preciso. Il parametro -t, invece, indica per quanto tempo il programma deve convertire il video. Dunque, se voi avete l'inizio dell'episodio al minuto 15, e gli episodi durano 22 minuti, i parametri -SS e -T devono essere:
- SS 00:15:00
- T: 00:22:00

Altri dati, come bitstream e dimensione, in genere non li tocco dato che non ho particolari esigenze. Se necessario però questi parametri sono regolati dai comandi generici di FFMPEG, che potete vedere nella sua documentazione. FFPEG fa praticamente di tutto senza problemi in questo senso, ma c'è da prendere familiarità con la linea di comando.

Il file di output non richiede un parametro, e il container può essere dichiarato con l'estensione (io uso principalmente .MKV).

Il risultato è di ottenere un video convertito in FFv1 con cui si siano risolti gli errori che ha l'originale .TS (si è salvato il salvabile insomma). Ora si può fare una riconversione in un formato più pratico e largamente adottato: a questo scopo uso il più diffuso H264, che al momento resta lo "stato dell'arte" per compressione, limpidezza delle immagini e compatibilità. Attualmente è il codec di base dei Blu-Ray, e si vede sui comuni player di casa.
Se invece volete fare video-editing, l'FFV1 dovrebbe essere già supportato da vari video-editor.

Se invece volete solo convertire la puntata e restate sempre in FFMPEG, la linea di comando:

Codice: Seleziona tutto
ffmpeg -i (input video) -vcodec libx264 -preset veryslow -tune animation -crf 10 -acodec aac -strict -2  (output)


Su FFMPEG l'H264 è dato dalle librerie x264, anche queste giudicate tra le migliori in circolazione come velocità, efficenza e qualità. Il loro codice è libx264 e ha alcuni parametri diversi rispetto a quelli base di FFMPEG, e potete leggerli qui: http://mewiki.project357.com/wiki/X264_Settings

- preset: Definisce la velocità di codifica con la qualità. In genere più basso è ed meglio è il risultato finale, anche se il costo è che il computer ci potrà mettere ore a convertire il video. Per chi è maniaco c'è il preset "Placebo" che ha un miglioramento dell'1% nella qualità rispetto a VerySlow, e lo rallenta di oltre la metà. Se avete davvero TANTA pazienza, accomodatevi... :troll: Veryslow fa già un ottimo lavoro ad una velocità ragionevole.
- Tune: sono una serie di ottimizzazioni nel codec per migliorare l'immagine a seconda del tipo di video: in teoria dovrebbe produrre un risultato leggermente migliore nella maggior parte dei casi. Per le animazioni c'è un preset dedicato chiamato "animation", che fa al caso nostro.
- crf è equivalente ad altri due parametri: -qp e -bitrate, e definiscono la qualità visiva complessiva del video. Sono quelli più importanti per decidere quanta qualità e peso in Mb dovrà avere il video. -bitrate si definisce la grandezza del video indicato quanti dati il programma può usare in media per ogni frame: questo permette di ottenere una dimensione precisa ma a spese spesso della qualità. -qp permette una qualità migliore, anche se non è possibile prevedere la dimensione finale del file; questo parametro se messo a 0 abilita anche la modalità Lossless del codec, anche se a livello visivo non comporta dei vantaggi significativi: una impostazione di 10 produce già un risultato visivo nitido. -crf è una via di mezzo tra -qp e -bitrate, in quanto cerca di stabilire una qualità "visiva" media per tutto il video senza però estremizzare come la funzione -qp, cercando di risparmiare anche spazio. Sulla qualità sia -qp e sia -crf sono ottime scelte, dipende su cosa vi serve (se un video ad alta qualità o va bene un compromesso tra qualità e dimensione).
- Per il codec AAC in FFMPEG bisogna abilitarlo con i parametri -strict -2. E' considerato "sperimentale", ma funzionante. AAC ha varie funzioni (come il Sorround e varie) che vanno abilitate sempre con la riga di comando, se siete interessati i parametri sono nella documentazione di FFMPEG.

Risultato: un episodio di FiM in .MP4 pronto ad essere caricato su Youtube o nel player di casa ^_^

Spero vi sia utile se avete dei problemi con i .TS ^_^

FFMPEG può applicare anche i sottotitoli direttamente durante la conversione, ma su questo devo ancora vedere i parametri. Quando me ne interesso farò una aggiunta a questo post.

****
Piccolo glossario per chi volesse imparare a fare conversioni di video o magari aiutare nel fare gli hardsub.

I file di video sono composti da due parti:
- gli "stream", cioè i flussi di dati, divisi in video e audio. In genere ci sono due flussi, ma in alcuni casi possono essercene di più, es. video in multilingua, o con i commenti, tipo le traccie dei DVD.
- un "container", cioè un contenitore che contiene gli stream. Il container serve sia a contenere i dati, e sia a sincronizzare l'audio e video insieme, incluso quando si usa la funzione di ricerca, fast-foward, ecc.

Ora, container e flussi non sono la stessa cosa. Per sapere che tipo è un video non basta sapere quale container è, ma il formato in cui sono registrati gli stream, e questa codifica si chiama appunto codec. Audio e video hanno codec diversi.
Perciò dire che un video è in formato "MP4" non significa nulla dal punto di vista tecnico. MP4 è solo un contenitore che non dice come sono registrati i dati. Per saperlo bisogna specificare il loro codec: per il video, bisogna dire se il codec è un H264 (usato nei blu-ray), se un DivX/XviD (usato dei DVD), e così via. Per l'audio, lo stesso vale se si parla di un MP3, Vorbis, AAC, WAV... si specifica una codifica.
A volte il nome dei codec coincide con quello dei container, ma non sempre. Si fa per semplicità per chi non ha dimestichezza tecnica, perciò ecco che un container .MP3 contiene un audio col codec .MP3, ma non è sempre vero. Un container come Matroska, o il più vecchio AVI possono contenere stream registrati con diversi tipi di codec.

Per operare con gli stream, anche con un video-editor, è necessario averli in un container. Potete trasportare i flussi da un contaner all'altro senza fare nessuna operazione di ricodifica in molte maniere: su FFMPEG potete usare le funzioni -acodec copy e -vcodec copy per travasare gli stream senza nessuna ricodifica, oppure se adottate un container come "standar" ci sono tools appositi che trovate sulla rete.
Per il matroska ad esempio viene dato il mkvtoolnix, che permette di prendere flussi da altri container e salvarli nel .mkv (come tool è davvero valido, in quanto effettua anche controlli sugli eventuali errori, desincronie e problemi che si verificano: se ci sono errori nella fonte, ve lo dice, e anche quali). Di interessante Matroska offre anche una gestione dei sottotitoli multipli all'interno del container, e poter creare menù di selezione come nei DVD: si può creare una versione dei DVD in formato elettronico. Segnalo un difetto: alcuni player non riescono a leggere i Matroska che hanno inclusi i sottotitoli all'interno del file (ne ho uno che ne è allergico), perciò attenzione a questa funzione se mirate a fare un video visibile da tutti i dispositivi e non solo da PC.
Twitter: https://twitter.com/gr3yf3ath3r
Thumblr: https://griffins-unicorns.tumblr.com/
mail: derpyhooves@grifoniunicorni.it
Discord: Aurelicornus#6751 ( Filly Funtasia Discord server: https://discord.gg/yyf4vZR )
Avatar utente
Aurelicornus
Rainbow Pony
Rainbow Pony
 
Status: Offline
Messaggi: 8891
Iscritto il: 12/08/2011, 16:20
Pony preferito: Twilight Sparkle
Sesso: Maschio

Torna a Archivio

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti