Convertir vídeos a moonshell en cualquier plataforma

Hola, soy usuario de Linux y en la scene de nds como en bastantes más cosas la gran mayoría de las veces hay que hacer muchas pirulas para lograr lo que se puede hacer con los programas que existen para Windows para convertir videos, parchear roms, etc...

Pues bien, ya doy por sentado que un usuario de Linux ó cualquier otro sistema alternativo sabe buscarse la vida para cuando pasan éstas cosas, pero me ha parecido interesante compartir esto con vosotros, ya supongo que por aquí no abundan los linuxeros, pero con esta solución que os presento puedes convertir videos a moonshell en cualquier plataforma, ya sea PC o Mac, ya sea OSX como Linux como bsd... pues se usan programas multiplataforma, se necesita tener instalado en el SO el intérprete ruby, y el convertidor mencoder (disponibles en cualquier distro linux y además en OSX (aunque en éste no se como iría la cosa, pero bueno :))

#!/usr/bin/ruby

=begin
=desc
        Converts an mplayer supported video to an nds dpg file
=usage
        $0 <inputfile> <outputfile> <fps>
=end

##
## main
##

ATMP = "taudio.wav"
GTMP = "tgsm.wav"
VTMP = "tvideo.mpg"
ASAMPLES = 22050
ACHANNELS = 1
VBITRATE = 150
VSCALE = "256:192"


if __FILE__ == $0

        if ARGV.length != 3
                $stderr.puts "Usage #{$0} <inputfile> <outputfile>
<fps>"
                exit 1
        end

        # Assign command line args
        begin
                fps = ARGV[2].to_i
        rescue
                $stderr.puts "Invalid command line args"
                exit 1
        end

        infilename = ARGV[0]
        outfilename = ARGV[1]

=begin

        # extract & encode video
        videoArgs = [ "ffmpeg", "-y",
                        "-i", infilename,
                        "-strict", "-1",
                        "-an",
                        "-r", fps.to_s,
                        "-b" , "120",
                        "-s", "256x192",
                        "-vcodec", "mpeg1video",
                        VTMP ]

        if ! Kernel.system(videoArgs.join(" "))
                $stderr.puts "Error reencoding video"
                exit 1
        end

        # compute frames
        duration = nil
        mpeginfoArgs = [ "mpeg_ps_info", VTMP ]
        IO.popen(mpeginfoArgs.join(" ")).readlines.each do |line|
                match = /duration\s+(\d+\.\d+)\s+seconds/.match(line)
                if match != nil
                        duration = match[1].to_f
                end
        end

        if duration == nil
                $stderr.puts "Unable to determine frames"
                exit 1
        end

        frames = (fps * duration).ceil.to_i
        $stderr.puts "Created #{frames} frames"

=end
#=begin

        frames = nil
        videoArgs = [ "mencoder", "-quiet",
                '"' + infilename + '"',
                "-o " + VTMP,
                "-ovc lavc",
                "-lavcopts vcodec=mpeg1video:vstrict=-1:vbitrate=" +
VBITRATE.to_s,
                "-nosound", "-ofps " + fps.to_s, "-vf scale=" + VSCALE ]
        $stderr.puts videoArgs.join(" ")
        IO.popen(videoArgs.join(" ")).readlines.each do |line|
                $stderr.puts line
                match = /(\d+)\s+frames/.match(line)
                if match != nil
                        frames = match[1].to_i
                end
        end

        if frames == nil
                $stderr.puts "Unable to read frames"
                exit 1
        end
#=end

#=begin
        # extract audio as wav
        audioArgs = [ "ffmpeg", "-y",
                        "-i " + '"' + infilename + '"',
                        "-vn",
                        "-ar " + ASAMPLES.to_s,
                        "-ac " + ACHANNELS.to_s,
                        ATMP ]
#=end

=begin
        # extract audio as wav
        audioArgs = [ "mplayer-bin",
                '"' + infilename + '"',
                "-vc dummy",
                "-vo null",
                "-ao pcm:file=" + ATMP ]
=end
        if ! Kernel.system(audioArgs.join(" "))
                $stderr.puts "Error extracting audio"
                exit 1
        end

=begin
        soxArgs = [ "sox", ATMP, "-g", GTMP ]
=end

        # convert audio to gsm
        soxArgs = [ "sox", ATMP,
                        "-r " + ASAMPLES.to_s,
                        "-c " + ACHANNELS.to_s,
                        "-g", GTMP ]
        if ! Kernel.system(soxArgs.join(" "))
                $stderr.puts "Error converting audio to gsm"
                exit 1
        end

        # compute file sizes
        audiosize = File.size(GTMP)
        videosize = File.size(VTMP)

        # form header
        begin
                outfile = File.open(outfilename, "wb")
        rescue
                $stderr.puts "Error opening output file #{filename}"
                exit 1
        end

        audiostart = 36
        audioend = audiostart + audiosize
        videostart = audioend + 36
        videoend = videostart + videosize

        # header
        headerValues = [ "DPG0", frames, fps, 0, ASAMPLES, ACHANNELS ]
        headerPack = "A4VnnVV"

        outfile.write( headerValues.pack(headerPack) )

        # file positions
        locationValues = [ audiostart, audioend, videostart, videoend ]
        locationPack = "VVVV"

        outfile.write( locationValues.pack(locationPack) )

        begin
                audiofile = File.new(GTMP, "rb")
                while data = audiofile.sysread(8192)
                        outfile.write(data)
                end
        rescue EOFError
                audiofile.close
        rescue SystemCallError
                puts "Error building final dpg file"
                exit 1
        end


        begin
                videofile = File.new(VTMP, "rb")
                while data = videofile.sysread(8192)
                        outfile.write(data)
                end
        rescue
                videofile.close
        rescue SystemCallError
                puts "Error building final dpg file"
                exit 1
        end

        File.delete(VTMP);
#File.delete(ATMP);
        File.delete(GTMP);


end


El script lo encontré en los foros de gbadev buscando un poco, para el que tenga curiosidad aquí lo dejo para que lo probéis. A mí me funciona perfectamente [oki]

Como véis al principio están los parámetros, para cambiarlos basta con editar el archivo:

ASAMPLES = 22050 <- Para cambiar el samplerate del audio
ACHANNELS = 1 <- Los canales del sonido (1 es mono, 2 es stereo)
VBITRATE = 150 <- El bitrate del vídeo
VSCALE = "256:192" <- El tamaño del vídeo (mejor no tocar esto, está a la medida de las pantallas de DS)

el script se invoca así: nombredelscript

por ejemplo, yo lo tengo guardado el script como video2dpg, y para convertir un vídeo hago:

$ video2dpg video.avi video.dpg 20

y me crea video.dpg a 20 fps/seg y con los parámetros que hay en la cabecera del script (yo los tengo tal cual, no los toco).

Bueno creo que eso es todo.

PD: No pongo más detalles de sobre cómo usarlo en cada SO, si tuviera que explicar por cada uno me volvería loco, cada uno sabrá darle utilidad en su sistema, si no, que se informe más o que cambie de S.O [jaja]
Muy bueno. Supongo que usa el mencoder de mplayer, verdad?

Gracias!
1 respuesta