4 de marzo de 2011

Pasos a seguir para encodear un BDMV for dummies. :3c

Ok, ahora recuerdo que me habían pedido una guía de cómo encodear un video desde el primer paso hasta el último hace algún tiempo, pero ya saben, soy demasiado lazy, y hasta ahorita que no tenía absolutamente nada qué hacer, es que me pondré a con esta guía. >3<

Bueno, empezaremos eligiendo el ejemplo que usaré, digamos que quiero encodear un BDMV, cómo le hago, wtf? I don't even... nani kore!
Asumiré que de entrada ya tienen su equipo en condiciones para encodear, es decir, ya tienen Avisynth instalado, .NET Frameworks, una interfaz para editar scripts de Avisynth como AvsP, y sus codecs en condiciones, para los codecs de video, recomiendo que usen CCCP, que tiene todo lo que podrán llegar a necesitar, está bien optimizado y no te instala basura que nunca necesitarás, como el K-Lite. Si tu cpu tiene dos o más cores, marquen MT como decoder h264 preferido.

Avisynth
.NET Frameworks
AvsP
CCCP


Paso 1: Descargar el BDMV y reconocer los archivos a encodear, obviamente, dentro de la carpeta de stream encontraremos varios archivos .m2ts con nombre numérico. De estos archivos, reconoceremos cuáles son los capis, cuáles menús, y cuáles son los extras. Usualmente los más pesados son los caps, los segundos más pesados los extras y los que pesan menos son los menús.


Paso2: Indexar el archivo, así como está no lo podemos cargar en nuestro script de avisynth, tenemos que hacerlo mediante un source decoder. En el caso de un BD usaremos dos posibilidades, DGAVCDec si no tienen gpu decente o DGDecNV. La diferencia entre estos dos es que DGDecNV usa la gpu para hacer el decoding, lo que hace del encode más rápido al dejar más procesos en el cpu para la codificación.
Cómo indexamos el archivo? Abrimos el DGIndexNV, y cargamos nuestro archivo .m2ts ahí, con File -> Open. Checamos que el cropping filter 1088 -> 1080 esté marcado, y vamos a save project, realmente no necesitamos mover nadamás, y ahora solo queda esperar a que el indexing termine. Al terminar te generará dos o más archivos donde hayas guardado el proyecto, un .dgi, que es el index del stream de video, y unos streams de audio, con diferentes extensiones, las más comunes son .thd, .ac3, .pcm, etc...


Paso 3: Cargar el archivo .dgi (o .dga, dependiendo del indexer que usamos) en nuestro script de avisynth.
Se hace como cualquier otro video, para armar el script completo y ver una preview nos podemos ayudar de AvsP, o Megui, lo que os guste más:

dgsource("lalalalala.dgi")
#ivtc/deinterlace si lo requiriese
#crop(x,x,x,x)
#spline36resize(x,y)
#filtros extras, generalmente solo se necesita deband, si es que se necesita.

*Los gatos indica que son comentarios y las líneas que le siguen no tienen efecto dentro del script.
Y listo, ya tenemos nuestro script de avisynth creado. En caso de que usemos crop y resize, lo recomendable es dejar una resolución mod16, o sea, una resolución donde ambos, X y Y son divisibles entre 16.
Pero, al hacer crop/resize, estamos cambiando nuestro aspect ratio original, así que tendríamos que hacerlo anamórfico, cuando el display res es diferente de nuestra resolución final, para calcular el DAR, el cual ponemos al hacer el mux en mkvmerge, se hace con esto: http://ps-auxw.de/cgi-bin/ar-calc.pl
Otra cosa, que sea BD no quiere decir que es progresiva la fuente, en la mayoría de los casos lo es, pero a veces no, cuando te tocan ese tipo de fuente, es necesario saber desentrelazar, para lo que ocupamos otra guía que hice anteriormente sobre cómo usar TIVTC y de cómo saber qué tipo de fuente tienes.

Paso 4: Ahora que ya tenemos todo hecho, hay que mandar a encodear con x264, para eso hice una guía de cómo usar el x264 cli, los settings recomendables para el encode de un bluray depende de nuestra máquina en sí, pero yo pondré una línea de ejemplo:

x264.exe --crf 17 --preset veryslow --ref 9 --bframes 6 --deblock -1:-1 --subme 10 --trellis 2 --psy-rd 1.0:0.0 --qcomp 0.70 --me umh --merange 24 --thread-input --aq-strength 1.0 --no-dct-decimate --no-fast-pskip --rc-lookahead 60 --colormatrix bt709 --output "output.mkv" "00001.avs" 2> log.txt

Notarán un parámetro que dice colormatrix, bt709 es el colormatrix que se usa para fuentes HD, y para fuentes SD se usa el --colormatrix bt470bg, cómo saber cuál usar? Si la res final de tu encode es 480p, usa el colormatrix SD, si es 720p o más, usa el bt709. No tiene ciencia. -3-
Por cierto, si quieren seguir usando su pc mientras encodea, para que x264 no use todos los threads de su cpu, pueden limitarlo poniendo --threads x después del --thread-input, donde x es el número de threads que quieren que use, si tienen una pc que soporta 6 threads, pueden poner 4 y dejan dos libres para hacer lo que quieran y no les peten las aplicaciones que corran mientras dura el encode.

Paso 5: Una vez terminado el encode del video, hay que codificar el audio, el cual tenemos en nuestra carpeta donde creamos el proyecto al hacer el indexing.
Cómo elegir qué audio usar, y si se ha de codificar o no?
Bueno, este paso puede ser algo difícil para encoders novatos, pero pues es bastante simple, cuestión de gustos y de qué tanto quieres que pesé el audio, si te importa o no una mierda la calidad de audio.
Los archivos comunes de audio en un BD son los .thd/ac3@thd, los .ac3 y los .pcm, notarán que en el tag viene de cuantos canales es el audio, los .pcm suelen ser de 2 canales, los ac3 vienen de 2 canales o de 5.1, y los que son TrueHD son de 5.1, incluso más (aunque no me han tocado), algunas veces, si usas DGAVCDec, el .thd te lo va a extraer como un .ac3, pero la core es thd, así que no es ac3, es thd en un contenedor ac3.

Ahora qué hacer? Si nos tocó un ac3, lo recomendable es dejarlo como está sin recodificar. Si te tocó un .pcm hay que encodearlo a un lossy codec, como AAC o Vorbis, o FLAC incluso, que es lossless. Si te tocó un thd es recomendable pasarlo a FLAC, para no perder calidad de audio, pero si crees que pesa mucho, igual lo puedes pasar a AAC, que soporta bien los 5.1 canales, y si te tocó un thd dentro de un contenedor ac3, ni de coña lo dejes así, ac3 no tiene buen soporte para thd, así que si quieres mantener la calidad, igual, pásalo a flac, o aac si no quieres que pese tanto, pero con pérdida de calidad.

Cómo encodear el audio? Este paso es sencillo, si vamos a convertir a FLAC, simplemente usamos eac3to cli, con una línea de comandos simple:
eac3to.exe "input.thd/pcm/ac3" "output.flac"
eac3to leerá la información del audio fuente y codificará a flac.

Si vamos a convertir a AAC, igual podemos usar eac3to pero tendríamos que poner los parámetros de aac manualmente mendiante línea de comandos, además de descargar el neroaac por aparte. Por lo que para convertir a AAC yo uso foobar2000, un reproductor de audio bastante molón que nos ofrece la opción de convertir el audio a varias opciones. Este no viene con el encoder de aac por default, así que habría que descargarlo de la pag de NeroAAC, que es el encoder AAC actualmente más eficiente.

Paso 6: Hacer el muxing del stream de video, el de audio, subtítulos, chapters y la wea que quieran que mkv soporte.
Esto es sencillo, para hacer el muxing solo necesitan de mkvmerge, que viene como herramienta de MKVtoolnix, donde cargarán los streams con add y ya está, además podrán poner las especificaciones de AR y eso en las opciones del stream, es importante que los streams que se mostrarán por default al reproducirse, les pongan "Yes" en la parte de Default Track Flag.


Pues bueno! Terminamos, ya tenemos nuestro .mkv final, moláis mazo, ya sabéis encodear un BD gracias a thesisidiot-sama! Vayan y cuéntenle a sus amigos y a los amigos de sus amigos, yay!

Con esto concluyo, si tienen dudas, problemas o lo que sea, pueden preguntar aquí. :3c
Si creen que le falta algo a la guía, sólo coméntenlo, no pondré más imágenes. 3_3

22 comentarios:

Anónimo dijo...

Gracias por el awasome tuto :3

se diferencia mucho si se quiere encodiar una .TS?

tambien, que recomiendas para una buena reproduccion? como por ejemplo que filtros del ffdshow o el render de video son los mas recomendables?

thesisidiot dijo...

Pues no se diferencía mucho de una TS, prácticamente lo mismo, solo que las TS siempre son iguales. Los BDMVs no, sobre todo con el tema de filtrado, deinterlacing e ivtc. Además de que tienes que cambiar a consideración los parámetros a usar en x264, además de aprender a hacer trims para cortar los comerciales y cortar el audio correctamente, tal vez luego suba algunas aplicaciones y scripts que sirver para eso. -3-

Sobre un buen playback, no necesitas más que cccp con ffmpeg-mt de decoder, filtros de ffdshow que puedes usar, son gradfun, en default y nadamás. Sobre el renderer, pues el overlay mixer diría que es el más neutral, pero MadVR te deja configurar más parámetros, yo uso madvr por cuestiones de gusto. Además de que madvr ya disminuye considerablemente el banding al escalar, por lo que realmente no se necesita del todo el gradfun de ffdshow.

Prueba, ahí sí que es cosa de gustos. :3c

Leo dijo...

Guardando en Favoritos para cuando encodee BDMV xD espero y pronto para mi nueva PC xD

Suteki dijo...

Probare este método ya que no es el que utilizo yo, a ver como me va xD

Anónimo dijo...

Y si uso gdsmux? D:

thesisidiot dijo...

Wtf, nada qué ver el gdsmux, eso es para hacer un remux del stream nomás afaik. -3-

Josengan dijo...

Hola tengo un archivo .pcm como lo convierto a AAC con neroACCenc o con la herramientas que dices podrias poner los parametros o hablar as a detalle...gracias

thesisidiot dijo...

Primero que nada pasa ese .pcm que es un archivo de audio en raw, a un contenedor que soporte las especificaciones, como es .wav, eso lo haces con eac3to de manera simple:

eac3to.exe "input.pcm" "output.wav"

Ahí eac3to saca automáticamente las especificaciones que debe tener el audio, ahora de ese contenedor wav ya deberías poder escuchar el audio normal, pero está sin comprimir, para pasarlo a aac lo haces con foobar2000 nomás, abres tu output.wav en foobar, click derecho > convert > ... y ahí modificas el preset que quieres, en este caso AAC (Nero), con las especificaciones que te gusten, generalmente solo le mueves al bitrate, yo uso -q0.6 normalmente. Cuando mandes a convertir te va a pedir la ruta de tu NeroAACenc, nomás lo seleccionas y ya, empieza la conversión. :3c

Josengan dijo...

hola, gracias por la ayuda pero hice esto:

eac3to v3.24
command line: eac3to.exe "Seint seya cap2 PID 1100 DELAY -914ms.pcm" "d:\audio.wav"
------------------------------------------------------------------------------
This might be a RAW/PCM file. Trying to figure out the details.
This will probably take a while. Please be patient...
Was not able to figure out all parameters of this RAW/PCM file.
Please specify channel, bitdepth and endian parameters via command line.

no se que es.
gracias

thesisidiot dijo...

Significa que no pudo adivinar los parámetros por sí solo, así que tendrás que especificarlos tú.

Poniendo si es big o low edian, el número de canales, y la frecuéncia y el bit depth.

Esos pcm suelen ser de dos canales, big edian, de 16 bits y el sampling rate/frecuencia de 48000hz.

Pondrías algo así:
eac3to input.pcm output.wav -16 -48000 -2 -big

No es seguro que te vaya a salir bien, prueba a escuchar el .wav resultante, si no se escucha bien tendrás qué cambiar los parámetros, juega con el bitdeph entre 16 o 24, de big a low, y así, hasta que te salgan bien los parámetros.

Anónimo dijo...

DIsculpa la molestia pero despues de buscar por toda la red no encontre una respueesta , asi que te consultare algo al respecto a ver si me puedes ayudar.

¿Sabes si existe alguna forma de usar Madshi Video renderer con avisynth?

Por poner un ejemplo:

Directshowsource("tal cosa.ext")

que al cargar esta linea en el avisynth, sea el renderer de madshi quien procese el video, creo que puede ser posible ya que para cargar video con el codec H264, utilizo CUDA sin problemas.

thesisidiot dijo...

Nada qué ver tu pregunta. Dx

Un renderer NO es un decoder, así que de nada te sirve ahí. Para ser más concreto, NO, no hay forma de hacer eso porque es imposible y estúpido.

El renderer solo actua durante la reproducción de un video, y es un proceso relativamente ajeno al decoding. Incluso madvr usa tu decoder default para actuar, ya sea coreavc, ffdshow, etc...

Alienware dijo...

Muchisimas gracias men :) nomas seguir este tuto y es imposible kagarla XD... Gracias de nuevo no me dio ningun problema al encodear el BD.

Leo dijo...

thesis no sea vago pon algo nuevo <3 xD

thesisidiot dijo...

Hmmm, me lo pensaré, esta semana termino con mi ronda de exámenes finales y de ahí tengo 2 semanas de vacaciones, supongo que algo nuevo pondré en ese tiempo. xD

BlueRabbit dijo...

Podrias subir un tuto de encodiar un TS, soy totalmente un novato, pero veo q en serio sabes y me gustaria aprender de ti

thesisidiot dijo...

Sorry por la tardanza, estaba sin luz toda la semana. xD

Y pues bueno, tenía pensado hacer un video tutorial de cómo encodear una TS, supongo que lo haré este fin de semana. :3c

Leo dijo...

haz uno de yatta :3c plzz xD

Anónimo dijo...

¿Queria saber si al indexar con DGDecNV a la hora de hacer el encode se usara la grafica sea cual sea el tipo de stream, o tiene que ser un stream VC-1?

Actualmente con streams MPEG2 y AVC, al encodear la grafica no hace nada.

Un saludo!

Anónimo dijo...

¿Para que al encodear se use una grafica Nvidia, a parte de indexar con DGDecNV, se requiere de algun requisito como el tipo de stream?

thesisidiot dijo...

Leo: No sé usar yatta, nunca me he visto en la necesidad de ello y lo considero :effort: estar revisando cuadro por cuadro en yatta cuando lo puedo arreglar en avisynth con applyrange. xD

Anónimo: Para ponerlo simple, dgindexnv usa la gpu para decodificación del video, si el dgindexnv te abre el video sin tirarte error, entonces es un stream soportado, así de simple.

En contraste con dgindex, o dgavcindex, que usan el procesador.

thesisidiot dijo...

Leo: Me refiero a que lo puedo arreglar manualmente, sin usar yatta. Que al final de cuentas yatta también usa avisynth para arreglar las cosas. Perdón por mi mala sintaxis, que ando medio dormido a estas horas. Dx