Linux SVCD HOWTO

1. Introduzione

Nascita dei Video-CD.

Standard più evoluto rappresentato dai Super-Video-CD.

L'avvento dei DVD sembra aver soppiantato questi standard, ma è davvero così?

Caratteristiche tecniche dei (Super) Video CD

VCD:
video: formato MPEG1 a 1150 kbit/s a bitrate fisso;
audio: 1 canale audio MPEG1 Layer 2 a 224 kbit/sec 44100 Hz mono, stereo o bicanale.

Caratteristiche del video:

  • NTSC: frame 352x240 pixel, 30 frame per secondo (29.970 per la precisione)
  • NTSC film: frame 352x240 pixel, 24 frame per secondo (23.970 per la precisione)
  • PAL: frame 352x288 pixel, 25 frame per secondo.

SVCD:
video: formato MPEG2 fino a 2600 kbit/s a bitrate variabile;
audio: MPEG Layer 2 da 32 a 384 kbit/s, 44100 Hz, due tracce stereo o quattro mono.

Caratteristiche del video :

  • NTSC: frame 480x480 pixel, 30 frame per secondo (29.970 per la precisione);
  • NTSC film: frame 480x480 pixel, 24 frame per secondo (23.970 per la precisione);
  • PAL: frame 480x576 pixel, 25 frame per secondo.

Inoltre lo standard SVCD consente la presenza di immagini statiche (still images) che possono essere usate, tra l'altro, per produrre dei menu di navigazione.

Nota: Un'immagine sul PC di 640x480 pixel corrisponde, in formato PAL a un'immagine di 704x576 pixel,

640x480 r = 1,333 (4:3) 704x576 r = 1.222 (11:9)

2. Software utile

Quelli strettamente necessari per seguire il presente HOWTO, però, sono solamente cdrdao, vcdimager e ffmpeg. Se si vogliono creare dei menu, servono anche netpbm e mjpegtools.

Tutti questi software sono Open-Source e la maggior parte di essi è già inclusa in tutte le distribuzioni GNU/Linux più diffuse.

Nota: il programma devede permette di creare, oltre a DVD anche VCD/SVCD, ma per questi ultimi non permette di sfruttare alcune caratteristiche come ad esempio la creazione di menu.


3. Copia 1:1 di (Super) Video CD

$ vcdxrip -C /dev/cdrom -p -o videocd.xml

Questo comando crea i file .mpg corrispondenti alle tracce video ed un file XML che ordina i contenuti. Ora non resta che creare i file .cue e .bin (quest'ultimo contiene l'immagine vera e propria). Per farlo, basta dare il comando:

$ vcdxbuild -c videocd.cue videocd.xml

Per masterizzare l'immagine ottenuta, è possibile usare cdrdao:

$ cdrdao write -v 2 --driver generic-mmc --speed 12 \
  --device /dev/cdrom --eject videocd.cue

4. Produzione di (S)VCD

Conversione audio/video

Supponiamo di partire da un filmato in AVI (il che vuol dire che può essere stato compresso con un'infinità di codec diversi). Il nostro primo passo sarà riuscire a convertire audio e video nel corretto formato MPEG.

In generale il comando transcode si occupa di questo.

$ transcode -i movie.avi -V -y mpeg2enc,mp2enc -F4,"-M 2" -B 0,15,16 \
  -E 44100 -b 128 -u 20,2 -o mpegout
# non funziona, controllare opzioni!

che produce, separatamente, i file mpegout.m2v e mpegout.mpa contenenti rispettivamente la traccia video e quella audio. Poi basta unirli in un unico file mediante il comando mplex:

$ mplex -f 4 -S 680 -o result.mpg mpegout.m2v mpegout.mpa

dove l'opzione -f 4 indica il formato SVCD. Se invece si vuole ottenere un VCD standard, bisogna utilizzare -f 1. Vedi la seguente tabella:

Opzione -f num di mjpegtools
num:   formato corrispondente:
0 MPEG-1
1 VCD
2 VCD con bitrate non standard
3 MPEG-2
4 SVCD
5 SVCD con bitrate non standard  
6 VCD still stream
7 SVCD still stream
8 DVD (*)
9 DVD (*)

(*) Formati non completamente supportati: meglio usare dvdauthor.

In realtà lo strumento più efficace e più facile da usare per il nostro scopo è ffmpeg.

Il semplice comando:

$ ffmpeg -i movie.avi -target svcd movie.mpg

è più che sufficiente per ottenere il filmato nel formato voluto.

Nota: può essere necessario aggiungere l'opzione: -aspect 4:3.

Se si vuole tagliare il filmato, basta usare l'opzione -c di transcode; ad esempio:

$ transcode -i movie.avi ... -c 273-28176 -o ...

dove i numeri corrispondono al frame iniziale e a quello finale da considerare.

NOTA: esiste un metodo alternativo che non sfrutta il codec mpeg2enc direttamente da transcode ma spezza la conversione in più passi mediante due fifo. Il seguente esempio mostra come procedere per ottenere un VCD:

[1]$ mkfifo videofifo
[1]$ mkfifo videofifo.mpa
[1]$ transcode -i movie.avi -V -y yuv4mpeg,mpeg -b 224 -Z 352x288 \
  -o videofifo -k -C 2 # non funziona: da sistemare opzioni -V/-y
[2]$ cat videofifo.mpa > clip1.mpa
[3]$ cat videofifo | mpeg2enc -f 1 -n p -o clip1.m1v

In questo caso -b 224 (il bitrate audio) è fisso e non può essere cambiato. L'opzione -n p sta ad indicare il formato PAL.

Poi, analogamente a prima, si unisce la traccia video con quella audio in un unico file:

$ mplex -f 1 -o result.mpg clip1.m1v clip1.mpa

Esempio analogo, ma per ottenere un video di qualità SVCD:

[1]$ mkfifo videofifo
[1]$ transcode -i movie.avi -V -y yuv4mpeg,mpeg -b 224 -Z 480x576 \
-o videofifo -k -C 2 # non funziona: da sistemare opzioni -V/-y
[2]$ cat videofifo | mpeg2enc -f 4 -n p -o clip1.m2v
[3]$ mplex -f 1 -o result.mpg clip1.m2v videofifo.mpa

dove l'opzione -b specifica il bitrate audio e può andare da 32 a 384 (comunque 224 è più che suff).

Menu

In realtà il menu non è altro che un particolare filmato in cui l'immagine risulta statica (still image).

Se si vuole creare un proprio menu, dunque, bisogna usare un qualche programma di grafica (ad esempio Gimp).

Partendo da un'immagine in formato JPEG, conviene innanzitutto trasformare questa in PNG (se la si è creata con Gimp conviene salvarla direttamente in questo formato).

Ottenuta l'immagine PNG, bisogna dare il comando:

$ pngtopnm test.png | pnmscale --width 480 --height 576 | \
  ppmntsc --pal | ppmtoy4m -v 0 -F 25:1 -S 420mpeg2 | \
  mpeg2enc -v 0 -f 7 -a 2 -n p -T 110 -o test.m2v

oppure per avere una risoluzione maggiore:

$ pngtopnm test.png | pnmscale --width 704 --height 576 | \
  ppmntsc --pal | ppmtoy4m -v 0 -F 25:1 -S 420mpeg2 | \
  mpeg2enc -v 0 -f 7 -a 2 -n p -T 120 -o test.m2v

Nota: l'opzione -a 2 nell'ultimo comando sta ad indicare un rapporto larghezza/altezza di 4:3. L'opzione -T num, invece, indica la dimensione in kilobyte dell'immagine compressa così ottenuta.

Opzione -a num
Opzione:   Rapporto:  
-a 1 1:1
-a 2 4:3
-a 3 16:9
-a 4 2.21:1

Infine si ottiene lo pseudo-video in formato MPEG mediante il comando:

$ mplex -f 7 -o test.mpg test.m2v

Nota: per maggiori informazioni sulle conversioni tra vari formati video, vedi la guida: multimedia.html.

File XML

Nel caso più semplice il file videocd.xml viene creato automaticamente mediante il comando:

$ vcdxgen track1.mpeg track2.mpeg ...

Se si è creato un menu:

SEGMENT: contiene immagini fisse/menu PBC: PlayBack Control

Prima si può ottenere un file XML provvisorio con un comando del tipo:

$ vcdxgen -t svcd --broken-svcd-mode --add-dir=/SEGMENT \
  --update-scan-offsets --volume-count=2 --volume-number=0 \
  --iso-volume-label=TEST track01.mpg track02.mpg …

Nota: a me sembra funzionare solo senza le prime 2 opzioni (--broken... e --add-dir...) e aggiungendo poi a mano la sezione segment col menu nel file .xml [vedi templates/esempio_videocd.xml]

Infine bisogna modificare opportunamente il file XML inserendoci il menu. Ecco un esempio nel seguente file: videocd.xml.

PBC

Per ciascuna traccia video, compreso il menu, è possibile associare ad alcuni tasti del telecomando delle particolari azioni, corrispondenti a dei precisi tag nel file .xml:

Associazione di particolari azioni ai tasti del telecomando
Tasto:  tag assegnato:
->playdefault
>>forwardnext
<<previous  prev
[]stopreturn
0…9numeric

Dunque

Fuori standard

Oppure:

$ vcdimager -t svcd --broken-svcd-mode --add-dir=/SEGMENT result.mpg

Preparazione dell'immagine da masterizzare

Ora bisogna creare l'immagine del (S)VCD vero e proprio.

Se si è saltata la creazione di un file XML personalizzato e si vuole ottenere un SVCD standard, partendo direttamente dai file MPEG, allora il comando è:

$ vcdimager -t svcd /path/MyDirectory/MyMPEGFile.mpg

Oppure, se invece è stato creato un file videocd.xml personalizzato:

$ vcdxbuild videocd.xml

In entrambi i casi, i comandi creano due file: l'immagine da masterizzare è nel file videocd.bin, mentre il file videocd.cue contiene le informazioni da fornire al software di masterizzazione.

Masterizzazione

Avete l'immagine da masterizzare in videocd.bin e le informazioni necessarie in videocd.cue. Ora non resta che masterizzare.

Con le vecchie versioni di kernel/software etc, i comandi da dare erano i seguenti:

$ cdrecord -scanbus

Visualizzato il dispositivo corrispondente al masterizzatore,

$ cdrdao write -v 2 --device 1,2,0 --driver generic-mmc \
  --speed 6 --eject videocd.cue

Questo perché cdrdao riconosceva i device con ...

Tuttavia nelle distribuzioni più recenti, l'opzione da passare a cdrdao è il device corrispondente al masterizzatore. Supponiamo ad esempio che sia /dev/cdrom (può anche essere un link al vero device). In questo caso basta dare il seguente comando:

$ cdrdao write -v 2 --device /dev/cdrom --driver generic-mmc \
  --speed 6 --eject videocd.cue


Warning: Impossibile caricare signature.html