1. ¡OFERTA! con cupón "DIRVPS": hosting por $0,01 y también VPS Linux y Windows por $0,01 el primer mes por Interserver ← publi
    Descartar aviso
Descartar aviso
Al usar este sitio web, aceptas que nosotros y nuestros socios podamos establecer cookies para fines tales como personalizar el contenido y la publicidad. Más información.

PHP exec() leer variables y convertir Videos de FLV al formato MP4..!

Tema en 'Programación y Diseño Web' iniciado por Maximo, 4 Sep 2013.

  1. Maximo

    Maximo Nuevo usuario

    Hola a todos.
    Estoy utilizando una cadena en php con exec(); para pasar la variable UID a un archivo PHP y convertir un vídeo de formato FLV a MP4 con Linux recogiendo el UID desde la base de datos MYSQL.

    El código para convertir el vídeo es este:

    convertir.php
    CODE, HTML o PHP Insertado:
    $vid = $_GET['vid']; 
    exec("php "flv2mp4.php?uid=$vid" > /dev/null &");
    
    y el archivo de conversión: flv2mp4.php
    CODE, HTML o PHP Insertado:
    $db_name = 'videos';  // MySQL database name
    $db_user = 'usuario';  // MySQL username
    $db_pass = 'demo';  // MySQL password
    $db_host = 'localhost';
    
    $getuid = _GET['uid'];
    
    $conexion = mysql_connect($db_host, $db_user, $db_pass );
    mysql_select_db($db_name, $conexion);
    
    // Leemos info de la base de datos
    $result = mysql_query("SELECT uniq_id,url_flv,url_mp4 FROM videos WHERE uniq_id = '$getuid'", $conexion);
    $table = mysql_fetch_array($result);
    
    $uniq_id = $table['uniq_id'];
    $url_flv = $table['url_flv'];
    
    
    $imp4 = $uniq_id."-1.mp4";
    
    // Actualizamos la base de datos con la informacion necesaria
    $sql = "UPDATE videos SET url_mp4 ='".$imp4."' WHERE uniq_id = '".$uniq_id."'";
    mysql_query($sql);
    
    $original = "../uploads/videos/".$url_flv."";
    $final = "../uploads/videos/mp4/".$uniq_id."-1.mp4";
    
    // Creamos el comando ffmpeg
    $ffmpeg_cmd = "ffmpeg -y -i $original -acodec libfaac -ab 64k -ar 44100 -vcodec mpeg4 -b 300K $final 2>&1";
    
    @exec($ffmpeg_cmd);
     
    echo "terminado..";
    
    El siguiente código en el linux funciona correctamente:
    CODE, HTML o PHP Insertado:
    ffmpeg -y -i $original -acodec libfaac -ab 64k -ar 44100 -vcodec mpeg4 -b 300K $final 2>&1
    
    El problema esta que el primer php (convertir.php) en donde recoge la UID del video no pasa la variables con el exec();

    Alguien tiene alguna mejor idea de como puedo hacer que pase las variables?

    Gracias y un saludo
     
  2.  
  3. egrueda

    egrueda Usuario activo

    Bueno, creo que en tu ejemplo han bailado las comillas :) pero recuerda que estás usando PHP en modo CLI (línea de comandos), y hay algunas cosas que funcionan distintas del "modo web". Por ejemplo, tienes disponibles en tu script las variables $argc y $argv, como en lenguaje C, donde tienes todos los argumentos que le han pasado a tu script.
    Más info sobre PHP cli: http://php.net/manual/es/features.commandline.php

    Por otro lado, si lo he entendido bien:
    1. registras un vídeo en la base de datos
    2. recoges el ID de ese vídeo
    3. envías el ID del vídeo a un script
    4. el script busca un vídeo en la base de datos usando el ID

    ¿Por qué no mejor los procesas "offline"? Es decir, metes el vídeo en la base de datos y lo marcas como "pendiente de procesar" en la propia tabla.
    Después un script buscará los pendientes de procesar, les cambiará el estado a "Procesando" y comenzará la conversión.
    Cuando termine, les cambiará el estado a "Procesado".
    Y así el usuario no tiene que esperar cada vez que sube un vídeo, simplemente los manda y se quedan en la cola de proceso para que el script los procese.

    ¿Me sigues?
     
  4. Maximo

    Maximo Nuevo usuario

    Hola egrueda, muchas gracias por contestar.

    llevas razón, el problema siempre esta en comillas, pero sin ellas tampoco funciona.
    He utilizado también las variables $argc y $argv con ( -- $uid ) en el exec(); y tampoco me funciona.

    Sobre lo de la base de datos, si exacto, ahí tengo las tablas con campos en donde están los registros del vídeo por ejemplo.
    uid = 458kpm452;
    url_flv = 458kpm452.flv;
    url_mp4 = ' '; //<-- se supone que tiene que hacer un update (458kpm452.mp4) después que el vídeo se convierte en formato mp4 y guardarlo en la carpeta: ../uploads/videos/mp4/
    * El UID corresponde al nombre del vídeo con la extensión (FLV) que ya existe en la carpeta: ../uploads/videos/458kpm452.flv

    * Lo de procesarlo offline es una buena idea, pero claro ahí ya ni idea de como hacerlo.
    * Me has comentado lo siguiente: (Cuando termine, les cambiará el estado a "Procesado".) - eso no lo sabia que se podia hacer con el exec(); existe algún código que realiza esta acción?

    Ahora iré a revisar la pagina que me has pasado, muchas gracias por tu tiempo.

    Un cordial saludo.

     
  5. egrueda

    egrueda Usuario activo

    Para usarlas, debes pasarle los parámetros de la forma correcta, con espacios, sin usar la interrogación:
    CODE, HTML o PHP Insertado:
    php mi_script.php uid=123 foo=bar
     
  6. Maximo

    Maximo Nuevo usuario

    Hola de nuevo egrueda, gracias por contestar.
    Ya lo he conseguido, he leído la pagina que me has pasado y lo hice así:

    1. Con esta linea envío los parámetros.
    CODE, HTML o PHP Insertado:
    php convertir.php uid 458kpm452
    
    2. En el flv2mp4.php el código es así:

    CODE, HTML o PHP Insertado:
    if (isset($argv[1]) && isset($argv[2])) {
    echo 'flv2mp4.php?' . $argv[1] . '=' . $argv[2];
    }
    
    3. El resultado final que me da el flv2mp4.php es:
    CODE, HTML o PHP Insertado:
    flv2mp4.php?uid=458kpm452
    
    Hasta ahí todo perfecto.
    Ahora no quiero ser pesado, pero lo que me has comentado antes sobre (Cuando termine, les cambiará el estado a "Procesado".). Es una buena idea y buscare una solución de eso.

    Ahora voy a probar el resultado de la conversion y a ver si rula bien, te avisare.

    Muchas Gracias por tu tiempo.

    Un cordial Saludo

     
  7. Maximo

    Maximo Nuevo usuario

    Bueno... con el proceso anterior no me ha funcionado!!

    Asi que cambien el exec(); por system(); y ya funciona con los mismos parametros.

    Aqui dejo el codigo:

    system("php -f 'flv2mp4.php' 'vid' '$vid' ");

    Gracias
     
  8. Sphyr0

    Sphyr0 Usuario activo

    Según veo, convertir simplemente sirve de intermediario, ¿por qué no haces un include/require o copias el contenido de flv2mp4 en convertir? :)

    PHP:
    $vid $_GET['vid']; 
    # Remueves la siguiente línea
    # exec("php "flv2mp4.php?uid=$vid" > /dev/null &");
    include("flv2mp4.php"); # o código...
     
  9. guitobon

    guitobon Usuario activo

    Hacer esto lo veo problemático.
    En primer lugar por el tiempo que debe esperar el usuario.

    En segundo (el mas importante), es que para que funcione debes incrementar sin necesidad el limite de tiempo de ejecución y el limite de RAM, al menos para ese script PHP en entorno web.
    Si lo llamas desde línea de comandos, puedes tener 2 php.ini diferentes y así evitar problemas.
    Lo mas adecuado, como bien dicen es un proceso en segundo plano que busque videos sin "procesar". De esta forma también controlas la concurrencia. Cuatro conversores en paralelo, dependiendo del tamaño de los videos, te pueden freír el server.
     
  10. Sphyr0

    Sphyr0 Usuario activo

    Mi respuesta está basada en su script original, simplemente para pasar una variable y punto; que era en lo que tenía problemas. :)

    Desde luego, también creo muy conveniente la forma de controlar los videos con otro script, como menciona el compañero @egrueda (que sería una tarea programada, preferentemente), sin embargo, yo no cuestioné ese tema. :cool:
     
    Última edición: 9 Sep 2013
  11. guitobon

    guitobon Usuario activo

    Creo que no hay nada malo en dar mas información en un POST siempre y cuando se aporte algo.
    Como si alguien quiere sugerirle que para servir video lo apropiado es hacer streaming, y que el apache es capaz de servir videos de esta forma :)

    No pretendía corregirte. Siento si esa ha sido la impresión que he dado.
    Entre el Tablet y mis dedazos, hay veces que me es difícil, darle al botón apropiado, y atajo de la forma que no debo.
     
  12. Sphyr0

    Sphyr0 Usuario activo

    hehe, no problem, suele pasar.

    :cool:
     


Alojamiento web, Hosting Reseller, Servidores Dedicados - All in Hosting


    
    
    
    
Blog · Sitios amigos: GuiaHosting · Unidominios · Interalta ·