Creando (S)VCD

Introducción

Este proyecto nace por la repetición de Cha-Cha_cha en I-Sat. Como tengo una placa para ver TV (capturadora), una grabadora de CDs y un reproductor de DVD (VCD y SVCD) externo para mi TV de 29', me dije, por que en vez de grabarlo en VHS que pierde calidad si puedo grabarlo en (S)VCD y hasta me sale mas barato ($1 el CD a $3 el cassette? ni idea, hace mucho que no compro... :). Bueno, pase por varios problemas y fui encontrando sus soluciones y como soy bueno me dije: "Por qué no escribir un documento y ahorrarle dolores de cabeza a otra gente de esta maravillosa comunidad?"

Software

Los programas que utilizo no son ni muchos ni pocos: Hay otros programas que pueden resultar útiles, pero yo no los he usado.

Aclaración básica

Bien, para empezar, tengan en cuenta que para capturar una hora de video con NuppelVideo (nuvrec) con buena calidad y una resolución de 352x288@25Hz (PAL) se necesita alrededor de entre 2GB - 3GB. La captura de video para SVCD (480x576@25Hz PAL) de una hora de duración llega a los 4GB con las opciones por defecto de calidad (que es lo suficientemente buena como para no necesitar más). Es por esto que tener un buen pedazo del disco duro libre es fundamental.

Breve introducción al VCD/SVCD

El (Super) Video CD es un disco compacto con ciertas caraterísticas especiales pero que en escencia contiene video en formato MPEG. Este tipo de video es anterior al DVD pero puede ser leido practicamente por cualquier lectora de DVD en el mercado, lo que nos permite capturar y guardar video con calidad digital (= copiarlo cuantas veces quieras sin perder calidad) a bajo costo y con la posibilidad de verlo en cualquier reproductor de DVD con un televisor común y corriente.

En la actualidad hay 3 formatos estandarizados: Video CD 1.1 (VCD 1.1), Video CD 2.0 (VCD 2.0) y Super Video CD 1.0 (SVCD 1.0).

VCD 1.1

Está compuesto por hasta 98 tracks de MPEG I o Audio CD. Cada MPEG está compuesto por un stream de audio y uno de video. Además puede tener hasta 500 Entry Points. Los entry points sirven para dividir un track en Capítulos. El stream de audio debe ser MPEG I Layer II, de 224Kbps, 44.1Hz y con un canal estéreo o dos canales mono. El stream de video debe ser MPEG I de como máximo 1152Kbps, pero de flujo constante. Para que funcione de forma correcta en reproductores externos (como un DVD) es necesario que tenga GOPs (Group Of Pictures) y una cabecera de secuencia por cada GOP. Esto permite que los reproductores puedan avanzar y retroceder correctamente y en caso de tener Capítulos, poder pasar de uno a otro sin problemas (un entry point puede empezar sólo en donde empieza un sequence header de un GOP). El video multiplexado debe tener tener un flujo de bits constante de 174300 bytes (1394400 bits) por segundo. Esto permite dos resoluciones:

VCD 2.0

Es igual que el VCD 1.1 pero con las siguientes mejoras: Al agregar soporte para PAL, se agrego la siguiente resolución: Los SPI soportan los siguientes formatos: También es posible tener audio sobre imágenes estáticas. El flujo de datos del video multiplezado no debe superar los 174300 bytes por segundo para que funcione en lectoras de simple velocidad.

SVCD 1.0

Lo más importante del SVCD es que pasa de MPEG I de flujo constante -CBR- a MPEG II de flujo variable -VBR- (al igual que el DVD). Además se agregaron las siguientes mejoras al VCD 2.0: El Super Video CD soporta sólo dos resoluciones para video y para imágenes estáticas (de baja resolución): Resoluciones superiores pueden llegar a usarse pero resultaria en un SVCD que no se ajusta a las especificaciones.

Captura

De aquí en más, siempre que diga 'VCD', me voy a referir a VCD 2.0.Como he dicho, este no es el objetivo principal de este documento, por lo que será explicado brevemente.

Inicialización de la placa de TV

Esto es tan simple como levantar el xawtv, elegir el canal, la norma, el brillo y el resto de las cosas como a uno más le guste. Luego de que este todo lindo, cerramos el xawtv

Captura de video

La captura de video se realiza con el comando nuvrec del programa NuppelVideo. Hay algunas cosas que hay que especificar. Las opciones de nuvrec son:

nuvrec [opciones] archivo (sin extension!)

   -W n .......... Ancho [352 PAL, 352 NTSC] para VCD
   -H n .......... Alto  [288 PAL, 240 NTSC] para VCD
   -t min ........ Tiempo (si no se especifica, captura hasta recibir un Ctrl-C)
   -S n .......... Entrada de la placa (0 Televison) [0]
   -V dev ........ Dispositivo de video [/dev/video0]
   -A dev ........ Dispositivo de audio [/dev/dsp]
   -a n .......... Volumen (de placa bttv)
   -p ............ PAL [default] 
   -n ............ NTSC
   -s ............ SECAM

Para mas opciones use 'nuvrec -h'. Una llamada clásica para capturar video para pasar a VCD en PAL seria:

nuvrec -a65535 -t1 captura_vcd

Esto produce una salida como la siguiente:

copied=0 buf=51 f#=1495 ratio=7.38 lzor=1.02 effdsp=4413969

Donde copied indica la cantidad de frames copiados (que no pudieron ser capturados). Esta es supuestamente una de las mejores características del nuvrec, al parecer permite capturar en PC lentas (al menos creo que eso dicen).
f# es la cantidad de frames capturados en total.
ratio es el nivel de compresión que se alcanzo (depende de las opciones de calidad de captura, yo siempre uso las defaults) y del video que estemos capturando (mucho o poco movimiento, colores, etc). Esto indica que tan grande sera el archivo capturado.
El resto no sé bien que es, excepto el ultimo que sé que tiene que ver con el audio.
Esto genera un archivo 'captura_vcd.nuv' luego de capturar video durante 1 minuto. En mi caso el tamaño del archivo resulto 39MB.
Para capturar video para pasar a SVCD se puede hacer lo siguiente:

nuvrec -a65535 -t1 -W480 -H576 captura_svcd

Esto produce también una salida similar:

copied=0 buf=45 f#=1495 ratio=6.48 lzor=1.03 effdsp=4413837

y un archivo 'captura_svcd' de 77MB para 1 minuto de captura.
Si el audio de la placa de TV queda abierto se puede usar un comando del programa xawtv para cerrarlo:

v4lctl volume 0

Edición y reproducción del video capturado

Para esto están las utilidades de NuppelVideo nuvedit y nuvplay respectivamente. Ambas utilidades son experimentales por lo que pueden no funcinar del todo bien. Por ejemplo con nuvplay no me funciona el audio. Lo más interesante es el nuvedit. Es una utilidad gráfica y se invoca de la siguiente forma:

nuvedit vcd.nuv

Luego de esto se abren 2 ventanas, una del nuvplay en la que se visualiza el video y otra con controles clásicos de reproducción, avance, etc, incluyendo dos botones para edición: Mark y Kram. Estos sirven para marcar el inicio y fin (respectivamente) de una escena que querramos sacar del video capturado por medio del botón Cut. Lo que hace este programa es muy simple: crea un archivo de texto llamado vcd.nuv.edit que contiene en cada linea el principio y el fin de cada escena a cortar, medido en frames. El nuvedit es solo una ayuda gráfica para crear este archivo.

Ejemplo:

archivo: svcd.nuv.edit
--------------
1543 2320
20223 23449
--------------

Un archivo como este quitaría de nuestro video svcd.nuv los frames que van desde el 1543 hasta el 2320 y los que van del 20223 al 23449. Esto es muy útil para sacar publicidades (o escenas que nos son de nuestro agrado) de los videos antes de comprimirlos y ahorrar tiempo. El archivo .nuv.edit es interpretado luego por las utilidades para comprimir el audio y video a MPEG (o divx, pero este no es nuestro caso).

Acerca de los scripts de NuppelVideo

El NuppelVideo trae dos scripts para convertir un video .nuv a MPEG: nuv2vbr y nuv2mpg.
El nuv2vbr NO SIRVE para hacer un video compatible con VCD y mucho menos con SVCD. El script nuv2mpg se autoproclama compatible con VCD, pero no tiene la opción -s del mpeg2enc, lo que resulta en un VCD que no puede adelantar o atrasar el video en cualquier reproductor ni saltar de un capítulo a otro.
Recomiendo que modifiquen estos scripts o que creen los suyos (en caso de querer un video compatible con SVCD) para que tengan la opción -s.

Compresión el video

Esta etapa se divide en 3, pero el NuppelVideo trae un par de scripts para hacerlo en un solo paso. De todas maneras, aca vamos a ver lo pasos por separados.

1. Compresión del audio

Este paso se hace con el nuvplay (parte del NuppelVideo) y el toolame. Acá solamente voy a dar los comandos para VCD y SVCD. Para mas información sobre las opciones de toolame: man toolame
VCD:

nuvplay -e | toolame -s 44.1 -b 224 -p 2 -m s /dev/stdin vcd.mp2

-s 44.1 - Frecuencia de 44.1Hz
-b 224 - Bitrate de 224Kbps
-m s - Modo Stereo
-p 2 - Modelo acustico 2
Para tener un stream de audio compatible con VCD, deben usarse estas opciones.

SVCD:
Es igual que para VCD, solo que el Bitrate puede estar entre 32Kbps y 320Kbps. También puede ser de bitrate variable (-v n), pero por lo poco que probé, no está funcionando muy bien. No se puede controlar el bitrate... siempre me da un bitrate aproximado de 192Kbps.

2. Compresión del video

Para este paso se utilizan el exportvideo y el mpeg2enc de MJPEG Tools. VCD:

exportvideo vcd.nuv "|mpeg2enc -b 1152 -G 24 -g 15 -N -s -o vcd.m1v"

-b 1152 - especifica 1152 kbps de bitrate
-N - Filtrado de ruido (experimental)
-G 24 - máximo un GOP cada 24 frames
-g 15 - mínimo un GOP cada 15 frames
-s - Incluye una cabecera de secuencia (sequence header) por cada GOP
Para tener un stream de video compatible con VCD, deben usarse estas opciones.
Las ultimas 3 opciones pueden incrementar el tamaño del archivo un poco pero son necesarias para asegurarnos de que anden bien los entry points (capítulos) y el rewind y fastforward en todos los reproductores.

SVCD:

exportvideo svcd.nuv "|mpeg2enc -m 2 -s -b 1600 -q 1 -G 24 -g 15 -2 1 -4 1 -N -V 400 -F 3 -o svcd.m2v" (1)

Las opciones significan lo mismo que para VCD. Se suman las siguientes opciones:
-m 2 - Comprime en MPEG II
-q 1 - Especifica la mejor calidad para VBR
-2 1 - Mejora la calidad de bloques pequeños (tarda más en comprimir)
-4 1 - Mejora la calidad de bloques medianos (tarda más en comprimir)
-V 400 - Buffer del video comprimido (en KB). Puede ser más grande dependiendo del reproductor
-F 3 - Opción sólo para MPEG II. Salida progresiva. Creo que mejora la calidad
A diferencia del VCD, el bitrate es variable y puede ir desde 1152 kbps a 2500 kbps... Esto es un poco más de una hora y media hora de video respectivamente. a 1600 kbps entra aproximadamente una hora de video y audio en un CD de 650MB.

NOTA: El formato de SVCD todavía no lo probe muy bien, por lo que pude funcionar mal. TIP: El programa exportvideo transforma el archivo .nuv en un stream YUV4MPEG compatible con las utilidades de las MJPEG Tools, por lo que se pueden utilizar para manipular el video antes de comprimirlo. Por ejemplo, si necesitamos capturar un video y luego pasarlo a varios formatos (digamos VCD, SVCD y DVD), podemos capturarlo con nuvrec a alta resolución: 720x576@50Hz, DVD PAL (1) y luego utilizar el comando yuvscaler para pasarlo a resolucioes inferiores. Ejemplo:

nuvrec -a65535 -W720 -H576 dvd

exportvideo vcd.nuv "|yuvscaler -O VCD | mpeg2enc -b 1152 -G 24 -g 15 -N -s -o vcd.m1v"

para pasarlo a VCD.
Mucho no pude experimentar con esto asi que no se hasta donde funciona bien (tuve problemas al tratar de convertir a SVCD).
También es útil el exportvideo para pasar video directamente a DivX, OpenDivX o DivX4 utilizando el transcode con el filtro de entrada para yuv4mpeg.

2.5 Concatenación de streams MPEG

Suele pasar (al menos a mi me pasa) que el nuvrec divida el video capturado en archivos de 2GB (cuando el fs y el kernel soportan archivos mayores). Si pasa esto, hay que repetir el proceso de compresión de audio y video para cada "pedazo" de la captura y concatenar los streams resultantes para que sean un solo stream completo (tanto el de audio como el de video). Para esto uso el comando mpeg3cat de la libmpeg3. Nos permite hacer justamente esto. Por ejemplo para el stream de video podemos hacer lo siguiente:

mpeg3cat -o vcd_completo.m1v vcd.m1v vcd-1.m1v

Para unir los streams de audio se puede hacer de la misma forma con:

mpeg3cat -o vcd_completo.mp2 vcd.mp2 vcd-1.mp2

Si no nos interesa mantener los "pedazos" de captura, ya estamos en condiciones de borrarlos y quedarnos solo con los streams "completos" para ahorra espacio.

3. Multiplexación

En este proceso se juntan ambos streams (audio y video) para formar una secuencia completa. Para este paso se utilizan el mplex de MJPEG Tools.
VCD:

mplex -f 1 -o vcd.mpg vcd.m1v vcd.mp2

-f 1 - Especifica que se está multiplexando un video compatible con VCD.

SVCD:

mplex -f 4 -o vcd.mpg vcd.m2v vcd.mp2

-f 4 - Especifica que se está multiplexando un video compatible con SVCD.

4. Resumen

En este punto ya tenemos nuestro video MPEG compatible con (S)VCD listo. Ahora podemos borrar el archivo .nuv en caso de necesitar espacio. Si somos desconfiados podemos verlo en el mplayer o cualquier otro reproductor de MPEG.
Ahora nos tenemos que encargar de hacer la imagen del (S)VCD para tostar.

Creación de la imágen de (S)VCD para tostar

Para esto esta la forma fácil y la forma divertida.

Forma fácil

Si tienen una versión anterior a la 0.7 del VCDImager, esta es la unica forma de crear la imagen.
Es muuuy recomendado usar una versión 0.7 o superior

Para crear una imagen simple basta con:

vcdimager -l VCD -c vcd.cue -b vcd.bin vcd.mpg

Por defecto crea una imagen de VCD 2.0. Para crear una imagen de SVCD:

vcdimager -l SVCD -c svcd.cue -b svcd.bin -t svcd svcd.mpg

Donde:
-l SVCD es el nombre de la imagen ISO.
-c es el nombre del descriptor de contenidos para el cdrdao (si no se especifica usa videocd.cue).
-b es el nombre de la imagen binaria a tostar con el cdrdao (si no se especifica usa videocd.bin).
-t svcd indica que la imagen a crear es SVCD.

Si tuviera mas tracks, bastaria con agregarlos despues de (s)vcd.mpg.

Forma divertida

La forma divertida sólo puede hacerse con una version de VCDImager igual o superior a 0.7. A partir de esta version se incluyen utilidades para generar, leer e interpretar archivos XML con la descripcion del (S)VCD. Estas utilidades son más que completas.
La forma más simple de empezar es con vcdxgen.

vcdxgen

Tiene un formato muy similar al vcdimager:

vcdxgen -l VCD -o vcd.xml vcd.mpg

para VCD y:

vcdxgen -l SVCD -o vcd.xml -t svcd svcd.mpg

para SVCD. Donde:
-l SVCD es el nombre de la imagen ISO.
-o es el nombre del archivo XML en el que se guardara la descripcion basica del (S)VCD.
-t svcd indica que la imagen a crear es SVCD.

Todo lo que hace esto es generar un template básico de (S)VCD con un PBC también básico.

Edición del descriptor XML

Esta es en realidad la parte divertida. Es en este archivo donde se encuentra toda la estructura del Video CD. Su formato es bastante intuitivo para el uso básico. Explicar todo su funcionamiento escapa de este proyecto, al menos por ahora, por lo que solo voy a comentar algunas cosas útiles pero siempre dentro de las funciones básicas del PBC.

Creación de capítulos (entry points)

La creación de capítulos es una de las cosas más interesantes del VCD (al menos para mí, que lo hago para grabar Cha Cha Cha que esta dividido en sketches :). Para devidirlo es tan simple como agregar lo siguiente a el (los) sequence item(s):

<entry id="entry-id">segs</entry>

Donde el id es un identificador para referise este capítulo desde el PBC (es decir, ya sea desde un menú o desde el botón >> del reproductor).
segs es donde empieza el capítulo en segundos (y puede ser una fracción).
De utilizarse entry points en una sequencia, es una buena idea agregar un default entry point. Sería el primer capitulo (el que empieza en tiempo 0). También se puede hacer con un entry point común con segs=0. Realmente no sé cual es la diferencia (si es que la hay, según el manual de VCDImager el default entry point debe existir, pero mi experiencia dice lo contrario, aunque mi experiencia se basa en SOLO un reproductor).
Veamos un ejemplo concreto:

  <sequence-items>
    <sequence-item src="test.mpg" id="sequence-00">
      <!-- Auspicios -->
      <default-entry id="entry-001"/>
      <!-- Introducción -->
      <entry id="entry-002">5.0</entry>
      <!-- Apertura: Marcha del Dr. Vaporeso -->
      <entry id="entry-003">7.0</entry>
      <!-- Comercial: Broches "La Perla" -->
      <entry id="entry-004">10.8</entry>
      </sequence-item>
  </sequence-items>

Bien, con esto basta para tener capítulos con un reproductor de VCD que soporte capítulos. Si el reproductor no soporta capítulos pero sí PBC, nos queda la opción de hacer una playlist con el PBC, pero esto no tiene mucho sentido a menos que hagamos un menú, porque de otra forma no podemos cambiar de capitulo de forma arbitraria, aunque si se podria cambiar de capitulo con los botones de avance y retroceso del reproductor.

Creación de Playlists

Las playlists se explican prácticamente por sí solas:

  <pbc>
    <playlist id="lid-001">
      <prev ref="lid-001"/>
      <next ref="lid-002"/>
      <return ref="lid-end"/>
      <wait>0</wait>
      <autowait>0</autowait>
      <play-item ref="entry-001"/>
    </playlist>
    <playlist id="lid-002">
      <prev ref="lid-001"/>
      <next ref="lid-003"/>
      <return ref="lid-end"/>
      <wait>0</wait>
      <autowait>0</autowait>
      <play-item ref="entry-002"/>
    </playlist>
    <playlist id="lid-003">
      <prev ref="lid-002"/>
      <next ref="lid-004"/>
      <return ref="lid-end"/>
      <wait>0</wait>
      <autowait>0</autowait>
      <play-item ref="entry-003"/>
    </playlist>
    <playlist id="lid-004">
      <prev ref="lid-003"/>
      <next ref="lid-end"/>
      <return ref="lid-end"/>
      <wait>0</wait>
      <autowait>0</autowait>
      <play-item ref="entry-004"/>
    </playlist>
    <endlist id="lid-end" rejected="true"/>
  </pbc>

Vamos a explicar brevemente esto: cada elemento playlist representa un elemento que se puede ver. Cada uno de estos elementos responde a ciertas teclas:

En este caso no se esta mapeando el default.

Aspectos avanzados

Hay varias cosas más avanzadas que todavía no termino de investigar. Entre ellas está el uso de imágenes estáticas y selecciones. En estos dos elementos se basan los menúes interactivos, aunque también se pueden hacer menúes animados con un video.
Para que no aparezcan reproducibles si el reproductor no es capaz de interpretar el PBC, generalmente estos elementos se especifican como segmentos en vez de sequencias, ya que los segmentos se guardan en la parte de la imagen ISO del VCD y no como un track. Ademas obviamente se usan como segmentos por la gran flexibilidad de estos.
Mi principal problema ahora es ver como encodear imagenes estaticas en un MPEG. El resto creo que es bastante intuitivo y se puede aprender fácil con la gran y excelente documentación del VCDImager y con los ejemplos disponibles.

Creación de la imágen binaria

La creación de la imágen binaria a partir de la descripción XML se hace con la utilidad vcdxbuild del VCDImager:

vcdxbuild -c vcd.cue -b vcd.bin vcd.xml

Donde:
-c es el nombre del descriptor de contenidos para el cdrdao (si no se especifica usa videocd.cue).
-b es el nombre de la imagen binaria a tostar con el cdrdao (si no se especifica usa videocd.bin).

Otras utilidades

Como dije antes, el VCDImager es un paquete muy completo y tiene otras utilidades: Para aprender más sobre ellas, lea las páginas de manual. Son muy sencillas e intuitivas de usar.

Grabando la imágen al CD

Esto es tan simple como utilizar el siguiente comando del cdrdao:

cdrdao write --device 0,0,0 vcd.cue

Obviamente es necesario reemplazar el dispositivo en donde esta su grabadora (que debe tener activada la emulacion SCSI en caso de ser IDE).

Más Información

Hay varios lugares en donde encontrar más información al respecto. Como primera medida (y como algo casi indispensable) recomiendo leer el manual del VCDImager. Las páginas de manual del resto de los programas también es bueno tenerlas en cuenta. Otros links útiles son los siguientes: Si alguien tiene más información al respecto, por favor contactenme via e-mail a [email protected].

Más Información

Las siguientes personas colaboraron con el documentos (ya sea con información o haciendo correcciones):
  1. Sergio del Rio <delrio at arrakis dot es>
El número indica dónde aportó o corrigió (aparece el mismo número entre paréntesis donde lo hizo).
Hosted by www.Geocities.ws

1