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
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