La idea es que nos pillamos un mega vídeo con 2 idiomas, subtítulos etc. que ocupa medio disco duro y lo queremos recodificar para que ocupe menos.
Solucion 1: HandBrake.
El "problema" es que tarda mucho en recodificar un video de, digamos, 10 Gb porque tiene 2 pistas de audio, pistas de subtitulo el vídeo a 1080 puntos.... (unas 6 o 7 horas cada pasada, en total, 12-15horas... pobre procesador...)
Solución 2: recodificar a manita
A manita significa recodificar el vídeo por un lado, codificar una pista de audio por otra, extraer los subtitulos, codificar la otra pista de audio y después juntarlo todo :)
Vamos a suponer que el archivo original es un mkv
VER PISTAS QUE TIENE EL ORIGINAL
-> mkvmerge -i archivo.mkv
La ID de la pista 1: video (V_MPEG4/ISO/AVC)
La ID de la pista 2: audio (A_DTS)
La ID de la pista 3: audio (A_AC3)
La ID de la pista 4: subtitles (S_TEXT/UTF8)
La ID de la pista 5: subtitles (S_TEXT/UTF8)
La ID de la pista 6: subtitles (S_TEXT/UTF8)
EXTRAER PISTAS
-> mkvextract tracks archivo.mkv 2:español.dts
-> mkvextract tracks archivo.mkv 3:ingles.ac3
-> mkvextract tracks archivo.mkv 1:video.h264
-> etc
CODIFICAR PISTAS
Audio
Objetivo: AAC de 128kbps (no me fijo si tiene 2,3,5 o 25 canales)
-> faac -b 128 -o es.aac español.dts
peta, faac dice que no entiende la entrada. Vaya por diox. Idem con lame. Pero veo que mplayer es capaz de reproducirlo... pues nada mencoder
-> mencoder español.dts -oac faac -faacopts br=128 -o españols.aac
falla también, me imagino porque mencoder quiere un "vídeo" y estos archivos extraídos con mkvextract no lo son :). Passssssa nada, mplayer lo reproduce no? pues ya esta:
-> mkfifo audiodump.wav
-> mplayer español.dts -novideo -ao pcm -af volume 10:0
Esto "reproduce" el audio (amplificando un poco el volumen si se escucha muy bajo) y lo va dejando en el archivo audiodump.wav, pero antes hemos creado una tubería con ese nombre.... ahora solo queda que la salida de la tubería la lea el codificador faac, abrimos otra consola y:
-> faac -b 128 -o es.aac audiodump.wav
así mplayer va escupiendo el sonido en la entrada de audiodump.wav y faac convierte su contenido a AAC.
Resultado: es.aac ocupa un 15% del español.dts y en unos pocos minutos (el vídeo dura unas 3 horas)
Repetimos para los otros idiomas.
Video
mencoder video.h264 -oac copy -ovc x264 -x264encopts subq=6:8x8dct:frameref=4:partitions=all:bframes=3:b_pyramid=normal:weight_b:threads=auto:me=umh:cabac:trellis=2:pass=1 -passlogfile temp0.log -o /dev/null -vf scale=1696:720
mencoder video.h264 -oac copy -ovc x264 -x264encopts subq=6:8x8dct:frameref=4:partitions=all:bframes=3:b_pyramid=normal:weight_b:threads=auto:me=umh:cabac:trellis=2:pass=2:bitrate=1000 -passlogfile temp0.log -o video-codificado.avi -vf scale=1696:720
Finalmente solo queda recoger el video recodificado, las pistas de audio recodificadas, los subtitulos y volver a crear un archivo mkv con mkvmerge(¿gui?)
PROBLEMAS
Curiosamente, el video original dura 2h 50min y me he dado cuenta que el video recodificado dura 2h 43min, jeje, esto ha provocado, evidentemente que al unir el video con el audio éste último esté desincronizado.
Esto ha sido debido que mplayer por defecto codifica a 25fps y resulta que el video original va a 23.976fps (24000/1001). Así que toca recodificar otra vez añadiendo -ofps 24000/1001 en mencoder.
Lo divertido es que despues de recodificar a 23.976 resulta que el video sigue durando menos que el original :) muahahahahaa. Al final la solución ha sido recodificar sin el -ofps 24000/1001 (entonces lo codifica a 25fps) y en el mkvmergegui especificar que la pista de video tiene el FPS de 24000/1001. Entonces el mkv con el stream de video recodificado si que dura las 2h50m con lo que al unir video, audio y subtitulos han quedado perfectamente sincronizados
Solucion 1: HandBrake.
El "problema" es que tarda mucho en recodificar un video de, digamos, 10 Gb porque tiene 2 pistas de audio, pistas de subtitulo el vídeo a 1080 puntos.... (unas 6 o 7 horas cada pasada, en total, 12-15horas... pobre procesador...)
Solución 2: recodificar a manita
A manita significa recodificar el vídeo por un lado, codificar una pista de audio por otra, extraer los subtitulos, codificar la otra pista de audio y después juntarlo todo :)
Vamos a suponer que el archivo original es un mkv
VER PISTAS QUE TIENE EL ORIGINAL
-> mkvmerge -i archivo.mkv
La ID de la pista 1: video (V_MPEG4/ISO/AVC)
La ID de la pista 2: audio (A_DTS)
La ID de la pista 3: audio (A_AC3)
La ID de la pista 4: subtitles (S_TEXT/UTF8)
La ID de la pista 5: subtitles (S_TEXT/UTF8)
La ID de la pista 6: subtitles (S_TEXT/UTF8)
EXTRAER PISTAS
-> mkvextract tracks archivo.mkv 2:español.dts
-> mkvextract tracks archivo.mkv 3:ingles.ac3
-> mkvextract tracks archivo.mkv 1:video.h264
-> etc
CODIFICAR PISTAS
Audio
Objetivo: AAC de 128kbps (no me fijo si tiene 2,3,5 o 25 canales)
-> faac -b 128 -o es.aac español.dts
peta, faac dice que no entiende la entrada. Vaya por diox. Idem con lame. Pero veo que mplayer es capaz de reproducirlo... pues nada mencoder
-> mencoder español.dts -oac faac -faacopts br=128 -o españols.aac
falla también, me imagino porque mencoder quiere un "vídeo" y estos archivos extraídos con mkvextract no lo son :). Passssssa nada, mplayer lo reproduce no? pues ya esta:
-> mkfifo audiodump.wav
-> mplayer español.dts -novideo -ao pcm -af volume 10:0
Esto "reproduce" el audio (amplificando un poco el volumen si se escucha muy bajo) y lo va dejando en el archivo audiodump.wav, pero antes hemos creado una tubería con ese nombre.... ahora solo queda que la salida de la tubería la lea el codificador faac, abrimos otra consola y:
-> faac -b 128 -o es.aac audiodump.wav
así mplayer va escupiendo el sonido en la entrada de audiodump.wav y faac convierte su contenido a AAC.
Resultado: es.aac ocupa un 15% del español.dts y en unos pocos minutos (el vídeo dura unas 3 horas)
Repetimos para los otros idiomas.
Video
mencoder video.h264 -oac copy -ovc x264 -x264encopts subq=6:8x8dct:frameref=4:partitions=all:bframes=3:b_pyramid=normal:weight_b:threads=auto:me=umh:cabac:trellis=2:pass=1 -passlogfile temp0.log -o /dev/null -vf scale=1696:720
mencoder video.h264 -oac copy -ovc x264 -x264encopts subq=6:8x8dct:frameref=4:partitions=all:bframes=3:b_pyramid=normal:weight_b:threads=auto:me=umh:cabac:trellis=2:pass=2:bitrate=1000 -passlogfile temp0.log -o video-codificado.avi -vf scale=1696:720
Resultado: un AVI recodificado y reescalado a 720puntos con un bitrate de 1000, yo lo veo bien :). La primera pasada me ha tardado 2 horas (en handbrake me tardaba 6 y pico), la segunda pasada 3 horas y algo (en handbrake eran otras 7 u 8 horas) y un video resultado que ocupa bastante menos tamaño y se ve, para mi, bien.
CREAR VIDEO FINAL
Finalmente solo queda recoger el video recodificado, las pistas de audio recodificadas, los subtitulos y volver a crear un archivo mkv con mkvmerge(¿gui?)
PROBLEMAS
Curiosamente, el video original dura 2h 50min y me he dado cuenta que el video recodificado dura 2h 43min, jeje, esto ha provocado, evidentemente que al unir el video con el audio éste último esté desincronizado.
Esto ha sido debido que mplayer por defecto codifica a 25fps y resulta que el video original va a 23.976fps (24000/1001). Así que toca recodificar otra vez añadiendo -ofps 24000/1001 en mencoder.
Lo divertido es que despues de recodificar a 23.976 resulta que el video sigue durando menos que el original :) muahahahahaa. Al final la solución ha sido recodificar sin el -ofps 24000/1001 (entonces lo codifica a 25fps) y en el mkvmergegui especificar que la pista de video tiene el FPS de 24000/1001. Entonces el mkv con el stream de video recodificado si que dura las 2h50m con lo que al unir video, audio y subtitulos han quedado perfectamente sincronizados
Comentarios