Convertire DVD per vederli sul Nintendo DS

Per la sempre maggiore gioia di NoKo, ieri ho deciso che volevo assolutamente vedere il video di It’s no good sul mio Nintendo DS.

Intanto, com’è possibile fare ciò, se il DS non ha uno slot per schede di memoria? Serve una cosiddetta Flashcart (in realtà in modo un po’ improprio), ossia una cartuccia in cui si inserisce una SD o simile, che permette poi di lanciare sul DS i programmi e giochi che si trovano su questa. Ce ne sono diversi modelli in giro: in particolare io ho una SuperCard Lite, che monta schede MicroSD/TransFlash.

Trovata una flashcart, serve un qualche media player. No problem: per DS c’è il buon Moonshell (LOL! Mentre scrivo questo hanno appena rilasciato una nuova versione :D), di cui, fra l’altro, sono disponibili i sorgenti completi.

Ora viene il difficile: infatti, mentre per quanto riguarda l’audio, Moonshell riproduce file OGG e MP3, per i video il programmatore si è inventato un formato tutto suo, che ha chiamato nDs-mPeG, per gli amici DPG. Si tratta in sostanza di video MPEG-1 e audio MPEG-2, rinchiusi in un container (che in realtà è un semplice header) assolutamente non standard che ha il seguente formato:

The header is 36 bytes. (Note: all of the numbers below are hexadecimal.)
44 50 47 30 (this stands for DPG0 in ASCII)
Four bytes for the number of frames in the video
00 00 00 00
Two bytes for the frames per second that the video runs
00 00
Four bytes for the audio sample rate
00 00 00 00
00 00 00 00 (this was the number of audio channels, now deprecated in favor of MP2 audio)
24 00 00 00 (this is the start of the audio file, i.e. right after the header)
Four bytes for the length, in bytes, of the audio
Four bytes for the above length + 36 bytes (i.e. the start of the video file)
Four bytes for the length, in bytes, of the video

Di nuovo, chi è interessato a vedere come concilare tutto ciò col solito ffmpeg, legga l’articolo intero! :)

Il primo passo consiste ovviamente nel rippaggio del DVD, di cui ho già parlato nel precedente articolo, e che quindi non ritratterò :). Dirò solo che il video proviene dal DVD del Best of Depeche mode uscito da poco.

Passiamo direttamente alla transcodifica: purtroppo ffmpeg non supporta questo strano container, quindi dovremo creare gli stream a parte e poi integrarli con l’header. È ora il caso di dire che molti hanno lamentato problemi di compatibilità di Moonshell con gli stream creati da ffmpeg, e consigliano di usare Mencoder, un programma simile a ffmpeg, addirittura creato dallo stesso team (e, in effetti, mi sfugge la necessità di avere 2 programmi diversi). Io non ne ho assolutamente avuti, forse perché nel frattempo Moonshell si è evoluto, e per questo presento il mio procedimento.

Data la fighezza di ffmpeg, possiamo addirittura creare i due stream contemporaneamente. La linea di comando è la seguente:

sukko@unholycathedral tmp $ ffmpeg -y -v 2 -i stream.dump -strict -1 -s 256x192 -b 256k -r 15 -flags +bitexact+mv0+trell+cbp -cmp 2 -subcmp 2 -precmp 2 -f mpeg1video nogood.mpg -ab 128 -ar 32000 -f mp2 nogood.mp2
FFmpeg version SVN-r7150, Copyright (c) 2000-2006 Fabrice Bellard, et al.
  configuration:  --prefix=/usr --disable-debug --enable-gpl --enable-mp3lame --enable-libogg --enable-vorbis --enable-faad --enable-faac --enable-libgsm --enable-xvid --enable-a52 --enable-pp --enable-shared --enable-pthreads --enable-amr_nb --enable-amr_wb --enable-x264 --enable-dts
  libavutil version: 49.1.0
  libavcodec version: 51.25.0
  libavformat version: 51.6.0
  built on Nov 22 2006 01:08:24, gcc: 3.4.6
Input #0, mpeg, from 'stream.dump':
  Duration: 00:04:17.3, start: 4112.417267, bitrate: 8227 kb/s
  Stream #0.0[0x1e0], 1/90000: Video: mpeg2video, yuv420p, 720x576, 1/25, 9800 kb/s, 25.00 fps(r)
  Stream #0.1[0xa0], 1/90000: Audio: pcm_s16be, 48000 Hz, stereo, 1536 kb/s
Output #0, mpeg1video, to 'nogood.mpg':
  Stream #0.0, 1/90000: Video: mpeg1video, yuv420p, 256x192, 1/15, q=2-31, 256 kb/s, 15.00 fps(c)
Output #1, mp2, to 'nogood.mp2':
  Stream #1.0, 1/90000: Audio: mp2, 32000 Hz, stereo, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #1.0
Press [q] to stop encoding
frame= 3875 q=2.0 Lsize=    7936kB time=258.0 bitrate= 252.0kbits/s dup=4 drop=2578
video:7935kB audio:4031kB global headers:0kB muxing overhead -33.679230%

Avrete notato che ho usato alcune “nuove” opzioni, vediamole in dettaglio:
- -v 2: Fa sì che ffmpeg ci dia qualche informazione aggiuntiva sul quel che sta facendo. In particolare, ci servono i dettagli sul numero di frame che ha effettivamente codificato.
- -strict -1 -r 15: Sebbene distanti, queste opzioni sono correlate fra di loro. Infatti, -r serve a specificare il framerate (il numero di fotorgrammi al secondo). Ho usato 15 perché, purtroppo, il DS ha una potenza di elaborazione limitata, e non riesce a reggere framerate più alti. Pare che il massimo realmente utilizzabile sia 18, ma anche con 15 il risultato è decente. Ora, lo standard MPEG-1 non ammette un framerate a caso, ma solo quelli standard (tipo 25, lo standard PAL), e quindi ffmpeg si rifiuterebbe di creare un file MPEG-1 a 15 fps… non fosse per l’opzione -strict -1, che gli dice di non rompere le scatole e darci retta, perché sappiamo quel che stiamo facendo ;).
- -s 256x192 -b 256k: Ridimensionamento e bitrate: anche questi parametri non devono essere “esagerati”, per lo stesso motivo del punto precedente. Questi valori sono accettabili per la maggior parte dei casi.
- -flags +bitexact+mv0+trell+cbp -cmp 2 -subcmp 2 -precmp 2: Senza andare troppo nei dettagli, questi sono parametri “di qualità”. Li ho scoperti solo recentemente, e servono a migliorare la compressione, a leggero scapito della velocità. Consiglio di usarli sempre (anche nei casi che abbiamo visto in precedenza), perché la differenza si vede a occhio nudo (e soprattutto in questo caso, date le restrizioni sugli altri parametri).
- -ar 32000: Frequenza di campionamento dell’audio, conviene usare sempre questa per evitare incompatiblità.

Bene, abbiamo così ottenuto gli stream. Per unirli insieme serve un programmino particolare, DPG Maker, che trovate qui: [download#3#nohits]. È uno script Python, quindi dovete averlo installato per utilizzarlo, ma solitamente si trova già installato su tutte le distribuzioni GNU/Linux. Si usa così:

sukko@unholycathedral tmp $ dpgmaker.py nogood.mpg 3875 256 15 nogood.mp2
Video file.....: nogood.mpg
Video frames...: 3875
Video bitrate..: 256
Video FPS......: 15
Audio file.....: nogood.mp2
Output file....: nogood.dpg
Creating nogood.dpg
Creating header
Removing temporary files
Done!

I parametri:
- 3875: È il numero di fotogrammi presenti nello stream video. Grazie al parametro -v 2 che abbiamo passato a ffmpeg, questo ce lo sputa direttamente fuori: è il primo numero della penultima riga, quello dopo frame=.
- 256: È Il bitrate dello stream video. Questo lo sappiamo per forza, dato che l’abbiamo passato a ffmpeg, dove però era seguito da una k.
- 15: È il numero di fotogrammi al secondo. Anche questo è noto, dato anche lo sproloquio di cui sopra :).

Eseguito questo comando, abbiamo finalmente il nostro bel nogood.dpg, che possiamo copiare sulla MicroSD e goderci tramite Moonshell, se abbiamo fatto tutto correttamente:

It's no good su NDS

Per chi volesse fare il tutto più in fretta, esiste il buon DPG Converter: si tratta dello script Python che io ho riadattato per creare il DPG Maker di cui sopra. Esso si preoccupa dell’encoding (usando Mencoder) e della creazione dell’header, tutto da solo.

A questo punto… dove accidenti posso vedere il video di Personal Jesus? Aspetto idee :).

6 thoughts on “Convertire DVD per vederli sul Nintendo DS

  1. Ciao Sukko, premetto che non sono un esperto, ma un papà che non può spendere ogni volta 50 euri per la figliola e il suo Dsl. Quindi ….. ecco l’acquisto della R4 revolution. Va bene, ma … vorrei vedere (almeno provare) un film, quindi… ho scaricato il dpgtools ma ogni volta che trascino dentro un film divx mi dice “Impossibile acquisire il flusso audio”. Come posso fare? GRazie in anticipo
  2. sono un rompiscatole che ha problemi con dpgtools, ho letto la tua guida di conversione ma non sono propio in grado di fare queste cose, se mi puoi dedicare qualche minuto vorrei spiegarti cosa mi succede.
    ho il programma su un vecchio pc con win2000, al primo tentativo di conversione ho provato con un video di 600mb .avi ed ha funzionato benissimo, allora ne ho convertito anche di piu’ grandi, ma con alcuni, anche di piccole dimensioni, mi crea i 4 file e poi quando deve concludere la conversione la barra blu in alto ad un certo punto si blocca e se provo a chiudere dpgtools mi dice che l’ applicazione non risponde e devo fare termina ora, ed in piu’ se provo ad eliminare i 4 file che ha generato uno mi dice che e’ in uso e non me lo elimina fino al punto che devo riavviare il pc.
    scusami se ti ho fatto perdere tempo ma spero nella tua bonta’ e che tu mi possa rispondere grazie mille!!!

    buon anno e buon lavoro antonio

  3. Scusate la – forse – scortesia, ma dove ho scritto che ho mai usato e/o so usare dpgtools? Spiacente, ma capitate male… Provate la soluzione che propongo qua, se volete qualcosa di funzionante.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>