Fansub VI – Codificación avanzada – Scripts y Pipes

Pipes – Las tuberías del sistema operativo.

Todo sistema operativo se basa en el proceso de instrucciones. La entrega de los resultados puede darse directamente en pantalla o a través de cualquier otro medio. De eso vamos a tratar. Vamos a imaginarnos que nuestro sistema operativo está compuesto de cajas que hacen una serie de funciones y están conectadas entre ellas por medio de tuberías, por las que fluyen los datos que se comparten. Bien, entendido. entonces, ¿qué pasaría si por ejemplo a un reproductor multimedia en vez de decirle que me de el resultado por pantalla, le digo que lo entregue a otro programa, a través de “otra tubería”  para que esas imágenes las codifique con un codec a mi elección? Sería la bomba. Pues de eso tratan los pipes.

Ya que nos hemos metido en todo esto, no quería dejar pasar a avisynth, que ya se me olvidó en el anterior post. Al fin y al cabo, al menos tal y como yo lo interpreto no es más que un “intermediario”, una tubería más para conseguir el resultado que quiero.

Avisynth

Avisynth no es ni más ni menos que un “frameserver”. Un programa que se encarga de facilitar imágenes ya decodificadas, listas para su uso a terceros programas. Dependiendo de los filtros instalados puede hacer prácticamente de todo. Pues como siempre voy a intentar dar una solución global que sirva para todo el mundo. seguiremos usando avidemux como programa base, pero esta vez vamos a alimentarlo mediante avisynth.

En el caso de windows, no hace falta contar mucho, ya que avidemux viene “full equipe”. Por supuesto, requerimiento mínimo tener instalado avisynth. Avidemux viene con dos utilidades que nos van a hacer la vida muy pero que muy fácil para usar avisynth. Se trata de avsproxy y avsproxy_gui. Están en la carpeta de instalación de avidemux. Si abrimos avsproxy_gui, podremos elegir el archivo de vídeo a cargar e incluso añadir diferentes filtros de una forma completamente visual. Ojo que no se instalan por defecto y hay que seleccionarlas.

Seleccionamos el frameserver, sea FFVideosource, DGDec, DshowSource o el que sea y el archivo de vídeo. pulsamos create proxy y listo. ¿Fácil, no?

Ahora sólo tenemos que abrir avidemux, y en el menu “archivo” seleccionamos “conectar a avsproxy” y listo. Ya tenemos nuestro avidemux alimentado mediante avisynth.

En el caso de linux, gracias a wine tenemos prácticamente lo mismo. Lo único es que tendremos que bajarnos la versión windows (mejor la version sin instalación, zip). La descomprimimos por ahí y luego copiamos los dos archivos que vienen en el programa “avsproxy.exe” y “avsproxy_gui.exe” a la carpeta  system32 de wine para tenerlos siempre disponibles. Es lo único que necesito. ¿Que cómo se hace eso? bueno, la carpeta está en ~/.wine/drive_c/windows/system32. Es una carpeta oculta, por lo que tendréis que decirle al navegador que muestre los archivos ocultos para verlo. Sólo nos queda crear un acceso directo en el escritorio al programa gui para lanzarlo a conveniencia. Recuerden que para lanzar una aplicación windows será: “wine avsproxy_gui” con eso basta, ya que la hemos dejado en el directorio system32.

Nota: Para que funcione avisinth en wine requiere de las librerías c++ y ffdshow. Se pueden instalar fácilmente con winetricks: winetricks allcodecs vcrun6

La única pega es que no he conseguido hacer funcionar el audio, por lo que tendréis que trabajar el audio aparte. Esta es una muestra de lo que pasó después de pulsar “Create proxy”

Automáticamente se abrió avidemux y cargó el vídeo (en windows). En el caso de que ya nos hayamos cansado de una cosa tan sencilla, pues nos vamos a la pestaña de “Custom” y ahí ponemos lo que queramos. No me voy a para a explicar las funcionalidades de avisynth, ¡go google!

En el caso de linux, tendremos que conectar manualmente, pero es exactamente lo mismo. Lo único es que tenemos que deseleccionar la casilla que está abajo a la izquierda para que el programa no intente hacer una conexión automática. Luego abrimos avidemux y en el menu “archivo” pulsamos “conectar a avsproxy”

¡¡Somos la bomba!!. En el capítulo anterior habíamos hablado del problema de tener una versión de avidemux no compatible con hi10. Pues esta es otra forma de eludir esa restricción.

Avisynth es un frameserver soportado por cualquier programa de codificación que se precie. Puedes hacer prácticamente cualquier cosa. Pero voy a mantener los manuales lo más simple posible, así que seguiremos adelante.

PIPES

No sé si son las cervezas del viernes, pero creo que ya había hablado de cajas y tuberías. Los programas normalmente tienen una entrada y una salida de datos estándar. STDIN y STDOUT. Por ahí es por donde se comunican con el resto del mundo. Bueno, tenemos un programa estupendo de codificación, x264, pero no sé cómo alimentarlo con el vídeo que yo quiero (a lo mejor quiero meterle subs, cambiarle la resolución, framerate, lo que sea)  ¿Qué tal si interconecto la salida de un reproductor de vídeo con la entrada de un codificador? Sólo es cuestión de tuercas y tornillos. Hummmmm…..

vamos aprobar…

mplayer -nosound -benchmark -vo yuv4mpeg:file=>(x264 –demuxer y4m –crf 21 –output salida.mkv -) “entrada.avi”

Mantengo la línea de comandos lo mas sencilla posible.  No la he probado en windows, supongo que debería funcionar de igual forma. -nosound porque no es posible mandar audio y vídeo a la vez. -vo porque tengo que definir la salida como yuv. -benchmark, para que corra a la máxima velocidad, no a la velocidad 1x. En x264 –demuxer y4m es necesario pues es el formato que entrega yuv4mpeg y el guión al final imprescindible pues le dice a x264 que tome los datos de STDIN.

No me gusta mplayer, ¿Qué tal ffmpeg?

ffmpeg -i “entrada.avi” -an -f yuv4mpegpipe – | x264 –demuxer y4m –crf 21 -o salida.mkv –

-an para anular el audio y -f para especificar el formato de entrega a STDOUT

Vamos a complicarlo un poco. Ahora resulta que quiero que mplayer entregue el vídeo mkv con subtitulos:

mplayer -ass -slang esp -ofps 24000/1001 -vf scale=1920:1080 -utf8 -nosound -benchmark -vo yuv4mpeg:file=>(x264 –demuxer y4m –crf 21 –output salida.mkv -) “entrada.mkv”

Curioso el caso de tener que definir el framerate de salida (-ofps) para que se muestren los subs con mplayer.  os he metido el filtro de re-escalar por si lo queréis utilizar.

Y así podemos seguir jugando para hacer todo lo que queramos.

Bueno, ya he conseguido hacer lo que quiero, pero os puedo asegurar que mañana no me voy a acordar de la línea que tuve que escribir para codificar y me va a tocar releerme el manual de ffmpeg o x264 o mencoder. ¡Pues no me da la gana!

SCRIPTS

Después de estar recibiendo media hora errores de codificación en la terminal hasta que he conseguido la orden correcta, no me quedan ganas de repetir la experiencia, así que lo que voy a hacer es guardar esa orden en un archivo de texto y otro día hago “cortar y pegar” en la terminal y la ejecuto. ¡Qué listo soy!

Pues no, hay gente mas lista. Hay un formato especial de archivos que son capaces de ejecutar listas de órdenes para el sistema operativo. Son archivos bat o cmd en el caso de windows y bash en el caso de linux.

En el caso de windows, podemos crear el archivo y después un acceso directo en nuestro escritorio. El sistema operativo entrega una variable al archivo con la dirección del archivo arrastrado cada vez que arrastramos y soltamos un archivo en el ícono. Esa variable la podemos rescatar desde dentro del archivo con la variable “$1”, así que en nuestro editor favorito podríamos poner algo así:

echo procesando “$1”
#saco el audio a 192
#primero descomprimo el audio para que lo acepte el neroencoder
ffmpeg -i “$1” -vn -acodec pcm_s16le “$1.tmp.wav”
#ahora codifico con neroencoder
neroAacEnc -br 192000 -if “$1.tmp.wav” -of “$1.1080tmp.m4a”
#borro el temporal wav que ya no me hace falta, que no soy un guarro.
del “$1.tmp.wav”
#ahora codifico el vídeo
ffmpeg -y -i “$1” -s hd1080 -an -vcodec libx264 -refs 4 -crf 21 -subq 9 -trellis 2 -partitions all -me_method umh -maxrate 62500k -bufsize 62500k “$1.1080tmp.mp4”
#y ahora lo junto todo
 MP4Box -add “$1.1080tmp.mp4″#video -add “$1.1080tmp.m4a”#audio “$1.1080p-hi8.mp4”
#borro lo que me sobra
 del “$1.1080tmp.mp4”
del “$1.1080tmp.m4a”

Lo metemos todo en un archivo “.bat” y arreando. Cada vez que arrastremos un archivo de vídeo al ícono de este programa, empezará a codificar con los valores establecidos.

En linux, algo parecido. La diferencia es que no tenemos que poner ninguna terminación al archivo. Linux reconoce el tipo de archivo leyendo dentro, así que en la primera línea sólo tenemos que poner “#!/bin/bash” para que sepa lo que es.

Para los linuxeros, que nos gusta complicar las cosas, he incorporado novedades en el script. En este caso una sustitución para poder trabajar eliminando la terminación de los archivos (línea y=${1%.*}) y de propina, trabajar extrayendo los subtitulos para luego poder codificarlos hardsub. (ffmpeg necesita soporte libass). Para un mkv con subtítulos quedaría algo así:

#!/bin/bash
# *************INSTRUCCIONES**************
# x264 encoding para mkv 1080p con hardsubs
# 8 bits
#*****************************************
echo procesando “$1″
y=${1%.*}
a=”$0.temp.ass”
#Primero saco los subtitulos
ffmpeg -y -i “$1” -an -vn -scodec copy “$a”
#saco el audio a 192
ffmpeg -i “$1” -vn -acodec pcm_s16le “$y.tmp.wav”
~/Escritorio/Fansub/neroAacEnc -br 192000 -if “$y.tmp.wav” -of “$y.1080tmp.m4a”
rm “$y.tmp.wav”
#saco el video
ffmpeg -y -i “$1″ -vf ass=”$a” -s hd1080 -an -vcodec libx264 -refs 4 -crf 21 -subq 9 -trellis 2 -partitions all -me_method umh -maxrate 62500k -bufsize 62500k “$y.1080tmp.mp4”
#mezclo el video con el audio
MP4Box -add “$y.1080tmp.mp4″#video -add “$y.1080tmp.m4a”#audio “$y.1080p-hi8.mp4”
#y limpio temporales
rm “$a”
rm “$y”.1080tmp.mp4
rm “$y”.1080tmp.m4a

si no queréis usar ffmpeg, siempre podéis usar x264, mencoder, avidemux-cli…

Ah, lo he querido dejar para rematar, para demostrar que avidemux podía acompañarme hasta el final. Yo no trabajo con avidemux, si no con avidemux_cli, línea de comandos. Podemos crear un perfil de codificación como vimos en artículos anteriores y llamarlo para que codifique:

avidemux2_cli –nogui –force-alt-h264 –load “$1” –run “perfildecodificación.js” –save “$y.salidaavidemux.mp4” –quit

Procesado por lotes

Después de estar corrigiendo 24 capítulos de Gosick y montando los mkv, toca codificar las diferentes versiones. Pero os puedo asegurar que si puedo, no voy a dar un palo al agua.

Que lo haga el Sr. Intel que para eso lo he pagado.

La idea es meter todo lo que tengo que codificar en un directorio y hacer lo mismo que hacíamos antes de arrastrar, pero en vez de un archivo, pues arrastro el directorio entero.

Vamos a capturar la entrada:

En windows: (ya ni me acordaba)

FOR %%f in (%1*) do

la variable %f rescatará los nombres de todos los archivos del directorio uno a uno.

Cuidado con los espacios, mejor envolver la variable entre comillas “%f”

En linux:

#!/bin/bash
for archivo in “$1″/*
do
AQUÍ EN MEDIO LE METEMOS LO QUE QUERAMOS, la variable “$archivo” nos indicará el archivo que se está procesando
Y LUEGO CERRAMOS EL BLUCLE
done

Sé que me he dejado millones de cosas en el tintero, pero creo que es suficiente para aquellos que quieran tomar un primer contacto y experimentar. Si intentara abarcar todo esto se volvería interminable y un tostón.

Cualquier duda estaré encantado de intentar contestarla, aunque seguro que no tengo respuestas para todo. Nos vemos.

Esta entrada fue publicada en Artículos, Taller de Fansub. Guarda el enlace permanente.

5 respuestas a Fansub VI – Codificación avanzada – Scripts y Pipes

  1. homatorn dijo:

    Pues realmente muchas gracias: voy a ponerlo en práctica y les comento como me fue.
    De igual forma si encuentro algo nuevo se los haré saber inmediatamente.
    De nuevo, gracias por el apoyo.

  2. homatorn dijo:

    Hola de nuevo: Ya realicé el procedimiento como me comentaste con Avidemux y sí funcionó muy bien gracias.
    Aun así como principiante me gustaría preguntar algunas cosas en las que tengo dudas:
    1: Debido a que el Avidemux no me codifica audio Flaac y muchos de los bd rip que quiero transformar para verlos en una smart tv : ¿qué conversor puedo utilizar para el audio que sea de buena calidad y posteriormente anexarlo en Avidemux para codificar?

    2: Intenté hacer un script de Avisynth después de instalar ffdshow para probar y lo quise utilizar con el avidemux y el mediacoder (este último porque convierte el audio flaac) y en ambos casos sólo pude ver el video con los subtítulos con estilo y fuentes pero el audio nada más no se pudo codificar. Lei en la guía que han tenido ese mismo problema pero ¿ se puede hacer algo? o hay que convertir el video solo y luego volver a codificar con el audio?
    3: ¿De qué anime es el personaje femenino que ponen en la página que tiene pelo plateado y una cruz dorada de amuleto? Siempre veo la imagen pero no recuerdo de qué Anime era.
    Muchas gracias por todo.

    • Shiso dijo:

      1- Hasta donde tengo entendido el audio en formato FLAC no puede ir en contenedores MP4, solo con MKV.
      Podrías probar codificándolo en AAC o AC3 (podes usar WinFF o el codec de Nero “NeroAacEnc). En mi caso te recomiendo AAC, mi Smart TV no reconoce audio AC3 (aunque diga que es compatible).

      2- Como te mencioné no podes empaquetar FLAC en un archivo MP4. Tendrás que convertirlo a AAC o AC3. Otra cosa que debes tener en cuenta son los canales, algunos Smart TVs no son compatibles con audio de 5 canales (así sea FLAC/AAC/AC3), por lo que si tu audio FLAC es de este tipo tendrás que convertirlo a uno 2 canales (estéreo) en formato AAC o AC3. AAC y AC3 también pueden contener 5 canales de audio.

      Lo que podrías hacer también es pegar los subs, sin sonido, en un MP4, y empaquetar ese video en un MKV con el audio FLAC. Así no tendrías problemas para ver los subs con efectos, y se podría escuchar perfectamente siempre que tu Smart TV sea compatible con ese formato de sonido. Los Smarts son compatibles con el contenedor MKV, el problema es que no soportan los subtítulos en ASS con fuentes y estilos; el perfil hi10 (10 bits); y son quisquillosos para ciertos formatos de sonido.

      3- No es de un anime, es otra de las tantas Vocaloids, creo que se llama IA.

      Es todo lo que te puedo decir con mis precarios conocimientos en la materia del encode. Por ahí estoy equivocado, si es así que alguien me corrija.

  3. homatorn dijo:

    Saludos: he leido los tutoriales de fansub que han publicado aunque realmente me falta practicar mucho. Tengo una pregunta que seguro han hecho varias personas, sin embargo quisiera saber qué me recomendarían?
    Algunas veces bajo archivos MKV y al extraer los subtítulos SSA con efectos quiero pegarlos en el videod con estilos y efectos. He intentado con Avidemux, Hibrid, MediaCoder y otros programas, sin embargo el tipo de fuente cambia y los efectos se desactivan. ¿Qué me recomendarían?

Deja un comentario