Youtube MP4 videók hangjának kinyerése

Hátha valakinek segítek vele:

Már elég régóta kerestem a megoldást arra, hogy a DownloadHelper és hasonló Firefox puginekkel Youtube-ról leszedhető videók hangját valahogy értelmes formátumban ki tudjam szedni.

A kézenfekvő megoldás ez lenne:


mplayer -dumpaudio cuc.mp4

Igen ám, csakhogy ez egy "raw" AAC fájlt eredményez, ami elveszti a keretezési információt, így VLC-n kívül kb semmi nem képes lejátszani. Az Audacious mp4 plugin például keményre fagy tőle. Dekódolni lehet faad-vel, de ha ezt akarnám, akkor mplayerrel is megtehettem volna. A sokszor amúgy sem fényes minőségű, alacsony bitrátával tömörített hanganyagnál csak az hiányozna még, hogy utána még újra is kelljen tömöríteni...

Több helyen az mp4creator nevezetű tool-t emlegetik, ezért utánanéztem. Csomag Arch linux alá nincsen, sőt AUR-ban sincs PKGBUILD hozzá (ez utóbbi mondjuk meglepett), márpedig a kézzel fordított /usr/local alá installált és ezáltal praktikusan karbantarthatatlan telepítésekről szeretnék végérvényesen leszokni. Gondoltam csinálok hozzá egy PKGBUILD-et, ám a forrásfát jobban megnézve elment a kedvem tőle. A forrás copyright notice-okból világossá vált, hogy az mp4creator valójában nem más, mint a régi, már nem karbantartott MPEG4IP, más néven és más által továbbvitt forkja. A forrásfa gyakorlatilag az összes library forrását is tartalmazza egyben (inkluzíve olyan alap dolgokat is, mint getopt), ezt nyilván alaposan szét kéne szedni, hogy ne írja felül a rendszeren meglévő könyvtárakat. Ennek a feladatnak most nem igazán akartam nekifutni. A libmp4v2 például már eleve külön csomagban megvan és tartalmazza is a parancssori utility-k egy részét. De persze az mp4creator binárist nem, pedig pont az kellene. Nem kerültem sokkal közelebb, de legalább már értem, hogy miért nincs mp4creator csomag AUR-ban.

Szóba került még az MP4Box is, ami GPAC project néven található. Ez igéretesebb darab. Van is belőle csomag, sőt valami dependency miatt már alapból fenn is volt. A helpjéből kicsit nehéz kibányászni, hogy pontosan mit tud és hogyan kell használni, de szerencsére ennek van man oldala is (ellentétben libmp4v2-ben található obskurus utility-kkel).

Az első kisérletem ez volt:


MP4Box -raw 1 cuc.mp4 -out mak.aac

Itt arra számítottam, hogy ugyanazt a nyers AAC-t fogom kapni, mint az mplayer-es kisérletnél, de meglepő módon ez lejátszható volt! Viszont seekelni nem lehet benne, és nincs semmi metaadat tehát azért nem tökéletes.

Kicsit továbbolvasva itt az jó megoldás: több streames MP4 hordozófájlból egy stream átfejtése egy másik MP4 fájlba:


MP4Box -single 1 cuc.mp4 -out mak.mp4

És ez az mp4 már mindennel lejátszható, az Audacious simán megy vele, seekelni lehet benne.

A végére még egy esetleg fontos megjegyzés: honnan is tudom én azt, hogy az 1-es stream-et kell átfejteni? Eddig még minden fájlban az 1-es volt a hangsáv, de nem tudom, hogy kötelezően így van-e. Sőt akár több hangsáv is lehet. Az MP4Box -add segítségével adhatunk hozzá extra stream-eket egy meglévő mp4-hez. A már emlegetett libmp4v2 csomagban egy tool, amivel megnézhető, hogy melyik stream micsoda:


mp4info cuc.mp4

mp4info version 1.6
cuc.mp4:
Track   Type    Info
1       audio   MPEG-4 AAC LC, 53.661 secs, 129 kbps, 44100 Hz
2       video   H264 Baseline@1.1, 53.666 secs, 177 kbps, 320x234 @ 6.000075 fps

Hozzászólások

Van néhány észrevételem, az egyszerűség érdekében megszámoztam:

1: azért gondolom a raw aac dumpot az mplayer is vissza tudja játszani. :)
2: ma hár mplayer, akkor miért nem mencoderrel "szeded ki" a hangsávot? Én valahogy úgy csinálnám, hogy mencoder video.mp4 -oac copy -of lavf -lavfopts format=mp4 -o output.mp4 (Persze semmi nem garantálja, hogy ez így jó.) Sőt, vlc is át tudná kódolni aac-be, ha csak épp az volna kéznél.
3: mplayer és vlc is megmondja, hogy melyik stream mit tartalmaz.

1. azért gondolom a raw aac dumpot az mplayer is vissza tudja játszani.
Próbáld csak ki! :) Hint: ha -dumpaudio-val mented ki, akkor nincs ADTS header, anélkül pedig elvileg semmi nem tudná lejátszani. Az, hogy a VLC és a faad mégis tudja, az valami obskurus paraméter megtippelős heurisztikának köszönhető.
2. ma hár mplayer, akkor miért nem mencoderrel "szeded ki" a hangsávot?
Mert akkor valaki beírná kommentbe, hogy mennyivel egyszerűbb, ha az MP4Box-szal csinálom. :) N+1 féle variáció van, én ezt találtam meg.
3. mplayer és vlc is megmondja, hogy melyik stream mit tartalmaz.
Aha...
mplayer:


[lavf] Audio stream found, -aid 0
[lavf] Video stream found, -vid 1

mp4info:


Track	Type	Info
1	audio	MPEG-4 AAC LC, 225.071 secs, 125 kbps, 44100 Hz
2	video	H264 Baseline@1.1, 224.555 secs, 196 kbps, 320x240 @ 24.996103 f

(ugyanarról a fájlról van szó)
A gyanútlan user meg szépen kitépi a haját, mire rájön, hogy mi is a probléma.
---
Internet Memetikai Tanszék

Kicsit talán ágyúval verébre, de nekem bevált: avconvert script, minden sz@rt tud konvertálni.
ffmpeg-gel is megoldható, ha az átkódolás nem gond:
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
Értelemszerűen a kimeneti codec az amit akarsz a támogatottak közül. Egyes lame és ffmpeg verzióknál lehet gond, "lame: output buffer too small" hibával elszáll, ffmpeg frissítés vagy lame downgrade megoldja. Ja, és -acodec copy elvben kiszedi az aac streamet neked, nem teszteltem, hogy jó-e, csak hogy kiteszi-e, meg mplayer lejátssza-e -> lejátssza.
Nekem működik ez is, ha aac-t kell dumpolni (amarok, mplayer lejátsza, mással nem néztem):
faad -a output.aac infile.mp4

Utube. http://gtk-apps.org/content/show.php/UTube+Ripper?content=77198
Ubuntun használtam anno, lementette a youtube videót, lementette csak a hangot, és utána át is tudta kódolni.

És aur-ban ott van.

---------------------------------------------------------------------------------
A Linux nem ingyenes. Meg kell fizetni a tanulópénzt.
Az emberek 66 százaléka nem tud számolni! Gondoljatok bele, ez majdnem a fele!!

Ha firefoxot használsz akkor van egy plugin ami minden youtube videó leírásához beilleszt egy linket amivel letölthető mp3 formátumban a hang.
firefox addonok között a "youtube mp3" -ra ha rákeresel akkor megleled :)

ffmpeg -i akármi.mp4 -acodec copy akármi.aac

Ez nyers aac fájlt készít, amit nálam az Amarok és az MPlayer is lejátszik.

mp4creator -create akármi.aac akármi.m4a

Én Opensusét használok, ahhoz van rpm (Packman). Nem tudom, az ArchLinuxhoz miért nincs bináris.