{"id":440,"date":"2008-02-19T19:40:33","date_gmt":"2008-02-19T17:40:33","guid":{"rendered":""},"modified":"2008-11-21T21:23:06","modified_gmt":"2008-11-21T19:23:06","slug":"procesado-de-video-ii","status":"publish","type":"post","link":"https:\/\/nauj27.com\/blog\/?p=440","title":{"rendered":"Procesado de video [II]"},"content":{"rendered":"<p>La primera opci\u00f3n que pens\u00e9 fue usar <a title=\"MEncoder\" href=\"http:\/\/www.mplayerhq.hu\/\">MEncoder<\/a>, como <a title=\"cuenta Z. en su blog\" href=\"http:\/\/www.zugaldia.net\/blog\/?p=92\">cuenta Z. en su blog<\/a>. Al abrir la p\u00e1gina de <a title=\"manual de MPlayer\" href=\"http:\/\/www.mplayerhq.hu\/DOCS\/man\/en\/mplayer.1.html\">manual de MPlayer<\/a> en busca de las opciones a usar, encontr\u00e9 casi por casualidad la secci\u00f3n <a title=\"profiles\" href=\"http:\/\/www.mplayerhq.hu\/DOCS\/man\/en\/mplayer.1.html#PROFILES\">profiles<\/a>. En lugar de usar un mont\u00f3n de par\u00e1metros para `mencoder&#8217; se pueden crear perfiles en un archivo de configuraci\u00f3n. En estos perfiles se especifican todas las opciones y as\u00ed no hay que volver a acordarse ni preocuparse de cu\u00e1les son.<\/p>\n<p><img loading=\"lazy\" class=\"foto\" src=\"http:\/\/nauj27.com\/images\/uploads\/mplayer.jpg\" border=\"0\" alt=\"image\" width=\"373\" height=\"287\" \/><\/p>\n<p>Para usar esta caracter\u00edstica de mencoder cre\u00e9 el archivo <strong>~\/.mplayer\/mencoder.conf<\/strong> con la siguiente configuraci\u00f3n:<\/p>\n<pre class=\"cita\">[w880]\r\nprofile-desc=\"MP4 encoding for SonyEricsson w880i\"\r\n# Encode with the given video codec and options\r\novc=lavc=yes\r\nlavcopts=vcodec=mpeg4:autoaspect=yes:vbitrate=256:acodec=libfaac:abitrate=96\r\nvf=scale=320:240\r\no=output.mp4\r\naspect=4:3\r\nsws=0\r\n\r\n# Specify a frames per second value for the output file\r\nofps=15\r\n\r\n# Output audio codec\r\noac=faac=yes\r\nfaacopts=br=96\r\naf=volnorm=1\r\n\r\n# Encode to the specified container format\r\nof=lavf=yes\r\nlavfopts=format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes\r\n\r\n[w880-hq]\r\nprofile-desc=\"HQ MP4 encoding for SonyEricsson w880i\"\r\nprofile=w880\r\nlavcopts=mbd=2:trell=yes:v4mv=yes\r\nsws=2<\/pre>\n<p>Si preguntamos a <em>mencoder<\/em> nos desvolver\u00e1 una lista de los perfiles definidos:<\/p>\n<pre class=\"cita\">nauj27@arriba:~$ mencoder -profile help\r\nMEncoder 2:1.0~rc1-0ubuntu13.1 (C) 2000-2006 MPlayer Team\r\nCPU: AMD Athlon(tm) XP 1600+ (Family: 6, Model: 6, Stepping: 2)\r\nCPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0\r\nCompiled with runtime CPU detection.\r\nAvailable profiles:\r\n        w880-hq HQ MP4 encoding for SonyEricsson w880i\r\n        w880    MP4 encoding for SonyEricsson w880i<\/pre>\n<p>Y si preguntamos acerca de un perfil nos dar\u00e1 una informaci\u00f3n m\u00e1s detallada:<\/p>\n<pre class=\"cita\">nauj27@arriba:~$ mencoder -show-profile w880\r\nMEncoder 2:1.0~rc1-0ubuntu13.1 (C) 2000-2006 MPlayer Team\r\nCPU: AMD Athlon(tm) XP 1600+ (Family: 6, Model: 6, Stepping: 2)\r\nCPUflags: Type: 6 MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 1 SSE2: 0\r\nCompiled with runtime CPU detection.\r\nProfile w880: MP4 encoding for SonyEricsson w880i\r\n ovc=lavc=yes\r\n lavcopts=vcodec=mpeg4:autoaspect=yes:vbitrate=256:acodec=libfaac:abitrate=96\r\n vf=scale=320:240\r\n o=output.mp4\r\n aspect=4:3\r\n sws=0\r\n ofps=15\r\n oac=faac=yes\r\n faacopts=br=96\r\n af=volnorm=1\r\n of=lavf=yes\r\n lavfopts=format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes<\/pre>\n<p>Ahora veamos qu\u00e9 significa cada uno de los par\u00e1metros definidos. El primero indica el c\u00f3dec de video que vamos a emplear, lavc, y la l\u00ednea siguiente indica las opciones que se emplear\u00e1n en dicho c\u00f3dec. En \u00e9ste caso he especificado video en <strong>mpeg4<\/strong>, raz\u00f3n de aspecto autom\u00e1tica, 256kbps para el video y 96kbps para el audio codificado usando la librer\u00eda libfaac que comprime en formato AAC.<\/p>\n<p>Las siguientes tres l\u00edneas escalan el video a 320x240px que es la resoluci\u00f3n de la pantalla del tel\u00e9fono, indican la raz\u00f3n de aspecto que se incluir\u00e1 dentro de la informaci\u00f3n del contenedor y se indica un fichero de salida por defecto por si no es especificado posteriormente, output.mp4.<\/p>\n<p>sws=0 indica que durante el escalado de la imagen se use un filtro bilineal r\u00e1pido para obtener una calidad aceptable pero r\u00e1pida de calcular.<\/p>\n<p>ofps=15 indica que queremos 15 im\u00e1genes por segundo. Hay a quien le pueden parecer insuficientes pero la mayor\u00eda de la gente no apreciaremos realmente la diferencia.<\/p>\n<p>oac=faac=yes, faacopts=br=96 y af=volnorm=1 son todos referidos al audio. El primero indica el formato, el segundo la tasa de bits por segundo y el tercero hace un procesado del audio para normalizar el volumen. La normalizaci\u00f3n consigue la m\u00e1xima amplificaci\u00f3n sin distorsi\u00f3n.<\/p>\n<p>Por \u00faltimo, of=lavf=yes y la l\u00ednea de lavfopts indican que el audio y el video se quieren multiplexar en un contenedor MP4.<\/p>\n<p>Hay una opci\u00f3n adicional que es la que fastidi\u00f3 que pudiese usar \u00e9ste m\u00e9todo para transformar las pel\u00edclas, y es lo siguiente:<\/p>\n<pre class=\"cita\">lavfopts=format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes<\/pre>\n<p>En realidad yo no puedo certificar que eso sea cierto. Ahora contar\u00e9 por qu\u00e9. En la compresi\u00f3n de video los tipos de im\u00e1genes que podemos encontrar son <strong>Intra coded frames<\/strong>, <strong>Predicted frames<\/strong>, y <strong>Bi-directional predictive pictures<\/strong>, tambi\u00e9n conocidos como <strong>I-Frames, P-Frames y B-Frames<\/strong>.<\/p>\n<p>En los formatos definidos en el estandar MPEG, a menudo solo se almacenan diferencias entre im\u00e1genes en lugar de im\u00e1genes completas. Sin meterme en profundidad en el tema, dir\u00e9 <em>grosso modo<\/em> que:<\/p>\n<p class=\"cita\">&#8211; Los I-Frames son im\u00e1genes completas o im\u00e1genes clave (key frames) que son codificadas sin hacer referencia al resto de las im\u00e1genes del video.<\/p>\n<p>&#8211; Los P-Frames requieren informaci\u00f3n de im\u00e1genes anteriores para ser decodificados, pueden contener informaci\u00f3n nueva as\u00ed como vectores de desplazamiento de bloques de im\u00e1genes o combinaciones de ambos.<\/p>\n<p>&#8211; Los B-Frames requieren la decodificaci\u00f3n de im\u00e1genes anteriores para la representaci\u00f3n completa de la imagen. Incluyen modos de predicci\u00f3n de regiones de movimiento, sacando un movimiento medio con predicciones basadas en el movimiento de objetos en im\u00e1genes del video anteriores.<\/p>\n<p>Lo que se le est\u00e1 diciendo a mencoder con el par\u00e1metro <strong>mp4:i_certify_that_my_video_stream_does_not_use_b_frames=yes<\/strong> es que aseguro que mi video no contiene B-Frames, lo cual no es cierto en la gran mayor\u00eda de los casos. Resulta que mencoder usa algo llamado lavf para crear un contenedor de tipo MP4 y actualmente tiene un bug que hace que si el video contiene B-Frames el resultado sea un archivo corrupto que no sirve para mucho. Y efectivamente, el archivo resultante no lo reconoce ni <a title=\"Perry Mason\" href=\"http:\/\/es.wikipedia.org\/wiki\/Perry_Mason\">Perry Mason<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La primera opci\u00f3n que pens\u00e9 fue usar MEncoder, como cuenta Z. en su blog. Al abrir la p\u00e1gina de manual de MPlayer en busca de las opciones a usar, encontr\u00e9 casi por casualidad la secci\u00f3n profiles. En lugar de usar un mont\u00f3n de par\u00e1metros para `mencoder&#8217; se pueden crear perfiles en un archivo de configuraci\u00f3n. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,8],"tags":[65,64,198],"_links":{"self":[{"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/440"}],"collection":[{"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=440"}],"version-history":[{"count":1,"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/440\/revisions"}],"predecessor-version":[{"id":493,"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/440\/revisions\/493"}],"wp:attachment":[{"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nauj27.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}