Newsgroup: it.comp.software.divx
Titolo: Sottotitoli - Matroska - UTF-8

Il contenitore Matroska permette di inserire in un MKV vari
tipi di sottotitoli, come qui descritto:
http://www.matroska.org/technical/specs/subtitles/index.html
In particolare:
- SRT (che conosco);
- USF (che non conosco);
- SSA/ASS (che non conosco);
- sotto forma di immagini bitmap (come vobsub)
Per ora, ho implementato nel mio programma l'estrazione
"corretta" dei sottotitoli SRT (quelli che hanno come codec
"S_TEXT/UTF8"), risolvendo il problema di calcolare i giusti
timecode di inizio/fine visualizzazione di ogni entry.
Pero' e' rimasto un problema: in un MKV, i sottotitoli SRT
vengono rappresentati in UTF-8 (una codifica di "Unicode").
L'utility "mkvextract" (del pacchetto "mkvtoolnix") permette
di estrarre le tracce da un mkv, e tra queste anche gli SRT.
Se, ad esempio, la traccia 4 del file test.mkv e' un
sottotitolo SRT (codec "S_TEXT/UTF8"), con il comando
mkvextract tracks test.mkv 4:test.srt
verra' creato il file "test.srt" che conterra' appunto i
sottotitoli in formato SRT (stranamente la mia versione di
"mkvextract" ha un bug per cui il file inizia con tre bytes
che non dovrebbero esserci...).
Una cosa interessante da osservare e' questa:
quando si inserisce un file di sottotitoli in un MKV con
"mkvmerge" (o "mmg", che sarebbe la sua gui), i sottotitoli
vengono convertiti dal charset locale (iso-8859-1) a UTF-8.
Quando, in seguito, si estraggono gli stessi sottotitoli
con "mkvextract", vengono lasciati in UTF-8!
Ad esempio, se nei sottotitoli compare la parola "Perché",
dopo l'estrazione da MKV, presentandolo al tipico lettore sa,
vi troverete visualizzata una cosa del tipo: "PerchÃ©".
Per riconvertirlo al set di caratteri iso-8859-1 occorrera'
usare una utility come "iconv", ad esempio cosi':
iconv -f utf-8 -t iso-8859-1 test.srt > test-latin.srt
Il problema e' che a me fa piu' comodo estrarre i sottotitoli
gia' in formato iso-8859-1, perche' i lettori da tavolo che
ho potuto testare supportano proprio quel set di caratteri
e ovviamente non supportano UTF-8.
Quindi, per l'estrazione nel mio programma, avevo usato la
funzione di conversione (che si chiama "iconv", proprio
come l'utility a riga di comando).
Quando pero', poco fa  l'ho testato su un MKV che conteneva
sottotitoli SRT in cirillico, la conversione in iso-8859-1 e'
impossibile e quella funzione fallisce; il risultato e' che le
entries dei sottotitoli che non possono essere rappresentate
nell'alfabeto latino vengono rimosse, e alla fine mi resta
solo l'ultima entry (l'unica convertibile):
------------------------------------------------
1
00:02:25,080 --> 00:02:27,000
(Subtitles translated by ????)
------------------------------------------------
Allora ho pensato di procedere cosi':
- se la entry e' convertibile, la converto;
- se non lo e', la lascio in utf-8.
Pero' in questo modo si puo' ottenere un ibrido, che non e'
ne' iso-8859-1 ne' utf-8.
Come conviene fare?
Voglio dire, come sarebbe piu' utile?
Lasciare tutto in UTF-8 oppure convertire nel set di caratteri
usato dai lettori stand-alone (con i problemi discussi)?
-- 
Home page: 
http://fsinapsi.altervista.org

 Come conviene fare? Voglio dire, come sarebbe piu' utile?
Il problema è che se estrai un sottotitolo in Unicode, comunque è
inutilizzabile (almeno per il normale motivo per cui si estraggono gli
stream da un MKV, cioè adattarli ad un lettore standalone). A questo
punto conviene tentare una conversione in ANSI (o ISO-8859-1 se non hai
la possibilità di fare quella in ANSI) di tutte le entry e se non viene,
lasciare i punti di domanda.
Oppure, nel caso che qualcuno voglia i sottotitoli estratti per qualcosa
d'altro, lasciare una opzione che chieda se fare la conversione tutta in
ANSI (o ISO-8859-1) o in Unicode.
So che mettendo in mezzo un altro set di caratteri probabilmente non ho
fatto altro che andare "fuori tema", però volevo farti sapere cosa è
capitato a me. Spero sia stato di qualche aiuto.
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
Mi chiedi che provocazione ho avuto? / La forte antipatia del bene per
il male. - Alexander Pope

 Spero sia stato di qualche aiuto.
si', grazie


 si', grazie
Hai fatto felice un newbye della programmazione! ;)
-- 
Saluti, Kap - 
www.lordkap.it
 - ¥'s Fan #01 - 
www.pianetalibri.com
 - VCC
Raramente si migliora se non si ha altro modello da imitare che se
stessi. - Oliver Goldsmith

 Allora forse SubRip chiama ANSI quello che l'altro chiama ISO-8859-1?
non lo so, ma l'utility "iconv" li considera sinonimi. Forse quelle
estensioni specifiche dell'ANSI sono state aggiunte in seguito
Comunque ho deciso che mettero' una casellina spuntabile, quando si
estrae un sottotitolo, in modo da scegliere se lo si vuole lasciare
in utf-8 o convertirlo (per quanto possibile) nell'alfabeto latino
(utile per i lettori da tavolo)
ciao e grazie


 - quali simboli visualizza
ho fatto una prova al volo, e ho messo qui il risultato:
http://fsinapsi.altervista.org/tmp/charset.zip
dentro quello zip (149,237 bytes) ci sono due file:
- prova.jpg
- prova.srt
Chiedo scusa per la bassa qualita' dell'immagine (ho fretta),
ma spero che si riescano a vedere ugualmente i simboli.
Ora spiego brevemente cosa ho fatto: innanzitutto ho scritto
le due righe di programma necessarie a generare "prova.srt".
Poi ho preso un pezzetto di film (un segmento AVI/divx di circa
1 minuto e qualche secondo), salvato come "prova.avi", ho messo
i due file su un riscrivibile e dato in pasto al lettore
stand-alone (nortek110), quindi ho riacquisito il filmato (con
i sottotitoli impressi dal lettore), poi ho scritto due righe
di codice necessarie per estrarre dal filmato riacquisito le
56 porzioni di immagini contenenti i caratteri impressi dal
lettore; il risultato lo potete vedere nella immagine
"prova.jpg".
Come si puo' notare, il mio lettore non visualizza tutti i
simboli del charset (nemmeno di iso-8859-1, ne' tantomeno
di "Microsoft ANSI"), non mostra nemmeno il simbolo dell'euro.
Pero' mostra tutte le lettere accentate e vari altri simboli.
Immagino che abbiano fatto cio' per risparmiare spazio...
Tutto sommato non e' una cattiva soluzione: un lettore non
potrebbe supportare una codifica come utf-8...
