Vamos a programar #9 - El Código de VEncoder 2.

El día de hoy; y como lo prometí hace algunos días, les traigo el código fuente de VEncoder 2.
Las entregas se van a repartir en las siguientes:

  1. El código de VEncoder2.
  2. Porqué funciona cómo funciona.
  3. Agregando funciones que necesito.
  4. Errores, Intentando arreglarlos.

El Código de VEncoder2.

Lo primero que vamos a hacer es echarle un vistazo al código de fuente, tratare de explicar un poco que es lo que hace cada parte del código. Algo importante que debo mencionar es que el código ya tiene "sus ayeres", originalmente estaba planeado para uso personal, así que el código puede estar "sucio". Si eres algo curioso, de seguro te preguntaras ¿VEncoder2, donde esta el 1?, la respuesta es simple, nunca vio la luz del sol, y no porque fuera malo u otra cosa, simplemente no se me ocurrió que le resultara interesante a alguien más a parte de mí, de hecho la idea de hacer un blog surgió a partir de alguien a quien siempre le agradeceré... Pero eso es otra historia, sigamos en los que estábamos.

Inicialmente estaba pensado para convertir los vídeos y que fueran compatibles con el PSP y PSvita

Abriendo el proyecto.

Lo primero que debemos de hacer es descargar el proyecto (aquí) y abrirlo con #Develop o visual studio. Para poder usrlos, primero debemos de agregar un par de referencias a los siguientes ensamblados: MediainfoNet.dll y ListviewEx.dll (incluidas en la descarga). La primer librería solo se trata de un "wrapper" para poder usar la librería MediaInfo.dll que sirve para obtener la información detallada de los archivos multimedia (Resolucion, BitRate, etc) y la segunda es una versión extendida del ListView, posee algunas funciones extra a un ListView normal, estas las veremos mas adelante.
Al inicio, puede aparecer este mensaje de error.
Para agregar las referencias solo hay que ir a "Proyecto>Agregar referencia" y en la ficha "Examinar", buscar la carpeta debug que viene incluida en el archivo que descargaste y seleccionar "ListViewEx.dll y MediaInfoNet.dll"


Analizando un poco el código.

El código está dividido en dos regiones:
  1. Declaraciones (globales)
  2. Funciones
El resto del código que no está dentro de ninguna de estas, es código propio del formulario o de los controles; eventos constructores y todo lo demás no tienen ninguna Region definida.

Para VEncoder2 solo usaremos 4 variables globales

    #region Declaraciones
       private bool IsConvertingSomething = false;
       private bool RequestForCancel = false;
       private int ElapsedTimeGlobal = 0;
       private int ElapsedTimeCurrent = 0;
    #endregion

Los nombres son realmene explicitos, entonces creo que no hace falta mencionar cada una, de todos modos sobre la marcha, veremos que tipo de valores se le asignan a cada una.

Función SaveProfile

Para no hacer muy largo el post,el día de hoy solo analizaremos las primeras dos funciones que nos encontraremos al abrir el proyecto. La primera funcion es la que se encarga de abrir un archivo VEPX con los ajustes para la conversion.


/// <summary>
/// Funcion que se encarga de guardar loa ajustes en archivo VEPX
/// </summary>
/// <param name="XmlPath">Ruta en donde se guardara</param>
/// <param name="ProfileName">Nombre que se usara para identificar el archivo</param>

private void SaveProfile(string XmlPath, string ProfileName)
{
  XmlWriterSettings settings = new XmlWriterSettings();
  settings.Indent = true;
  settings.IndentChars = "\t";
  using (XmlWriter XWriter = XmlWriter.Create(XmlPath, settings))
  {
    XWriter.WriteStartDocument();
    XWriter.WriteComment("Archivo de preset para VEncoder 2");
    XWriter.WriteStartElement("Perfil");
    XWriter.WriteAttributeString("v", "1");
    XWriter.WriteAttributeString("appname", "VEncoder2");
    XWriter.WriteElementString("Name", ProfileName);
    XWriter.WriteElementString("WH", CboResolucion.Text);
    XWriter.WriteElementString("VBit", TXTVBit.Text);
    XWriter.WriteElementString("Ratio", CBORatio.Text);
    XWriter.WriteElementString("Profile", CBOProfile.Text);
    XWriter.WriteElementString("Nivel", CboLevel.Text);
    XWriter.WriteElementString("ASample", CboFreq.Text);
    XWriter.WriteElementString("ABit2", CBOBitsA.Text);
    XWriter.WriteElementString("Channel", CBOAChannels.Text);
    XWriter.WriteElementString("ExtraParams", TXTExtraparams.Text);
    XWriter.WriteEndElement();
    XWriter.WriteEndDocument();
  }
}


Lo que va a hacer es leer los controles y guardar sus valores en un archivo XML, para eso, usamos XMLWritter. De hecho lo hacemos de forma inpractica, pero debido a que siempre van a ser los valores de los mismos controles, ademas de que no son muchos, entonces podemos hacer de forma explicita, indicando el nombre del control cuyo valor queremos obtener y simplemente guardarlo. Por ejemplo,  XWriter.WriteElementString("WH", CboResolucion.Text); lo que hace es guardar en un elemento XML llamado "WH" el texto contenido en CboResolution. Para poder entender un poco mejor a que se hace referencia, recomiendo echarle un vistazo al proyecto, cada control tiene su nombre, entonces una vez que te familiarices con los nombres, sera más rápido entender el código.

Funcion LoadProfile

La siguiente función hace lo contrario, en lugar de guardar, está lee desde un archivo existente.
/// <summary>
/// Carga un archivo XML con los ajustes para realizar la cadificacion.
/// </summary>
/// <param name="InXMLFile">Ruta al archivo que se debe de leer</param>
private void LoadProfile(string InXMLFile)
{
using (XmlReader XMLR = new XmlTextReader(InXMLFile))
 {
 XMLR.ReadToFollowing("Name");
 lnklblLoadProfile.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("WH");
 CboResolucion.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("VBit");
 TXTVBit.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("Ratio");
 CBORatio.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("Profile");
 CBOProfile.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("Nivel");
 CboLevel.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("ASample");
 CboFreq.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("ABit2");
 CBOBitsA.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("Channel");
 CBOAChannels.Text = XMLR.ReadElementContentAsString();
 XMLR.ReadToFollowing("ExtraParams");
 TXTExtraparams.Text = XMLR.ReadElementContentAsString();
 }
}


Verás que el código es realmente similar al anterior, de hecho lo es, pero para poder entenderlo es necesario estar familiarizado con los nombres de los controles.

Creo que por ahora es todo, sirve que le echas in vistazo al código y ya despues seguiremos con la explicación a lo demás.

Los leo luego.

No hay comentarios.