Convertir un divx pour le lire sur DS sous linux

1248 visiteurs sur le site | S'incrire

Accédez aux coordonnées de l’ensemble des techniciens professionnels recommandés par logic-sunrise 20 derniers dossiers et tutoriaux

Pour info, une carte type R4 est bien sur  nécessaire !

 

(Testé sur DSi et R4i)

 

- Prérequis : mencoder, mplayer et mpeg_stat

 

Installation de mplayer en mencoder :

 

sudo apt-get install mencoder mplayer

 

Installation de mpeg stat :

 

cd ~/Bureau && wget http://shortrip.org/public/nds/mpeg_stat && sudo mv ~/Bureau/mpeg_stat /usr/bin

sudo chown $USER /usr/bin/mpeg_stat

chmod +x /usr/bin/mpeg_stat

 

- Création du script de lancement :

 

Créer un fichier (peut importe ne nom)

 

cd /donnees/dsi (dans mon cas)

 

vi conversion.sh

 

copiez ceci :

 

#!/bin/bash

#Emplacement du repertoire ou seront stockes les fichiers convertis, et du script de conversion, (chemin absolu !)
repCible="/donnees/dsi/encodageNDS"
scriptConversion="./dpgconv-8-fr.py"

#on se place dans le dossier contenant le script dpgconv
cd $
repCible

#on lance le traitement (--hq = high quality,
$scriptConversion --hq "$1"

#on ouvre dolphin (peut etre remplacé par nautilus) dans le dossier contenant le fichier créé
dolphin $repCible

 

Enregistrer le fichier :

 

Echap , :x

 

Rendre le fichier executable :

 

chmod +x conversion.sh

 


 

- Création du script de conversion :

 

vi dpgconv-8-fr.py

 

copiez ceci :

 

#! /usr/bin/python
# DPG Converter by Anton Romanov © 2006
# released under GPL-2
#
"""A script to transcode video files to DPG format suitable for
   Nintendo DS ™
  
dpgconv.py file1 file2 file3 ... fileN
command line options:
    --dpg
        0,1,2 sets DPG version.. default is DPG2
   
    --pf
        sets pixel format, default is 3
        0        RGB15
        1        RGB18
        2        RGB21
        3        RGB24

    -q,--hq
        high quality video
    -l,--lq
        low quality video(takes no effect when --hq,-q is set)]
    default is normal quality
   
    -v,--vbps xxx
        sets video stream bps in kb/s(default: 256)
    -a,--abps xxx
        sets audio stream bps kb/s (default: 128)
    -f,--fps xx
        sets video frames per second (default:15)
    -z,--hz
        sets audio frequency (default:32000)
    -c,--channels
        2 - stereo, 1 - mono
        default is to leave as is unless input audio channels
        number is bigger then 2 ... then default is stereo
    --aid n
        use audio track n
    --height xxx
        destination video height
    --width xxx
        destination video width

    --mv
        additional parameters for mencoder for video

    --ma
        additional parameters for mencoder for audio
   
    Hardcoding subtitles
    --nosub
        do no try autoloading of subtitles
        (default is to try to load subtitle with matching filename)
    --sub,-s xxx
        Specify subtitles for hardcoding into video output
        (is obviously only usable if you specify one file at a time)
    --sid n
        use subtitle track n
    --subcp xxx
        specify subtitles encoding
    --font xxx
        specify font for subtitles
  EXAMPLE:
    --font ~/arial-14/font.desc
    --font ~/arialuni.ttf
    --font 'Bitstream Vera Sans'

  You can specify font, subcp and other additional mencoder parameters in
    ~/.mplayer/mencoder.conf
  EXAMPLE:
    font=/usr/local/share/fonts/msfonts/comic.ttf
    subcp=cp1251

"""
import sys, os, optparse

MP2TMP="mp2tmp.mp2"
MPGTMP="mpgtmp.mpg"
HEADERTMP="header.tmp"
GOPTMP="gop.tmp"
STATTMP="stat.tmp"

MENCODER="mencoder"
MPLAYER="mplayer"
MPEG_STAT="mpeg_stat"




#Print a help message if requested.
if "-h" in sys.argv or "-help" in sys.argv or "--help" in sys.argv:
    print __doc__
    raise SystemExit

def cleanup_callback(a,B):
    print "Suppression des fichiers temporaires"
    if os.path.lexists ( MPGTMP ):
        os.unlink ( MPGTMP )
    if os.path.lexists ( MP2TMP ):
        os.unlink ( MP2TMP )
    if os.path.lexists ( HEADERTMP ):
        os.unlink ( HEADERTMP )
    if os.path.lexists ( GOPTMP ):
        os.unlink ( GOPTMP )
    if os.path.lexists ( STATTMP ):
        os.unlink ( STATTMP )

def conv_vid(file):
    if options.dpg == 0:
        v_pf = "format=rgb24,"
        options.pf = 3
    elif options.pf == 3:
        v_pf = "format=rgb24,"
    elif options.pf == 2:
        v_pf = "format=rgb21,"
    elif options.pf == 1:
        v_pf = "format=rgb18,"
    elif options.pf == 0:
        v_pf = "format=fmt=rgb15,"
    else:
        v_pf = "format=rgb24,"
        options.pf = 3

    if options.hq:
        v_cmd =  ( " \""+ file +"\" -v -ofps " + `options.fps` + " -sws 9 -vf " + v_pf + "scale=" + `options.width` + ":" + `options.height` +":::3,harddup -nosound -ovc lavc -lavcopts vcodec=mpeg1video:vstrict=-2:mbd=2:trell:cbp:mv0:cmp=6:subcmp=6:precmp=6:dia=3:predia=3:last_pred=3:vbitrate=" + `options.vbps` + " -o " + MPGTMP + " -of rawvideo" )
    elif options.lq:
        v_cmd = ( " \"" + file + "\" -v -ofps " + `options.fps` + " -vf " + v_pf + "scale=" + `options.width` + ":" + `options.height` + ",harddup -nosound -ovc lavc -lavcopts vcodec=mpeg1video:vstrict=-2:vbitrate=" + `options.vbps` + " -o " + MPGTMP + " -of rawvideo" )
    else :
        v_cmd = ( " \""+ file +"\" -v -ofps " + `options.fps` + " -sws 9 -vf " + v_pf + "scale=" + `options.width` + ":" + `options.height` + ":::3,harddup -nosound -ovc lavc -lavcopts vcodec=mpeg1video:vstrict=-2:mbd=2:trell:cbp:mv0:cmp=2:subcmp=2:precmp=2:vbitrate=" + `options.vbps` + " -o " + MPGTMP + " -of rawvideo")
   
    if options.nosub:
        if options.sub != None:
            v_cmd = " -sub \"" + options.sub + "\" " + v_cmd
    else:
        basename = os.path.splitext ( file )[0]
        if options.sid != None:
            v_cmd = " -sid \"" + str(options.sid) + "\" " + v_cmd
        if options.sub != None:
            v_cmd = " -sub \"" + options.sub + "\" " + v_cmd
        elif os.path.exists ( basename + ".ass" ):
            v_cmd = " -sub \"" + basename + ".ass" + "\" " + v_cmd
        elif os.path.exists ( basename + ".srt" ):
            v_cmd = " -sub \"" + basename + ".srt" + "\" " + v_cmd
        elif os.path.exists ( basename + ".sub" ):
            v_cmd = " -sub \"" + basename + ".sub" + "\" " + v_cmd
        elif os.path.exists ( basename + ".ssa" ):
            v_cmd = " -sub \"" + basename + ".ssa" + "\" " + v_cmd
   
    if options.subcp != None:
        v_cmd = " -subcp " + options.subcp + v_cmd
    if options.font != None:
        v_cmd = " -font \"" + options.font + "\"" + v_cmd

    v_cmd = MENCODER + " " + v_cmd
    v_cmd = v_cmd + " " + options.mv
    #print v_cmd
    proc = subprocess.Popen(v_cmd,shell=True,stdout=subprocess.PIPE,universal_newlines=True,stderr=open('/dev/null', 'w'))
   
    p = re.compile ("f (\(.*%\))")
    for line in proc.stdout:
        m = p.search( line )
       
        if m:
            print "Encodage video: " + m.group(1) + "\r" ,



    print "Encodage video:   termine"

def conv_aud(file):
    a_cmd = ( MENCODER + " \"" +file + "\" -v -of rawaudio -oac lavc -ovc copy -lavcopts acodec=mp2:abitrate=" + `options.abps` + " -o " + MP2TMP )
    identify = commands.getoutput( MPLAYER + " -frames 0 -vo null -ao null -identify \"" + file + "\" | grep -E \"^ID|VIDEO|AUDIO\"")
    p = re.compile ("([0-9]*)( ch)")
    m = p.search( identify )
    if m:
        c = m.group(1)
        if options.channels == None:
            if c > 2:
                a_cmd = a_cmd + " -af channels=2,resample=" +`options.hz`+ ":1:2"
            else:
                a_cmd = a_cmd + " -af resample=" +`options.hz`+ ":1:2"
        elif options.channels >= 2:
            a_cmd = a_cmd + " -af channels=2,resample=" +`options.hz`+ ":1:2"
        else:
            a_cmd = a_cmd + " -af channels=1,resample=" +`options.hz`+ ":1:2"
    else:
        print "Erreur mplayer:"
        print identify

    if options.aid != None:
        a_cmd = a_cmd + " -aid " + str(options.aid)

    a_cmd = a_cmd + " " + options.ma
    #print a_cmd

    proc = subprocess.Popen(a_cmd,shell=True,stdout=subprocess.PIPE,universal_newlines=True,stderr=subprocess.STDOUT)

    v_out = ""
   
    p = re.compile ("f (\(.*%\))")
    for line in proc.stdout:
        m = p.search( line )
        if m:
            print "Encodage audio: " + m.group(1) + "\r" ,
    print "Encodage audio:   termine"


def write_header(frames):
    print "Creation header"

    audiostart=36
    if options.dpg == 1:
        audiostart += 4
    elif options.dpg == 2:
        audiostart += 12
   
    audiosize = os.stat(MP2TMP)[stat.ST_SIZE]
    videosize = os.stat(MPGTMP)[stat.ST_SIZE]
    videostart = audiostart + audiosize
    videoend = videostart + videosize
    f=open(HEADERTMP, 'wb')
    DPG = "DPG" + `options.dpg`
    headerValues = [ DPG, int(frames), options.fps, 0, options.hz , 0 ,int(audiostart), int(audiosize), int(videostart), int(videosize) ]
   
    f.write (struct.pack( "4s" , headerValues[0]))
    f.write (struct.pack ( "    f.write (struct.pack ( ">h" , headerValues[2]))
    f.write (struct.pack ( ">h" , headerValues[3]))
    f.write (struct.pack ( "    f.write (struct.pack ( "    f.write (struct.pack ( "    f.write (struct.pack ( "    f.write (struct.pack ( "    f.write (struct.pack ( "
    if options.dpg == 0:
        f.write (struct.pack ( "    if options.dpg == 2:
        gopsize = os.stat(GOPTMP)[stat.ST_SIZE]
        f.write (struct.pack ( "        f.write (struct.pack ( "        f.write (struct.pack ( "

    f.close()
def mpeg_stat():
    p = re.compile ("frames: ([0-9]*)\.")
    s_out = commands.getoutput( MPEG_STAT + " -offset " + STATTMP + " " + MPGTMP )
    m = p.search( s_out )
    if m:
        frames = m.group(1)
        if options.dpg == 2:
            gop=open(GOPTMP, 'wb')
            stat=open(STATTMP, 'rb')
            frame = 0
            for line in stat:
                sline = line.split()
                if sline[0] == "picture" :
                    frame += 1
                elif sline[0] == "sequence":
                    gop.write (struct.pack ( "                    gop.write (struct.pack ( "            gop.close()
            stat.close()
    else:
        print s_out
        return 0
    return frames

def conv_file(file):
    if not (os.path.lexists ( file )):
        print "Le fichier " + file + " est inexistant"
#        return
    print "Converting " + file
    conv_vid (file)
    conv_aud(file)
    frames = mpeg_stat()
    if frames == 0:
        print "Erreur mpeg_stat ..."
        cleanup_callback (0,0)
        return
    write_header(frames)
    dpgname = os.path.basename ( os.path.splitext ( file )[0] ) + ".dpg"
   
    print "Creating " + dpgname
    #commands.getoutput( "cat \"" + HEADERTMP + "\" \"" + MP2TMP + "\" \"" + MPGTMP + "\" > \"" + dpgname + "\"")
   
    if options.dpg == 2:
        #commands.getoutput( "cat \"" + GOPTMP + "\" >> \"" + dpgname + "\"")
        concat(dpgname,HEADERTMP,MP2TMP,MPGTMP,GOPTMP)
    else:
        concat(dpgname,HEADERTMP,MP2TMP,MPGTMP)
   
    cleanup_callback (0,0)
    print "Conversion termine de \"" + file + "\" en \"" + dpgname + "\""

def init_names():
    import tempfile
    global MPGTMP,MP2TMP,HEADERTMP,GOPTMP,STATTMP
    a,MP2TMP=tempfile.mkstemp()
    os.close(a)
    a,MPGTMP=tempfile.mkstemp()
    os.close(a)
    a,HEADERTMP=tempfile.mkstemp()
    os.close(a)
    a,GOPTMP=tempfile.mkstemp()
    os.close(a)
    a,STATTMP=tempfile.mkstemp()
    os.close(a)

def concat(out,*files):
    outfile = open(out,'w')
    for name in files:
        outfile.write( open(name).read() )
    outfile.close()



from optparse import OptionParser
parser = OptionParser()
parser.add_option("-f","--fps", type="int", dest="fps" , default=15)
parser.add_option("-q","--hq",action="store_true", dest="hq", default=False)
parser.add_option("-l","--lq",action="store_true", dest="lq", default=False)
parser.add_option("-v","--vbps", type="int", dest="vbps", default=256)
parser.add_option("-a","--abps", type="int", dest="abps", default=128)
parser.add_option("--height", type="int", dest="height", default=192)
parser.add_option("--width", type="int", dest="width", default=256)
parser.add_option("-z","--hz", type="int", dest="hz", default=32000)
parser.add_option("-c","--channels", type="int", dest="channels")
parser.add_option("--subcp", dest="subcp")
parser.add_option("-s","--sub", dest="sub")
parser.add_option("--font", dest="font")
parser.add_option("--mv", dest="mv",default="")
parser.add_option("--ma", dest="ma",default="")
parser.add_option("--nosub",action="store_true", dest="nosub", default=False)
parser.add_option("--dpg", type="int" , dest="dpg", default=2)
parser.add_option("--pf", type="int" , dest="pf", default=3)
parser.add_option("--sid", type="int" , dest="sid")
parser.add_option("--aid", type="int" , dest="aid")
(options, args) = parser.parse_args()

import signal

signal.signal(signal.SIGINT, cleanup_callback)
signal.signal(signal.SIGTERM, cleanup_callback)

import commands,re,stat,struct,subprocess
if options.dpg > 2:
    options.dpg = 2
if options.dpg < 0:
    options.dpg = 2


test = commands.getoutput ( MPEG_STAT + " --" )
m = re.compile ("mpeg_stat --(.*)").search(test)
if m:
    print m.group(0)
else:
    print "Error:"
    print test
    exit (0)
test = commands.getoutput ( MPLAYER )
m = re.compile ("^MPlayer.*").search(test)
if m:
    print m.group(0)
else:
    print "Error:"
    print test
    exit (0)
test = commands.getoutput ( MENCODER)
m = re.compile ("^MEncoder.*").search(test)
if m:
    print m.group(0)
else:
    print "Error:"
    print test
    exit (0)
print "Vous avez tout le necessaire :)...on y va"
print "Traduction par Billoutre - http://shortrip.org"
print "______________________________________________"
init_names()
for file in args:
    conv_file(file)

 

Enregistrer le fichier

 

Echap , :x

 

Rendre le fichier executable :

 

chmod +x dpgconv-8-fr.py 

 

 

 

- Lancer une conversion : 

 

conversion.sh /donnees/divx/mon\ divx.avi 

 

 

Pour un fichier qui faisait 700 Mo, pèse à présent dans les 240 Mo (forcément la résolution est différente !!!)

 

Voila, après 5mn (environ), un fichier (mon divx.dpg) est créé.

Il ne reste plus qu'à le copier sur la carte SD, et c'est parti ! 

 

 

 

Pour les fainéants, je peux vous envoyer les scripts par MP !

Posté : vendredi 18 décembre 2009, 19:32 par omegared.
08 avril 2010, 19:25
Approuver ce commentaire (+1)
Salut, le logiciel dpgconv ne fonctionne pas:

Voilà l'erreur que cela donne :

Converting
Transcoding video: done
Transcoding audio: done
Traceback (most recent call last):
File "dpgconv-fr.py", line 321, in
conv_file(file)
File "dpgconv-fr.py", line 273, in conv_file
frames = mpeg_stat()
File "dpgconv-fr.py", line 253, in mpeg_stat
frames = m.group(1)
AttributeError: 'NoneType' object has no attribute 'group'
/home/shideneyu/Logiciels/Ressources/VideoDPG/fouilli source/dpg/conversion.sh: line 14: dolphin : commande introuvable
Répondre à ce commentaire
15 avril 2010, 11:33
Approuver ce commentaire (+1)
a mon avis tu n'es pas sous KDE, puisque le script ne trouve pas dolphin ! (gestionnaire de fichiers)
sous gnome, remplace

dolphin $repCible

par nautilus $repCible ;)
Répondre à ce commentaire
09 juillet 2010, 15:56
Approuver ce commentaire (+1)
bonjour,
je pense avoir suivi consciencieusement le tutoriel, je suis sous gnome et j'ai modifié dolphin, voilà ce que j'obtiens quand je lance une conversion :conversion.sh: command not found
alors que quand je tape ls /donnees/dsi voilà ce que j'obtiens : conversion.sh dpgconv-8-fr.py encodageNDS
Peut-on m'aider ?
Merci d'avance
EDIT:je me réponds à moi-même ! En lançant la conversion par ./conversion, ça marche ... au début, puis : ./conversion.sh: line 11: ./dpgconv-8-fr.py: Aucun fichier ou dossier de ce type
RE_EDIT: j'ai placé dpgconv-8-fr.py dans encodageNDS, mais là aussi ça marche au début, puis:
File "./dpgconv-8-fr.py", line 2
SyntaxError: Non-ASCII character '\xc2' in file ./dpgconv-8-fr.py on line 2, but no encoding declared; see http://www.python.or...s/pep-0263.html for details
Merci
Répondre à ce commentaire
Cliquer ici pour continuer sur le forum
Envoyer