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

El día de hoy vamos a continuar con el código fuente de VEncoder 2, la última vez, analizamos las primeras dos funciones, estas se encargaban de cargar y guardar los archivos VEPX, han pasado algunos días, y si no has revisado el código fuente aún, sugiero que lo revises antes de continuar con el resto.

Función FixTimeDuration

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

private int FixTimeDuration(int Duration)
{
  if (Duration < 3600)
  {
    return Duration + 1;
    }else{
    return Duration + 60;
  }
}


Cuando obtenemos el tiempo usando la librería MediaInfoNet, a veces regresa el tiempo de forma redondeada hacia abajo, por ejemplo; un vídeo que dura 01:05:35.21, en algunas ocasiones si es que el vídeo no tiene la información correcta, regresara solo el valor "entero" de los segundos; tómese el ejemplo anterior, el tiempo 01:05:35.21 al pedirle a MediaInfoNet regresaría el valor de 01:05:35.00; al asignar las propiedades a los controles ProgressBar, sin el ajuste al pasar del tiempo 01:05:35.00 a 01:05:35.01, provocaría un error.

La función FixTimeDuration, corrige el error agregando 1 o 60 segundos, si la duración del vídeo es menor a una hora, solo agrega un segundo; en caso contrario agrega 60 segundos a la duración total del vídeo.
Ahora te preguntaras: ¿por que 60, por que 1?, debido a que pierde precisión cuando el tiempo pasa de una hora y redondea los minutos hacia abajo; es decir, el tiempo 01:01:40.32, directamente MediaInfoNet, lo devuelve como 01:01:00.00. Entonces para evitar eso, usamos esta función.

La función recibe un parámetro del tipo int que es equivalente a la duración del vídeo en segundos. Regresa un valor del tipo int que es el equivalente a la duración del vídeo en segundos +1 o +60 dependiendo del caso.

La forma de solucionarlo es obtener primero el tiempo usando el mismo FFMpeg, analizar la línea en donde nos proporciona el tiempo y solo asignarlo, pero los cambios los veremos después, ahora pasemos a la siguiente función.

Funcion TiempoRestante

El codigo de la funcion TiempoRestante es el siguiente:

         private Single TiempoRestante(Single Porciento,int TransTime)
         {
             Single Z;
             //z = tiempo gastado por cada 1%
             if (Porciento == 0)
             {
                 Porciento = 1;
             }
             Z = TransTime / Porciento;
             return (100 - Porciento) * Z;
         }


Esta funcion se encarga de obtener el tiempo restante para un proceso, para usarlo, se le pasan dos argumentos; uno del tipo Single y una del tipo int. Es realmente simple, pero hablemos un poco más acerca de esto. como muchos sabrán, cuando hablamos de cálculos de tiempo, en computación no suelen ser tan fáciles. Y para este caso no es la excepción.
Para empezar analicemos un poco cual es la "ecuación" para calcular el tiempo restante. Supongamos que tenemos hambre y nos da por comer manzanas, comemos 1 y nos sentimos 20% satisfechos, para saber cuantas manzanas necesitamos comer, lo que debemos de hacer es dividir lo que nos falta para saciarnos entre la cantidad que nos llena una manzana; retomando la metáfora anterior, si una manzana nos llenó en un 20%, significa que nos resta el 80%, dividiendo queda que necesitamos 4 manzanas más para saciarnos.
Para la función es relativamente lo mismo, lo primero que hacemos es obtener cuanto tiempo nos llevo avanzar un 1%, después lo que hacemos es descontar el porcentaje actual del 100% y lo multiplicamos por el tiempo que lleva cada 1%,  ¡Simple!., lo sería pero no todo en la vida es fácil, al igual que  si tratáramos de determinar cuantas manzanas bastaran para saciar tu hambre, podemos decir un estimado, pero no una cantidad exacta, lo mismo pasa con el calculo del tiempo para procesos de este tipo, podemos estimar el tiempo aproximado restante, pero no tendremos una certeza del 100%. Ademas cuando se hacen las conversiones; en el caso concreto de VEencoder2, se le puede indicar al programa que queremos hacer la conversión en dos pasos. Y siempre la primera es hasta 10 veces más rápida, entonces determinar el tiempo necesario para todo el proceso de conversión en un solo archivo resulta difícil, ahora para 10 archivos será peor. Entonces esta funcion cumple su objetivo ya que devuelve el tiempo estimado del proceso que se ejecuta, en nuestra aplicación, regresa el tiempo para cada "pasada". Resulta en un "placebo" para el usuario, pero sirve ya que en mi caso (supongo que no soy el unico) saber más o menos cuanto tiempo falta para algo, ayuda un poco.

Bueno por ahora es todo en el siguiente post continuaremos con las revisiones a las funciones de VEncoder2, recuerda que recomiendo revisar el código fuente para que resulte más fácil entender de lo que hablo.

Los leo luego

No hay comentarios.