2008-07-06

DVD9 para DVD5: Coisas que podem dar errado

No processo de converter DVD9 em DVD5, algumas coisas podem não funcionar direito. Eis uma lista de problemas encontrados e como resolvê-los:

  • Um arquivo de áudio (AC3) está corrompido: O arquivo no formato AC3 é composto por uma série de frames que começam com os bytes [0b 77]. Às vezes, é necessário eliminar o lixo que aparece antes do primeiro frame. Para isso, deve-se determinar a posição do primeiro byte válido (o primeiro 0b seguido por 77 do primeiro frame) e eliminar o que vem antes. Uma maneira é:
    inicial=`hexdump -e "\"%_ad \" 1/1 \"%02x\n\"" ARQ.ac3 \
    | awk '/ 77$/ {if (OK==1) print $1}; {OK=0}; / 0b$/ {OK=1}' \
    | head -1`
    tail -c +$inicial ARQ.ac3 >arqtemp.ac3
    mv arqtemp.ac3 ARQ.ac3
  • As legendas estão transparentes: às vezes os arquivos PNG contendo as legendas podem estar com o texto semi-transparente. Neste caso, é necessário converter cada um dos PNGs, eliminando a transparência do texto (mas não do fundo):
    for i in DIR/sub*.png; do
    convert $i -channel Alpha -level 99%,100% arqtemp.png
    mv arqtemp.png $i
    done
  • Preciso eliminar uma parte do video: Às vezes, pode ser desejável eliminar parte de uma trilha. Essa parte pode estar no início, meio ou fim. Segue a seqüência de passos necessária para eliminar um pedaço no início:
    1. Extrair os canais (vídeo, áudio e legendas)
    2. Eliminar os primeiros DELTA segundos do canal de vídeo:
      ffmpeg -i ARQ.m2v -ss DELTA -vcodec copy arqtemp.m2v
      mv arqtemp.m2v ARQ.m2v
    3. Eliminar os primeiros DELTA segundos dos canais de áudio:
      ffmpeg -i ARQ.ac3 -ss DELTA -acodec copy arqtemp.ac3
      mv arqtemp.ac3 ARQ.ac3
    4. Modificar o tempo das legendas em DIR/sub.xml:
      delta=DELTA
      cat DIR/sub.xml | perl -e '
      while (<stdin>) {
      if (!/start=.*end=/) {
      print($_);
      } else {
      $s = $_;
      $s =~ s/.* start="([0-9:.]*)".*/$1/;
      @s = split(/:/, $s);
      $s = $s[0] * 3600 + $s[1] * 60 + $s[2] - '$delta';
      $s = sprintf("%02d:%02d:%05.2f", $s / 3600,
      ($s % 3600) / 60, 0.0 + $s - int($s / 60) * 60);
      $e = $_;
      $e =~ s/.* end="([0-9:.]*)".*/$1/;
      @e = split(/:/, $e);
      $e = $e[0] * 3600 + $e[1] * 60 + $e[2] - '$delta';
      $e = sprintf("%02d:%02d:%05.2f", $e / 3600,
      ($e % 3600) / 60, 0.0 + $e - int($e / 60) * 60);
      $l = $_;
      $l =~ s/start="[0-9:.]*"/start="$s"/;
      $l =~ s/end="[0-9:.]*"/end="$e"/;
      print ($l);
      }
      }' \
      >arqtemp.xml
      mv arqtemp.xml DIR/sub.xml
    5. Modificar o tempo dos capítulos em dvd.xml.

  • As cores da legenda estão erradas: O problema é na definição de cores do arquivo palette.rgb. Para gerar um arquivo que produza legendas com as cores certas, deve-se primeiro gerar um com as cores erradas, identificar a posição de cada cor e depois substituir a cor no arquivo palette.rgb pela cor correta:
    1. Gerar um arquivo palette.rgb com o seguinte conteúdo:
      ff0000
      ff8000
      ffc000
      ffff00
      c0ff00
      00ff00
      00ffc0
      00ffff
      00c0ff
      0080ff
      0000ff
      8000ff
      c000ff
      ff00ff
      ff00c0
      ff0080
    2. Extrair as legendas de um canal da forma usual:
      mkdir -p tNsS
      spuunmux -o tNsS/sub -s S -p palette.rgb tN.mpg
    3. Abrir um dos arquivos PNG gerados (por exemplo, tNsS/sub00000.png) e verificar a cor das letras, do contorno e, se houver, dos pontos de transição entre as letras e o contorno.
    4. Substituir o arquivo palette.rgb por um que tenha as seguintes cores:
      • ffc000 no lugar da cor das letras
      • 000000 no lugar da cor do contorno das letras
      • 806000 no lugar da cor dos pontos de transição entre as letras e o contorno, se houver
      • 00ff00 em todas as outras posições
    5. Extrair as legendas de todos os canais desejados normalmente.
    6. Abrir um dos novos arquivos PNG gerados (por exemplo, tNsS/sub00000.png) e verificar se as cores estão corretas. Se não estiverem, alguma coisa foi feita errada (ver também observação sobre legendas transparentes).

2008-07-05

Passos para reduzir DVD9 para DVD5

Obs: A informação aqui postada não deve ser utilizada para fazer cópias não autorizadas de material protegido.

Para criar uma imagem ISO que caiba em 4.7GB a partir de uma imagem ISO maior, pode-se proceder da seguinte forma:

  1. Decidir quais trilhas do DVD devem ser copiadas e, para cada uma delas, quais canais de áudio e quais canais de legenda e em qual ordem (por exemplo: audio 1 em inglês, audio 2 em português; legenda 1 em português, legenda 2 em inglês). Defina também a lista de capítulos de cada trilha. Alguns programas para auxiliar na decisão:
    lsdvd -x ARQ.iso
    tcprobe -i ARQ.iso -T N -H 100
  2. Extrair as trilhas selecionadas da imagem ISO para arquivos MPEG:
    tccat -i ARQ.iso -t dvd -T N,-1 -L >tN.mpg
  3. Extrair o canal de vídeo de cada trilha:
    tcextract -i tN.mpg -x mpeg2 -t vob >tN.m2v
  4. Extrair os canais de áudio de cada trilha:
    tcextract -i tN.mpg -x ac3 -t vob -a A >tNaA.ac3
  5. Criar um arquivo de paleta para extrair as legendas. Um que geralmente funciona é:
    cat >palette.rgb <<EOF
    000000
    000000
    ffc000
    808080
    808080
    808080
    808080
    808080
    806000
    ffc000
    808080
    808080
    808080
    ffc000
    000000
    808080
    EOF
  6. Extrair as legendas (subtítulos) de cada trilha para arquivos PNG dentro de um subdiretório:
    mkdir -p tNsS
    spuunmux -o tNsS/sub -s S -p palette.rgb tN.mpg
  7. Se necessário, reduzir o bitrate β dos canais de áudio (β=192 parece adequado):
    ffmpeg -v 0 -y -i tNaA.ac3 -f ac3 -acodec ac3 -ab βk nNaA.ac3
  8. Calcular o fator de redução Φ necessário para os canais de vídeo:

    Φ = ΣVi / (4500000000 - ΣAij - ΣSijk)

    onde:

    Vi = Tamanho do arquivo do canal de vídeo (m2v) da trilha i.
    Aij = Tamanho do arquivo do canal de áudio (ac3) j da trilha i (depois de reduzir o bitrate).
    Sijk = Tamanho do arquivo (png) k das legendas j da trilha i.

  9. Se o fator de redução for maior que 1, reduzir o tamanho dos canais de vídeo:
    tcrequant -f Φ -d 0 -i tN.m2v -o nN.m2v
  10. Para cada trilha, determinar o deslocamento Δ em segundos entre o canal de vídeo e os canais de áudio, usando a informação gerada por:
    tcprobe -i tN.mpg
    O deslocamento será:

    Δ = PTSv - PTSa

    onde:

    PTSv = PTS do canal de vídeo
    PTSa = PTS dos canais de áudio (devem ser aproximadamente iguais)

  11. Combinar o canal de vídeo e os canais de áudio (0, 1, etc.) de cada título:
    mplex -f 8 -S 0 -o nN.mpg -O Δs nN.m2v nNa0.ac3 nNa1.ac3 ...
  12. Adicionar cada canal de legendas (0, 1, etc.) a cada título:
    mv nN.mpg xN.mpg
    spumux -m dvd -s 0 tNs0/sub.xml <xN.mpg >nN.mpg
    mv nN.mpg xN.mpg
    spumux -m dvd -s 1 tNs1/sub.xml <xN.mpg >nN.mpg
    ...
  13. Obter a informação necessária sobre o vídeo para o arquivo XML (formato, aspecto, widescreen, resolução) de uma das seguintes formas:
    tcprobe -i ARQ.iso -T N 2>&1 | grep video
    tcprobe -i nN.mpg 2>&1
  14. Criar um arquivo XML contendo a descrição de como deve ser gerado o DVD. O exemplo abaixo gera uma estrutura de DVD no diretório DIR. Ao iniciar, são selecionados o primeiro canal de áudio (inglês) e o primeiro canal de legenda (português), e a primeira trilha inicia automaticamente. O vídeo está em formato NTSC 16:9 (quando visto em 4:3, coloca barras horizontais) e resolução 720x480. Há dois canais de áudio (inglês e português) e dois canais de legenda (português e inglês). Há três trilhas, armazenadas nos arquivos n1.mpg, n2.mpg e n3.mpg, com capítulos a cada meia hora (na primeira trilha) ou a cada 10 minutos (nas demais). Ao terminar uma trilha, a próxima inicia automaticamente, voltando ao início no final.
    <dvdauthor dest="DIR">
    <vmgm>
    <fpc>{ audio=0; subtitle=64; jump title 1; }</fpc>
    </vmgm>
    <titleset>
    <titles>
    <video format="ntsc" aspect="16:9" widescreen="nopanscan" resolution="720x480" />
    <audio lang="en" />
    <audio lang="pt" />
    <subpicture lang="pt" />
    <subpicture lang="en" />
    <pgc>
    <vob file="n1.mpg" chapters="00:00:00.000,00:30:00.000,01:00:00.000,01:30:00.000" />
    <post>jump title 2;</post>
    </pgc>
    <pgc>
    <vob file="n2.mpg" chapters="00:00:00.000,00:10:00.000,00:20:00.000" />
    <post>jump title 3;</post>
    </pgc>
    <pgc>
    <vob file="n3.mpg" chapters="00:00:00.000,00:10:00.000,00:20:00.000,00:30:00.000" />
    <post>jump title 1;</post>
    </pgc></titles>
    </titleset>
    </dvdauthor>
  15. Criar a estrutura de DVD usando o arquivo XML acima:
    dvdauthor -x dvd.xml
  16. Criar a nova imagem ISO do DVD (usar o título de lsdvd ou definir um novo):
    genisoimage -dvd-video -V "TITULO" -o ARQNOVO.iso DIR/