Hogyan ripeltem először DVD-t?

Az úgy kezdődött, hogy a feleségem kapott karácsonyra pár DVD-t, lejátszónk pedig nincs, de mégis inkább szerettük volna tévén megnézni, mint gépen. Nemrég kaptam egy 64GB-os pendrive-ot, és megörültem neki, hogy a finnyás tévénk hajlandó volt beolvasni. Nincs semmiféle torrent accountom, így gondoltam, mi lenne, ha életemben először olyan formátumra hoznék pár DVD-t (köztük a feleségem új filmjeit), amit az ilyen tekintetben is válogatós tévénk le tudna játszani?

Pár hónapja ismerkedtem meg az ffmpeg-gel, amikor azt a feladatot kaptam, hogy a semmiféle ezirányú szoftver- és hardvertámogatással nem rendelkező analóg kamerákra épülő biztonsági rendszerünk néhány steamjét távoli meghajtóra mentsem. A kizárólag IE alatt működő ActiveX alapú kamerakliensek kommunikációjának wireshark-os elemzése után ffmpeg-ből, ffplay-ből,tcpdump-ból és bbe-ből összegányoltam egy olyan kis shell scriptet, ami képes a kameraképek megjelenítésére és folyamatos rögzítésére. Ezen tapasztalatok nyomán úgy gondoltam, hogy ha az ffmpeg nem lesz képes kiripelni a DVD-ket, akkor semmi. Egy kis guglizás után az alábbi módszerhez folyamodtam:

1. KDE-ből (természetesen renszergazdai jog nélkül) felmountoltam a DVD-n található UDF fájlrendszert. Ugyanez persze megtehető .ISO fájlokkal is loop eszközök segítségével, de ahhoz az én rendszeremen (OpenSUSE 13.2) rendszergazdai jog kellett.

2. Egy kis mplayeres nézegetés után kiválogattam, hogy a DVD VIDEO_TS könyvtárából mely .VOB fájlok mely video és audio sávját (természetesen a magyart!) akarom kinyerni, majd elő lépésként .AVI-ba konvertáltam, mondjuk így:

cat *[1-9].VOB | ffmpeg -i - -map 0:1 -map 0:3 -vcodec libx264 -acodec aac ~/Videók/legalstuff.avi

Pár filmnél a szinkron mellé kiegészítő feliratokra is szükség volt. Ezt is ki lehet nyerni a DVD-n levő .VOB fájlokból, de ott grafikus formában vannak, amit karakterfelismerésnek kell alávetni, amivel nem bajlódtam, hanem letöltöttem a szöveges formátumú (.SRT) feliratokat, és ezeket kombináltam össze az .AVI fájlokkkal .MKV fájlokká, amelyeket a tévénk feliratostól együtt kiválóan le tud játszani. Sajnos azonban azzal szembesültem, hogy a fellelhető .SRT fájlok némelyik nincs szinkronban a DVD-ről kinyert filmanyaggal, mert pl. más FPS-en lejátszott verzióhoz való. Mivel teljesen ismeretlen volt számomra ez az egész témakör, nem tudtam róla, hogy létezik a .SRT fájlok időbeli problémáinak korrigálására szolgáló eszköz, ezért egyik éjszaka írtam rá egy shell szkriptet, ami a végleges formájában a következőképpen néz ki:

#!/bin/bash
# $1 : Name of .srt file to manipulate
# $2 : Desired time to start displaying the first subtitle
# $3 : Desired time to start displaying the last subtitle

srt2msec ()
{
 date --utc "--date=1970-01-01 $1" +%s%N | sed s/000000$//
}

msec2srt ()
{
 SEC="$(echo $1 | sed -r 's/(^[[:digit:]]*)([[:digit:]]{3}$)/\1,\2/')"
 date --utc "--date=@$SEC" +%H:%M:%S,%N | sed s/000000$//
}

if echo $2 | egrep -q '^[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}$'
then
 FIRST=$2
 FIRST=$(srt2msec $FIRST)
else
 echo '$2 (start time of first subtitle) must be in HH:MM:SS,MSC format'
 exit
fi

if echo $3 | egrep -q '^[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}$'
then
 LAST=$3
 LAST=$(srt2msec $LAST)
else
 echo '$3 (start time of last subtitle) must be in HH:MM:SS,MSC format'
 exit
fi

DIFF=$(( $LAST - $FIRST ))

dos2unix $1

OLDFIRST="$(egrep '^[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}[[:space:]]+-->[[:space:]]+[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}$' $1 | head --lines=1 | sed -r 's/[[:space:]]+.*$//')"
OLDLAST="$(egrep '^[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}[[:space:]]+-->[[:space:]]+[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}$' $1 | tail --lines=1 | sed -r 's/[[:space:]]+.*$//')"
OLDFIRST=$(srt2msec $OLDFIRST)
OLDLAST=$(srt2msec $OLDLAST)
OLDDIFF=$(( $OLDLAST - $OLDFIRST ))

cat $1 | while read LINE
do
 if echo $LINE | egrep -q '^[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}[[:space:]]+-->[[:space:]]+[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}$'
 then
  FROM="$(echo $LINE | sed -r 's/[[:space:]]+.*$//')"
  TO="$(echo $LINE | sed -r 's/^.*[[:space:]]+//')"
  FROM=$(srt2msec $FROM)
  TO=$(srt2msec $TO)
  (( FROM -= OLDFIRST )) ; (( FROM *= DIFF )) ; (( FROM /= OLDDIFF )) ; (( FROM += FIRST ))
  (( TO -= OLDFIRST )) ; (( TO *= DIFF )) ; (( TO /= OLDDIFF )) ; (( TO += FIRST ))
  FROM=$(msec2srt $FROM)
  TO=$(msec2srt $TO)
  echo "$FROM --> $TO"
 else
  echo $LINE
 fi
done > /tmp/subrip.$$

cat /tmp/subrip.$$ > $1 ; rm /tmp/subrip.$$

unix2dos $1

3. Miután ez minden hibája ellenére működöképesnek bizonyult, kezelésbe vettem az .SRT fájlokat, majd nekiláttam a végleges .MKV fájlok létrehozásának a következő módon:

ffmpeg -i legalstuff.avi -i legalstuff.srt -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s subrip legalstuff.mkv

4. Igen ám, de az így elkészült .MKV fájlokat érvénytelen formátumúnak látta az újabb képtelen igényekkel előálló tévékészülék. Rájöttem, hogy valamilyen metainformációkat hordozó tagek feldolgozásába törik bele a bicskája, ezért ezeket az mkvpropedit programmal eltávolítottam, másokat pedig hozzáadtam így:

mkvpropedit legalstuff.mkv --tags all:
mkvpropedit legalstuff.mkv --edit track:v1 --set language=hun --edit track:a1 --set language=hun --edit track:s1 --set language=hun --set flag-default=1 --set flag-forced=1

A hozzáadott metainformációk közül a forced flag a legfontosabb, mert ez utasítja a lejátszót arra, hogy mindenképpen (kézi beavatkozás nélkül) jelenítse meg a feliratot.

5. Azt tapasztaltam, hogy az ffmpeg bizonyos verziói nem hajlandóak .AVI és .MKV között közvetlen könverziót végezni, de egy köztes .MP4 lépcsőfok beiktatása áthidalja a problémát. A kölönböző formátumú videofájlok közötti konverziónál "copy" típusú audio- és videokodeket használtam, így ezek a feldolgozási műveletek negyon gyorsan, kis CPU-terhelés mellett, és információvesztés nélkül mentek le, nem úgy mint a kezdeti .VOB -> .AVI átalakításnál.

Olyan is előfordult, hogy egy .SRT fájlt meggondolatlanul letöröltem miután beolvasztottam egy videóba, később mégis módosítani akartam rajta, úgyhogy vissza kellett nyernem, de az ffmpeg ezt is könnyedén megoldja, amíg szöveges feliratkodekkel integráljuk a videóba:

ffmpeg -i legalstuff.mp4 -c:s srt legalstuff.srt

Hozzászólások

A mai világban, amikor (nagyon) olcsó a konzumer HDD tárhely, én biztos nem állnék neki MPEG2 videókat (DVD) átkonvertálni DIVX/XVID/MP4/H.264/bármiegyéb formátumba azért, hogy kisebb legyen. Az újratömörítéssel legalább még kidobsz egy keveset a DVD-k (mai, HD-hez szokott szemmel nézve) alacsony minőségéből.

Én valószínűleg simán leszedném az egész korongot ISO-ba, aztán azt manapság szinte minden lejátssza, tokkal-vonóval-menükkel-feliratokkal együtt, mintha az eredeti korongról nyomnád.

Persze, ha .srt-t akarsz alárakni, megy egyéb csoda igények vannak, akkor hajrá.

Minek az AVI konténer köztes fázis? Mehet VOB-ból egyből MKV-be. A transzkódolás közben hozzácsaphatod a feliratot is.

A TV az oka mindennek. Nem minden háttértárral működik együtt, és nem játszik le iso-t. Nem úgy, mint a vlc, amit már használtam iso nézésre, de hát más a zajos, kis kijelzős notebook, mint a TV.

Az avi fázis a felirat beigazítása miatt van, mert ha melléteszek egy ugyanolyan nevű srt fájl, a legtöbb lejátszó kérdés nélkül együtt játssza le őket. Persze lehet, hogy mkv-val is menne, de ugyananyi erőforrást használ a mkv+srt->mkv konverzió mint az avi+srt->mkv, szóval mindegy.

Az a helyzet, hogy én pont ezt a feladatot akartam megcsinálni, de az átkódolásmentes átalakításnál folyton beleütköztem abba, hogy eltorzult a kép. Valami képarány paraméter beállítását nem nagyon akaródzott eltalálnom, hogy mennyi is az annyi. Itt volt róla szó, de nem jutottam eredményre. Viszont változatlanul érdekel.
(Annyi változott csak azóta, hogy úgy tűnik a TV-m ugyan szereti az MKV-t, de a benne levő SubRip formátumú sub+idx feliratot nem annyira, így a fenti "leszedem hozzá az srt-t" megoldás praktikusan jobb. Persze az is lehet, hogy valamit elkeféltem a teszteknél.)

Már várom a 2024. januári "Hogyan ripeltem először BluRay-t?" blogposztot! ;D

Nincs olyan eszközöm, ami BD-t tudna olvasni, és ha valaha lesz is, a blueray már rég elavultnak fog számítani. Talán majd akkor vetemedek ilyesmire, ha már feledésbe merülnek az optikai lemezek :-) Pl. nemrég egy ilyen lemezről kellett: adatokat kimentenem: http://www.maxoptix.com/230mb/

Biztos jó játék, és érdekes kihívás - ám erre vannak ám régóta működő kész megoldások is, mint:
- mplayer/mencoder (CLI)
- handbrake (GUI)

Ha ezeket ismered, de valamiért mégsem tudják azt amit te akartál - a hozzászólásomat nyugodtan ignoráld :)

--
zrubi.hu

Vajon legálisnak számít letölteni warezből az anyagot, amivel egyébként jogtisztán rendelkezel? Lehet ez lett volna a legegyszerűbb megoldás. Egyébként ahogy fentebb is írták, Handbrake kell neked.

Alternatív megoldásként még az jutott eszembe, hogy a gépet is ráköthetted volna a tévére. Persze nem minden esetben oldható meg az sem.

Én azt gondolnám, hogy igen. Csakhogy az a helyzet, hogy ez az egész filmezősdi annyira kívül esik a látókörömön, hogy nics semmiféle torrent accountom (vagy hogy hívják ezeket). Egész életemben nem torrenteztem többet, mint ahány DVD-t beripeltem, és akkor is főleg Linux telepítőkészleteket szedtem le.

Amúgy az első gondolat nálam is a gép és a TV összekötése volt, de a gépem - nem tudom, hogy a saját hibájából vagy a Linuxéból - nem ad ki hangot a HDMI kimenetén, a VGA + analóg hang kombót meg a tévé nem hajlandó értelmezni. De még ha el is hárulnának ezek az akadályok, akkor is maradna a gép zúgása, amit nem akarok hallgatni.

A gépzúgás problémáját megértem. Ha mégis egyszer rákötnéd, a hang beállításoknál külön át kell billenteni a kimenetet hdmi-re, nem tudom probáltad-e ezt már. Csak attól, hogy rádugod nem fog átváltani. Persze ettől még lehet, hogy nem működik, de próbacseresznye :)

Egyébként ha ennyire DVD-sek vagytok szerintem érdemes beruházni egy lejátszóra. Bár egy HD tévéhez már akkor legalább egy bluray lejátszót javasolnék, vannak olcsóér' is.

Ha egyszer már RIP-eltél, - egy egyébként általad megvásárolt, - DVD-t, akkor már a szerzői jogsértés elkövetve. Innentől akár torrent-ezheted is. Ti.: a DVD másolásvédelmének megtörése nélkül, nem fogod tudni, másolni és lejátszani. (Erre ugyan vannak megfelelő, de jogsértést(!) megvalósító programok.) - Ha egy adott filmet, mindenáron meg akarsz nézni, egyszerűen elkerülhetetlen időnként, a szerzői joggal való "ujjathúzás". (Egyébként persze értem, - hogy elsősorban a "szakmai" megvalósítás mikéntje izgatott...)

Azt hittem, biztonsági másolatot szabad készíteni :-( Ráadásul nem is voltam tudatában annak, hogy másolásvédett a DVD. Ezt úgy kell értelmezni, hogy titkosított a videóanyag? Jól gondolom, hogy a libdvdcss 2 az, ami visszafejti a titkosítást? Csak azért kérdezem, mert nem látom az ffmpeg függőségei között, az ffmpegről pedig úgy tudtam mostanáig, hogy nem tudja visszafejteni a titkosított DVD-ket.

Vajon legálisnak számít letölteni warezből az anyagot, amivel egyébként jogtisztán rendelkezel?

Elvileg akkor is legális, ha nem rendelkezel vele jogtisztán (legalábbis kép- és hanganyagnál), ezért fizeted az Artisjus matricát a háttértárakra. A probléma azzal van, hogy míg a letöltés legális, a feltöltés/megosztás nem, viszont a torrent alkalmazások ez utóbbit is megvalósítják.

Egyébként ez talán már változott, a mostani állás az, hogy ha nincs közvetett haszonszerzés sem, akkor feltölteni is lehet. A csapda ott van elrejtve, hogy ez csak bizonyos értékhatárig van így, amit elég hamar el lehet érni.
A másolásvédelem megkerülése is problémás, illetve egy-egy anyag jogainak tulajdonosa polgári peres úton azért követelheti az elmaradt bevételét.

milyen tv-tek van?

--
"nem tárgyszerűen nézem a dolgot, hanem a vádló szerepéből. Sok bosszúságot okoztak, örülnék ha megbüntetnék őket - tudom gyarló dolog, de hát nem vagyok tökéletes." (BehringerZoltan)

Én emlékeim szerint egyetlen egy dvd-t ripeltem xvid -be, mégpedig az Indul a bakterház -at, eredeti lemezről. Az akkori UHU Linuxban volt egy acidrip (és mögötte mplayer, mencoder (?)) és szó nélkül megcsinálta, 1 gombot kellett megnyomni.

--
arch,debian,openelec,android

> Pár hónapja ismerkedtem meg az ffmpeg-gel, amikor azt a feladatot kaptam, hogy a semmiféle ezirányú szoftver- és
> hardvertámogatással nem rendelkező analóg kamerákra épülő biztonsági rendszerünk néhány steamjét távoli meghajtóra
> mentsem. A kizárólag IE alatt működő ActiveX alapú kamerakliensek kommunikációjának wireshark-os elemzése után
> ffmpeg-ből, ffplay-ből,tcpdump-ból és bbe-ből összegányoltam egy olyan kis shell scriptet, ami képes a kameraképek
> megjelenítésére és folyamatos rögzítésére.

Bocsánat! Ez engem jobban érdekel(ne). Lesz róla cikk? :)

Megírnám a Hogyan ripeltem utoljára DVD-t? bejegyzést, de már nem emlékszem.

:)

Ja, még annyi, hogy volt ennek a szkriptnek egy korábbi, kevésbé átgondolt változata. Ezt máshogy kellett paraméterezni, és kicsit mást is csinált. Íme:


#!/bin/bash
# $1 : Az időeltolásnak alávetendő .srt fájl neve
# $2 : Hány ezredmásodperccel kell eltolni a feliratokat (negatív is lehet).
# n/m alakban nem abszolút eltolást, hanem a felirat folyam időben megnyújtását írja elő.
# $3 : Az első eltolandó felirat sorszáma
# $4 : Az utolsó eltolandó felirat sorszáma

srt2msec ()
{
date --utc "--date=1970-01-01 $1" +%s%N | sed s/000000$//
}

msec2srt ()
{
SEC="$(echo $1 | sed -r 's/(^[[:digit:]]*)([[:digit:]]{3}$)/\1,\2/')"
date --utc "--date=@$SEC" +%H:%M:%S,%N | sed s/000000$//
}

FIRST=$3 ; (( FIRST += 0 ))
LAST=$4 ; (( LAST += 0 ))
(( FIRST > LAST )) || (( LAST == 0 ))&& LAST=4294967296

STRETCH=0
if echo $2 | egrep -q '^[[:digit:]]+/[[:digit:]]+$'
then
STRETCH=1
MUL="$(echo $2 | sed 's/\/.*$//')"
DIV="$(echo $2 | sed 's/^.*\///')"
else
ADD=$2 ; (( ADD += 0 ))
fi

dos2unix $1

cat $1 | while read LINE
do
echo $LINE | egrep -q '^[[:digit:]]+$' && CURR=$LINE
if (( CURR >= FIRST)) && (( CURR <=LAST )) &:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}[[:space:]]+-->[[:space:]]+[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2},[[:digit:]]{3}$' ; }
then
FROM="$(echo $LINE | sed -r 's/[[:space:]]+.*$//')"
TO="$(echo $LINE | sed -r 's/^.*[[:space:]]+//')"
FROM=$(srt2msec $FROM)
TO=$(srt2msec $TO)
if (( STRETCH == 1 ))
then
(( FROM*=MUL )) ; (( FROM/=DIV ))
(( TO*=MUL )) ; (( TO/=DIV ))
else
(( FROM+=ADD ))
(( TO+=ADD ))
fi
FROM=$(msec2srt $FROM)
TO=$(msec2srt $TO)
echo "$FROM --> $TO"
else
echo $LINE
fi
done > /tmp/subrip.$$

cat /tmp/subrip.$$ > $1 ; rm /tmp/subrip.$$

unix2dos $1