Vamos a programar #11 - El código de VEncoder 2

El día de hoy vamos a continuar revisando el código de VEncoder2, la vez anterior ya habíamos revisado el código de las primeras 4 funciones. Normalmente vemos las funciones de 2 en 2 pero hoy, vamos a ver un poco mas debido a que algunas de las funciones son realmente simples.


Funcion Porcentaje

El código de la funcion porcentaje es el siguiente:

/// <summary>
/// Calcula porcentaje
/// </summary>
/// <param name="ValorActual">Valor actual para hacer el calculo</param>
/// <param name="ValorTotal">Valor total para hacer el calculo</param>
/// <returns>Un numero que representa el valor del porcentaje</returns>
private Single Porcentaje(Single ValorActual, Single ValorTotal)

{
return (ValorActual / ValorTotal) * 100;
}

Lo único que hace esta función es regresar el valor equivalente al porcentaje actual, recibe dos parámetros del tipo Single ValorActual y ValorTotal, y después solo hace la división entre ValorActual y ValorTotal, luego lo multiplica por 100, el valor resultante es el porcentaje de ValorActual con respecto a ValorTotal.


Funcion GetFileName

El código de la función GetFileName es el siguiente:
/// <summary>
/// Obtiene el nombre de archivo desde una ruta completa
/// </summary>
/// <param name="FileName">La ruta de la cual se quiere obtener el nombre de archivo</param>
/// <returns>Un string con el equivalente al nombre de archivo</returns>
/// <remarks>El valor devuelto no incluye la extension</remarks>

private string GetFileName(string FileName)
{
string[] TMPData = FileName.Split((char)92);
return TMPData[TMPData.Length - 1];
}


La funcion GetFileName sirve para obtener el nombre de archivo de una ruta completa.es decir, si tenemos la ruta a  un archivo cómo la siguiente: "c:\users\Ra\Desktop\Mi video.mp4" al usar la función obtenemos "Mi video.mp4". Esta función recibe un parámetro del tipo string, después la separa usando la función "split", la función split recibe como parámetro del tipo char en este caso es "(char)92", lo que hace es convertir el numero 92 a el tipo char y es equivalente a "\" (backslash). Se usa la variable TMPData  para almacenar el resultado de la función split que aplicamos sobre el parámetro de entrada. Finalmente solo regresa el ultimo valor de la matriz.
A lo mejor puedes pensar que haciendo eso nos complicamos demasiado porque dentro de las fucniones que vienen incluidas en .NET, dentro del espacio de nombre System.IO hay una funcion que hace exactamente lo mismo. Path.GetFileName hace lo mismo, pero debido a que es codigo que vengo arrastrando desde VB6 (solamente adaptado a C#), preferi incluirlo, pero sientete libre de usar la función que mas quieras.

Funcion GetPositionFronFFLine.

El código de la funcion GetPositionFromFFLine es el siguiente:

         /// <summary>
         /// Obtiene el valor de tiempo desde una linea de resultado de ffmpeg
         /// </summary>
         /// <param name="FFText">Linea proveniente de FFMPEG</param>
         /// <returns>Regresa un numero con el valor en segundos</returns>
         
         private Single GetPositionFromFFline(string FFText)
         {
             try
             {
                 if (FFText.StartsWith("FRAME", StringComparison.OrdinalIgnoreCase)) {
                     string PreResult;
                     PreResult = FFText.Split((char)61)[5].ToString().Trim();
                     return (Single)TimeSpan.Parse(PreResult.Remove(PreResult.Length - 7, 7).Trim()).TotalSeconds;
                 }else{
                     return 0;
                 }
             } catch (Exception) {
                 return 1;
             }
         }

La función GetPositionFromFFLine extrae el tiempo actual de la conversion, para entender como funciona, primero echemos un vistazo a una linea de resultado de FFmpeg.

 frame= 2528 fps=167 q=27.0 size=    5246kB time=00:01:43.27 bitrate= 416.1kbits/s 
La anterior es una linea de ffmpeg cuando esta haciendo una conversión, ahora si la observamos bien, vemos que esta compuesta por 6 partes:

  1. frame= 2528, indica el frame actual de la conversión.
  2. fps=167, cantidad de cuadros por segundo a la que se hace la conversión.
  3. q=27.0, calidad
  4. size = 5246, tamaño en Kbytes.
  5. time = 00:01:43.27, tiempo actual de la conversión
  6. bitrate= 416.1kbits/s , bitrate actual.
La parte que nos interesa es la parte que marca la posicion del tiempo en la que se encuentra la conversión. para eso lo que hacemos es pasar la linea de ffmpeg (mas adelante vermos como redirigir la salida de ffmpeg a nuestro programa) cómo parámetro a la función GetPositionFromFFLine.
Primero comprueba que la línea empiece con "FRAME", luego, separa la parte del tiempo, en este caso al usar la funcion split con parametro "(char)61" (simbolo de igual "="), luego convierte el tiempo a segundos y lo regresa como resultado.
Obviamente esta funcion no es a prueba de errores, de hecho aumimos que el tiempo estará formateado de la forma HH.MM.SS.CC, pero sei en algun momento alguien intentara convertir un vide de 100 horas de duracion, VEncoder simplemente marcaría un error.
Igual que la funcion anterior, no esta optimizada, lo ideal seria usar expresiones regulares, pero por ahora esto, más adelante actualizaremos todas las funciones.

Por ahora es todo. Los leo luego.

No hay comentarios.