Hlavní navigace

AVI 2 DVD pod Linuxem

5. 2. 2004
Doba čtení: 7 minut

Sdílet

Většina lidí spíše řeší opačný problém - tedy jak převést DVD do AVI. Nástrojů a postupů pro tento cíl je známo mnoho, z GUI frontendů pod Linuxem jmenujme např. DVD::RIP. Někoho ovšem může zajímat i opačná cesta.

Většina lidí spíše řeší opačný problém – tedy jak převést DVD do AVI. Nástrojů a postupů pro tento cíl je známo mnoho, z GUI frontendů pod Linuxem jmenujme např. DVD::RIP. Někoho ovšem může zajímat i opačná cesta, a to z různých důvodů. Jedním může být klesající cena DVD vypalovaček a médií, druhým pocit pohodlí při přehrávání filmu v klasickém stolním DVD přehrávači, třetím kompatibilita MPEG2 záznamu, čtvrtým jednoduchý způsob přehrávání netechnickými členy domácnosti.

Pro účely nejrůznějších konverzí a postupů lze využít multimediálních open source legend, jako jsou např. transcode, mjpegtools, ffmpeg, lame, xvid, mplayer + mencoder, cdrtools, dvd+rw-tools, xcdroast atd. Nejinak je tomu i v tomto případě. Následující stručný text je postupem, tedy mini-howto, chcete-li. Dozvíte se, jak pohodlně z AVI vyrobit DVD za použití několika z výše uvedených nástrojů.

Shrnutí vlastností uváděného postupu

Vstup: AVI soubor, frame rate 23.976 nebo 25 fps, TXT titulky
Výstup: PAL DVD, 720×576, frame rate 25 fps, stereo
Požadavky: Titulky nejlépe pod filmem, v „černé oblasti“. Možnost náhledu před spuštěním konverze. Skriptovatelnost postupu. Použití legálního software, přednostně open source.
Omezení: Popisovaný postup se nevypořádá s hodnotou fps 29.97 a neřeší multi-channel zvuk. Titulky nelze vypnout.

Většina AVI, se kterými se setkáte bude mít rozlišení menší než plné PAL-DVD (tedy pod 720×576), rozlišení nemusí být nutně v poměru použitelném pro jednoduché zvětšení (scale) do PAL rozlišení a hodnota fps (frames per second) nebývá vždy 25, velmi rozšířenou hodnotou je 23.976. Výstupem by měl být „full PAL-DVD MPEG2“ s fps = 25 a rozlišením 720×576, což v drtivé většině případů zaručí bezproblémové přehrání výsledku na hardwarovém stolním přehrávači.

Postup

Kroky postupu jsou v kostce následující:

0) Instalace potřebných multimediálních tools
1) výpočet koeficientů pro zvětšení rozlišení původního AVI (expand + scale), polohování titulků
2) náhled výsledku s vypočtenými koeficienty
3) renderování titulků do movie, expand+scale a vlastní převod do MPEG2 při zachování Audio/Video sync.
4) DVD authoring výsledného MPEG2 souboru
5) vytvoření DVD ISO image
6) vypálení DVD ISO image

Nyní detailněji:

0) Potřebné tools

  • mplayer (expand, scale, preview)
  • mjpegtools (MPEG2 encoding)
  • dvdauthor (DVD authoring)
  • mkisofs (mělo by být součástí vaší Linux distribuce)
  • dvd+rw-tools
  • alternativa k předchozímu: xcdroast+ cdrecord-prodvd (pokud chcete komfortní GUI pro DVD vypalování, xcdroast sám o sobě DVD pálit neumí, cdrecord-prodvd zajistí DVD vypalování a klíč pro použití v xcdroast je pro soukromé účely zdarma.

Poznámky – mnoho MPlayer znalých může přeskočit

MPlayer byl jako interpreter AVI zvolen z následujících důvodů:

  • je kompatibilní se širokou škálou kodeků, Linux nativních ale i jiných, pocházejících primárně ze světa Windows, včetně mnoha exotických. Stručně řečeno, pokud nainstalujete MPlayer kompletní, včetně binárních Windowskodeků, nebudete velice pravděpodobně nikdy řešit problém se čtením jakéhokoli AVI souboru.
  • umožňuje pohodlnou změnu rozlišení vstupního AVI a jednoduchou manipulaci s polohou titulků
  • umožňuje směrovat video výstup (včetně titulků) do pipe
  • transcode v našem postupu nepoužíváme, jeho command line interface neumožňuje (AFAIK) předání komplikovanějších command line parametrů do import MPlayer pluginu, vyřešil by jen patch transcode

1) Koeficienty – příklad

Mějme AVI s rozlišením WxH = 592×320 (rozlišení a další parametry AVI je možno zjistit z informací, které mplayer posílá na stdout). O kolik je nutno zvětšit (expand) H, aby při celkovém násobení (scale) na 720×576 zůstaly zachovány proporce?

Výpočet je jednoduchý:

720     W
--- = -----
576   H + E

z toho:

E = 0.8W - H

dosadíme rozlišení AVI:

E = 0.8 * 592 - 320

tedy

E = 153.6

Koeficient pro polohu titulků je proměnná, která určuje vertikální polohu titulků ve výsledném obraze – uvádí se v procentech, od 1 do 100, zde ji nazveme T. Hodnota T mezi 80 – 95 je většinou správná volba. Je nutno najít kompromis mezi nízkou hodnotou T, která způsobuje, že se titulky zobrazí „moc nahoře“ – t.j. částečně mimo černý prostor – tedy na aktérech filmu, a mezi hodnotou T=100, která většinou posune část titulků mimo viditelnou oblast vašeho televizoru.

2) Náhled

Pro náhled správnosti vypočtených konstant použijeme mplayer (detailní popis použitých command line parametrů mplayeru viz manuálové stránky tohoto programu), takto:

mplayer chickflick.avi \
        -sub chick-flick.sub \
        -vop scale=720:576,expand=-1:$E:-1:-1 \
        -subpos $T

tedy pro náš případ:

mplayer chickflick.avi \
        -sub chick-flick.sub \
        -vop scale=720:576,expand=-1:-153:-1:-1 \
        -subpos 84

kde:

  • chickflick.avi je název AVI zdrojového souboru
  • chickflick.sub je název souboru s TXT titulky
  • „-vop scale,expand“ zařadí za výstup z mplayeru filtry expand a scale v pořadí opačném, než je uvedeno v command line.
  • „-subpos“ pohybuje s titulky ve vertikálním směru

Poznámka: Černá plocha E se standardně rozloží na dvě části, symetricky nad a pod filmem. Pro jinou pozici prostudujte manpage mplayeru, klíčové slovo je expand.

3–5) Konverze

Pokud vše vypadá OK, je nyní cílem výstup MPlayeru převést v nezměněné podobě na DVD. Blokové schéma je následující:

MPLAYER
|
+-->YUV4MPEG_PIPE-->MPEG2ENC--+
|                             |
|                             v
|                           MPLEX-->DVDAUTHOR
|                             ^       |
|                             |        -> MKISOFS
+-->WAV-->MP2ENC--------------+              |
                                            -> burn DVD

(Pozn. editora: schémátko bylo původně hezčí a průzračnější, ale nevešlo by se na šířku.)

V command line schématu odpovídá následující sada příkazů:

$ mkfifo ./stream.yuv
  • vytvoří pojmenovanou pipe pro výstup z mplayeru
  • nutno dodržet název „stream.yuv“, je interně hardcoded v mplayeru
$ mplayer chickflick.avi \
          -sub chickflick.sub \
          -speed 25000/23976 \
          -autosync 30 \
          -benchmark \
          -noframedrop \
          -ao pcm \
          -aofile audio.wav \
          -vo yuv4mpeg \
          -vop scale=720:576,expand=-1:-153:-1:-1 \
          -subpos 84 &
  • spustí chickflick.avi
    • sub: použije chickflick.sub jako zdroj titulků
    • speed 25000/23976: zdrojové AVI je 23.976 fps, nutno provést konverzi na 25 fps
    • autosync 30: s hodnotou si lze hrát, pokud se objeví problémy s A/V sync, více manpage mplayeru
    • noframedrop: vždy uvádějte, mplayer by takto neměl zahazovat frames, i když čeká na zpracování výstupu
    • benchmark: vždy uvádějte, dů (odpozorováno ze zdrojového kódu transcode)
    • ao pcm: audio mezi-výstup bude PCM WAV
    • aofile pcm: audio mezi-výstup bude uožen v souboru audio.wav
    • vo yuv4mpeg: jako video výstup se použije pipe, název je pevný – „stream.yuv“
    • vop: vertikální expand o 153 pixelů a následný scale na full PAL DVD 720×576
    • subpos 84: poloha titulků ve výsledku je 84% z 576, měřeno shora obrazovky
  • & spustí na pozadí

Poznámky

  • parametr „-speed“ vynechejte, pokud je fps vstupního AVI 25
  • vliv parametru „-autosync“ je v mnoha případech sporný, default hodnota je 0, nutno experimentovat, manpage mplayeru nerozvádí příliš detailně, mnohé by (možná ;-) objasnila inspekce kódu. Diskuse kolem posledních (leden 2004 )CVS verzí mplayeru naznačuje, že A/V sync je stále živé téma.
  • hodnotu 23976 budete muset pužít v mnoha případech i tehdy, když MPlayer (na stdout) hlásí fps rovnající se 23.98. V opačném případě mohou nastat potíže s A/V sync (někdy označováno též jako „lipsync“ problem).
$ cat ./stream.yuv | mpeg2enc -n n -f 8 -I 0 -F 3 -o  ./video.m2v 
  • cat čte z pipe „živené“ mplayerem
  • posílá přes pipe do mpeg2enc
    • n n: bere zdrojové AVI jako NTSC, lze vynechat pokud AVI fps = 25
    • I 0: zdrojové AVI není interlaced
    • f 8: MPEG2 bitrate 7500kbps, jde o přednastavený DVD profil mpeg2enc
    • F 3: výsledný MPEG2 bude PAL, 25fps
    • o ./video.m2v: výsledná obrazová MPEG2 složka je uložena v ./video.m2v
  • může trvat několik hodin v závislosti na rychlosti CPU a délce filmu
$ cat audio.wav | mp2enc -r 48000 -s -o ./video.m2a
  • převede v průběhu konverze obrazu vyprodukovaný zvukovou stopu na MP2 stream
    • r 48000: vzorkovací frekvence MP2 je 48000 kHz, dodržujte, nebudete mít problémy s kompatibilitou
    • s: vždy stereo (force stereo)
    • o ./video.m2a: výsledná zvuková MPEG2 složka je uložena v ./video.m2a
  • může trvat několik desítek minut, v závislosti na rychlosti CPU a délce filmu
$ mplex -f 8 -o video.mpg video.m2v video.m2a
  • smíchá MPEG2 audio a video do výsledného MPEG2 souboru, použitelného pro DVD authoring
    • f 8: přednastavený DVD formát
    • o ./video.mpg: výsledný MPEG2 bude ./video.mpg
$ mkdir ./dvd
  • vytvoříme si adresář pro DVD strukturu
$ dvdauthor -o ./dvd -c 0,05:00,10:00,15:00,20:00,
25:00,30:00,35:00,40:00,45:00,50:00,55:00,1:00:00,
1:05:00,1:10:00,1:15:00,1:20:00,1:25:00,1:30:00,
1:35:00,1:40:00,1:45:00,1:50:00,2:00:00,2:05:00,
2:10:00,2:15:00,2:20:00,2:25:00,2:30:00,2:35:00,
2:40:00,2:45:00,2:50:00,2:55:00,3:00:00 video.mpg

$ dvdauthor -T -o ./dvd
    • o ./dvd: v adresáři ./dvd vytvoří podadresáře VIDEO_TS a AUDIO_TS. Ve VIDEO_TS se pak vytvoří VOB a IFO soubory – tedy struktura jakou najdete na filmovém DVD.
    • c 0,05:00,10:00…: vytvoří kapitoly po 5 minutách
  • video.mpg: DVD struktura je vytvořena ze zdrojového video.mpg (naše zkonvertované AVI)
    • T: vytvoří se DVD TOC
$ mkisofs -dvd-video -o ./video.iso ./dvd
    • dvd-video: vytvoří se ISO image s movie-DVD kompatibilním fyzickým rozložením na výsledném médiu. Hardwarové přehrávače očekávají jednotlivé VOB soubory v pevném fyzickém pořadí.
    • o ./video.iso: výsledný ISO soubor bude ./video.iso, možno vypálit přímo na DVD v jakémkoli vypalovacím SW
  • ./dvd: adresář s naší výslednou DVD strukturou

6) Mimo rámec tohoto příspěvku, doporučuji navštívit stránky xcdroast, pokud jste pod Linuxem ještě CD/DVD nepálili.

Závěrem

Výše popsaný postup je možné automatizovat – vložit do skriptu – a definovat vstupní parametry převodu. Cílem takového skriptu by mohla být autodetekce některých parametrů (rozlišení AVI, hodnota fps, výpočet hodnoty E apod.). Uvedeným způsobem není možné docílit vypínatelných titulků, titulky jsou renderovány přímo do filmu. Vypínatelné titulky je možno získat převodem textových do binární podoby (proměnit text v obrázky) a pak daleko sofistikovanějším použitím commandline toolu dvdauthor vytvořit binární VOBSUB soubory: pokud se někdo vydáte touto cestou a podaří se vám ji zautomatizovat, určitě se podělte o postup ;-)

Reference

Mimo manpages a homepages výše uvedených nástrojů určitě stojí za navštívení:

www.tappin.me­.uk/Linux/dvd­.html
mightylegends­.zapto.org/dvd/dvdau­thor_howto.php

Byl pro vás článek přínosný?