Cómo pasar videos de mkv a mp4 para poder verlos en la XBOX 360 o PS3

Viernes, 18 de Abril de 2008

Recientemente me he comprado una Xbox 360 que puede reproducir películas en alta definición y he bajado un par de ellas para probarlas. El problema es que la mayoría de las pelis están en formato mkv, que es un contenedor no compatible con las consolas.

Ayer me estuve empapando sobre cómo cambiar el formato y he decidido hacer un resumen para mí mismo y por si a alguien más le puede servir. Vamos a necesitar mkvinfo, mkvextract, hexedit o perl, a52dec, faac y MP4Box que forma parte del GPAC.

Partimos de una película matroska a la que llamaremos, en un alarde de originalidad y creatividad, video.mkv.

Lo primero es identificar, de entre las pistas, las que nos interesan:

yogurblanco@pc:~/MKVtoMP4$ mkvinfo video.mkv
+ EBML head
|+ Doc type: matroska
|+ Doc type version: 1
|+ Doc type read version: 1
+ Segment, size 3732499661
|+ Seek head (subentries will be skipped)
|+ EbmlVoid (size: 4012)
|+ Segment information
| + Timecode scale: 1000000
| + Muxing application: libebml v0.7.7 + libmatroska v0.8.1
| + Writing application: mkvmerge v2.1.0 (’Another Place To Fall’) built on Aug 19 2007 13:40:07
| + Duration: 6361.056s (01:46:01.056000000)
| + Date: Fri Nov 30 01:31:16 2007 UTC
| + Title: Ratatouille.2007.720p.BluRay.DTS.x264-ESiR
| + Segment UID: 0×8f 0×54 0×04 0xed 0xd6 0xd7 0xe8 0×92 0xbc 0xbf 0xc6 0×65 0×95 0xad 0xd4 0×8b
|+ Segment tracks
| + A track
| + Track number: 1
| + Track UID: 1
| + Track type: video
| + Enabled: 1
| + Default flag: 1
| + Forced flag: 0
| + Lacing flag: 0
| + MinCache: 1
| + Timecode scale: 1.000000
| + Max BlockAddition ID: 0
| + Codec ID: V_MPEG4/ISO/AVC
| + Codec decode all: 1
| + CodecPrivate, length 168
| + Default duration: 40.000ms (25.000 fps for a video track)
| + Language: eng
| + Name: Ratatouille
| + Video track
| + Pixel width: 1280
| + Pixel height: 536
| + Interlaced: 0
| + Display width: 160
| + Display height: 67
| + A track
| + Track number: 2
| + Track UID: 1569450149
| + Track type: audio
| + Enabled: 1
| + Default flag: 1
| + Forced flag: 0
| + Lacing flag: 1
| + MinCache: 0
| + Timecode scale: 1.000000
| + Max BlockAddition ID: 0
| + Codec ID: A_AC3
| + Codec decode all: 1
| + Default duration: 32.000ms (31.250 fps for a video track)
| + Language: spa
| + Audio track
| + Sampling frequency: 48000.000000
| + Channels: 6
|+ EbmlVoid (size: 1024)
|+ Cluster

En este caso tenemos en el track 1 el video y en el track 2 el audio. En mi caso también venían unas fuentes adjuntas y lo más normal es que vengan otros audios y/o subtítulos. Como sólo nos interesa el video y el audio español del track 2, los extraemos:

yogurblanco@pc:~/MKVtoMP4$ mkvextract tracks “video.mkv” 1:video.h264 2:audio.ac3
Extracting track 1 with the CodecID ‘V_MPEG4/ISO/AVC’ to the file ‘video.h264′. Container format: AVC/h.264 elementary stream
Extracting track 2 with the CodecID ‘A_AC3′ to the file ‘audio.ac3′. Container format: Dolby Digital (AC3)
progress: 100%

Mi archivo mkv ocupa 3,5 GB y en extraer las pistas mi PC ha tardado algo más de 3 minutos y medio. Ahora tenemos por separado el archivo de video h264 y el de audio ac3. Al parecer para que el archivo de video sea legible por la consola hay que cambiar un byte !!! Lo abrimos con hexedit:

$ hexedit video.h264

Buscamos la cadena “67 64 00 33″ y cambiamos el 33 por 29 quedando “67 64 00 29″. Ctrl + S para guardar los cambios y Ctrl + Z para salir. Este paso también podemos hacerlo con perl mediante el siguiente comando:

$ perl -pi.bak -e ’s{\x67\x64\x00\x33}{\x67\x64\x00\x29}’ video.h264

Lo bueno de este comando es que se puede ejcutar mediante un script pero lo malo es que revisa el archivo completo, cuando este byte está al principio, y crea una copia entera del archivo que ocupa temporalmente, el doble del espacio del archivo de video.

Una vez que tenemos el archivo de video modificado le toca al de audio. El formato AC3 no es compatible con las consolas así que vamos a pasarlo a AAC. Me ha resultado demasiado complejo hacerlo usando neroAacEnc así que he optado por pasar a primero a PCM:

yogurblanco@pc:~/MKVtoMP4$ a52dec audio.ac3 -o wavdolby > audio.wav
a52dec-0.7.4 - by Michel Lespinasse walken @zoy.org and Aaron Holtzman
No accelerated IMDCT transform found
197794 frames in 72.26 sec (2737.25 fps), 1708 last 0.50 sec (3416.00 fps)
198783 frames decoded in 72.59 seconds (2738.44 fps)

Hemos tardado 72 segundos. Ahora pasamos a AAC:

yogurblanco@pc:~/MKVtoMP4$ faac audio.wav -b 256 -q 100
Freeware Advanced Audio Coder
FAAC 1.24

Average bitrate: 166 kbps
Quantization quality: 100
Bandwidth: 16000 Hz
Object type: Low Complexity(MPEG-2) + TNS + M/S
File format: MPEG-2 AAC (ADTS)
Encoding audio.wav to audio.aac
frame | bitrate | elapsed/estim | play/CPU | ETA
298176/298176 (100%)| 165.4 | 453.1/453.1 | 14.04x | 0.0

En este paso he tardado unos 8 minutos. -b es el bitrate y -q la calidad.

Ahora sólo nos falta unir los archivos AAC y H264 en un MP4 compatible con las consolas. Pero al parecer MP4Box tiene una limitación a la hora de unir archivos mayores de 2 GB así que hay que parchearlo. Podéis encontrar cómo en este foro: http://ubuntuforums.org/showthread.php?t=689757

Una vez parcheado MP4Box unimos los archivos en el MP4 final:

yogurblanco@pc:~/MKVtoMP4$ MP4Box -add video.h264 -add audio.aac video.mp4 -tmp /media/LaCie/
AVC-H264 import - frame size 1280 x 536 at 25.000 FPS
Import results: 159011 samples - Slices: 1890 I 62613 P 94508 B - 1 SEI - 1676 IDR
Stream uses B-slice references - max frame delay 2
AAC import - sample rate 48000 - MPEG-2 audio - 2 channels
Saving to video.mp4: 0.500 secs Interleaving

Unos 7 minutos hemos tardado en este último paso. El parámetro -tmp es para indicar la ubicación del archivo temporal, le he dicho que lo cree en mi disco duro ganso. Y ale, a disfrutar. Preguntas, insultos, etcétera… en los comentarios.

2 Comentarios »

Redifusión RSS de los comentarios de la entrada. TrackBack URI

  1. Avatar de <a href='http://tronan50.com' rel='external nofollow'>Tronan</a>Comentario por Tronan — 19 Abril 2008 #

    EL dios del Trueno escuchó mis plegarias!! gracias! llevo una semana con lo mismo y había extraído el vídeo y el audio. Roto me he quedado con lo de cambiar el byte…a partir de ahí ya podía yo romperme la cabeza!

    Muchas gracias!! pero muchas. Lo probaré este finde y te comento.

    Un saludo.

  2. Avatar de <a href='http://tronan50.com' rel='external nofollow'>Tronan</a>Comentario por Tronan — 20 Abril 2008 #

    Hola de nuevo.

    Al parchear mp4box y ejecutar el paso:

    ./configure

    Puede dar este mensaje:

    “zlib not found on system”

    La solución es:

    apt-get install zlib1g-dev

    Un saludo

Deja un comentario

Por favor, sé respetuoso con los demás en tus comentarios y esto incluye no usar mayúsculas o negritas innecesariamente. Si vas a pedir ayuda ten en cuenta que recibirás la misma dedicación en la respuesta que tú pongas al formular la pregunta. Si no recibes respuesta no te servirá de nada insistir. Nos reservamos el derecho de borrar sin previo aviso los comentarios ofensivos.

Noseque.net usa WordPress con un Tema diseñado por Borja Fernandez y adaptado a nuestro gusto.
XHTML y CSS Válidos.

Cerrar
Enviar por Correo