Trabajo con vídeo y audio en servidores linux con php. Parte III

19 de Mayo de 2009

En esta parte vamos a aprender a obtener la información de un vídeo, dimensiones, duración, etc.

Lo primero inicializamos la clase de FFMPEG-PHP que ya está instalamos en la primera parte, pasándole como parámetro la ruta absoluta de donde está nuestro archivo de vídeo.


$ffmpegObj = new ffmpeg_movie($archivo);

Obtenemos la duración en segundos del mismo.

$duration = $ffmpegObj->getDuration();

Obtenemos al anchura

$video_width = $ffmpegObj->getFrameWidth();

Obtenemos la altura

$video_height = $ffmpegObj->getFrameHeight();

Y por último obtenemos el tamaño. (yo tengo una función programada para obtener el tamaño que no explicaré aquí.)


$kb = filesize($dest)/1024;
$video_size = $kb/1024;

Podéis encontrar todas las funciones disponibles del FFMPEG-PHP aquí.

http://www.dranger.com/ffmpeg/functions.html

Bien, ahora viene la parte mas interesante, conversión, capturas, etc.
Lo primero será definir los paths de las herramientas que vamos a usar.

$mplayer =& Program::factory('mplayer', array('debug' => true, 'binary' => '/usr/local/bin/mplayer'));
$mencoder =& Program::factory('mencoder', array('debug' => true, 'binary' => '/usr/local/bin/mencoder'));
$flvtool2 =& Program::factory('flvtool2', array('debug' => true, 'binary' => '/usr/bin/flvtool2'));
$ffmpegPath = "/usr/local/bin/ffmpeg";
$mencoderPath = "/usr/local/bin/mencoder";
$flvtool2Path = "/usr/bin/flvtool2";

Ahora un truco que a mi al menos me parece muy útil, por eso investigué sobre ello.
Como los procesos de conversión de vídeo usan mucho micro y mucha ram, vamos a comprobar antes de ponernos a hacer nada, que no haya en el servidor ningún proceso de conversión ejecutandose.
Comprobaremos tanto mencoder como ffmpeg (que no es lo mismo que FFMPEG-PHP)


$c_pid = exec("ps aux | grep mencoder | grep -v grep | grep -v su | awk {'print $3'}");
$f_pid = exec("ps aux | grep ffmpeg | grep -v grep | grep -v su | awk {'print $3'}");

Si no hay ningún proceso en ejecución procedemos con la conversión

if ($c_pid == "" and $f_pid == "") {
#########AQUI VAN LOS SCRIPTS DEL RESTO DEL ARTICULO########
}

Yo particularmente acostumbro a renombrar los archivos subidos por los usuarios para que no haya problemas de nombres.
GenerateCode genera una cadena alfanumérica de los caracteres especificados.


$video_filename = generateCode(15);

Ahora vamos a separar el nombre del archivo de su extensión.
Para ello me he programado dos funciones, getName y getExtension.

$file_name = getName($archivo);
$file_type = getExtension($archivo);

Por comodidad, voy a definir el path al directorio donde tenemos el video, el path del archivo original y el path del archivo de salida una vez convertido


$video_path = “/path_al_directorio/”;
$inputFile = $video_path . $tarchivo;
$outputDir = $video_path;
$outputFile = $video_path .$video_filename . '.flv';

Ya puestos de definir cosas definimos también el nombre que tendrá la captura, que será el mismo que el del vídeo.


$video_thumb = $video_filename.".jpg";

Bien, ahora vamos a convertir los videos, pero como cada tipo de video tiene sus caracteristicas propias, pues los convertiremos de forma independiente.

switch (strtolower($file_type)){
case "avi":

/*@var $mencoder Program_mencoder */
$mencoder -> setInputFile($inputFile);
$mencoder -> setOutputFile($outputFile);

//definir tamano del video
$mencoder -> setScale("480","360");

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

//obtenemos la captura
exec($ffmpegPath." -i ".$inputFile." -t 00:00:05 -ss 00:00:05 -vframes 1 ".$outputDir."foto%d.jpg");
//renombramos el archivo resultante
if (file_exists($outputDir."foto1.jpg")) {
rename($outputDir."foto1.jpg",$outputDir.$video_thumb);

}

//convertimos a flv
$res = $mencoder -> convertToFLV();

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "mkv":

/*@var $mencoder Program_mencoder */
$mencoder -> setInputFile($inputFile);
$mencoder -> setOutputFile($outputFile);

//definir tamano del video
$mencoder -> setScale("480","360");

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

//generamos la captura y la cambiamos de nombre
exec("/usr/local/bin/mplayer ".$inputFile." -nosound -vo jpeg:outdir=".$outputDir." -vf framestep=1 -fps 12 -frames 1");

if (file_exists($outputDir."00000001.jpg")) {
rename($outputDir."00000001.jpg", $outputDir.$video_thumb);
}

//Convertimos el archivo

exec($ffmpegPath . " -i " . $inputFile . " -sameq -ar 22050 -ab 64 -aspect 4:3 -r 15 -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $outputFile . " | " . $flvtool2Path . " -U " . $outputFile." ".$outputFile );

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "wmv":

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

//generamos la captura y la cambiamos de nombre
exec("/usr/local/bin/mplayer ".$inputFile." -nosound -vo jpeg:outdir=".$outputDir." -vf framestep=1 -fps 12 -frames 1");

if (file_exists($outputDir."00000001.jpg")) {
rename($outputDir."00000001.jpg", $outputDir.$video_thumb);
}

$srcWidth = '480';
$srcHeight = '360';

//convertimos el archivo
exec($ffmpegPath . " -y -i " . $inputFile . " -r 12 -ab 64 -acodec libmp3lame -ar 22050 -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $outputFile . " | " . $flvtool2Path . " -U " . $outputFile." ".$outputFile );

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "asf":

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

//generamos la captura y la cambiamos de nombre
exec("/usr/local/bin/mplayer ".$inputFile." -nosound -vo jpeg:outdir=".$outputDir." -vf framestep=1 -fps 12 -frames 1");

if (file_exists($outputDir."00000001.jpg")) {
rename($outputDir."00000001.jpg", $outputDir.$video_thumb);
}

$srcWidth = '480';
$srcHeight = '360';

//Convertimos a flv
exec($ffmpegPath . " -y -i " . $inputFile . " -r 12 -ab 64 -acodec libmp3lame -ar 22050 -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $outputFile . " | " . $flvtool2Path . " -U " . $outputFile." ".$outputFile );

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "mov":

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

//obtenemos la captura
exec($ffmpegPath." -i ".$inputFile." -t 00:00:02 -ss 00:00:02 -vframes 1 ".$outputDir."foto%d.jpg");
//renombramos el archivo resultante
if (file_exists($outputDir."foto1.jpg")) {
rename($outputDir."foto1.jpg",$outputDir.$video_thumb);

}

$srcWidth = '480';
$srcHeight = '360';

//convertimos el video
exec($ffmpegPath . " -i " . $inputFile . " -ar 44100 -ab 96 -aspect 4:3 -b 400k -minrate 400k -maxrate 400k -bufsize 185k -r 15 -f flv -s " . $srcWidth . "x" . $srcHeight . " " . $outputFile . " | " . $flvtool2Path . " -U " . $outputFile." ".$outputFile );

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "mpg":

/*@var $mencoder Program_mencoder */
$mencoder -> setInputFile($inputFile);
$mencoder -> setOutputFile($outputFile);

//definir tamano del video
$mencoder -> setScale("480","360");

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

//obtenemos la captura
exec($ffmpegPath." -i ".$inputFile." -t 00:00:05 -ss 00:00:05 -vframes 1 ".$outputDir."foto%d.jpg");

//renombramos el archivo resultante
if (file_exists($outputDir."foto1.jpg")) {
rename($outputDir."foto1.jpg",$outputDir.$video_thumb);

}

//convertimos a flv

exec($ffmpegPath." -i ". $inputFile." -ar 22050 -ab 32 -f flv -s 480x360 -aspect 4:3 -y ".$outputFile);

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "mpeg":

/*@var $mencoder Program_mencoder */
$mencoder -> setInputFile($inputFile);
$mencoder -> setOutputFile($outputFile);

//definir tamano del video
$mencoder -> setScale("480","360");

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

/*@var $mplayer Program_mplayer */
$mplayer -> setInputFile($inputFile);
$mplayer -> setOutputDir($outputDir);

//obtenemos la captura
exec($ffmpegPath." -i ".$inputFile." -t 00:00:05 -ss 00:00:05 -vframes 1 ".$outputDir."foto%d.jpg");
//renombramos el archivo resultante
if (file_exists($outputDir."foto1.jpg")) {
rename($outputDir."foto1.jpg",$outputDir.$video_thumb);

}

//convertimos a flv

exec($ffmpegPath." -i ". $inputFile." -ar 22050 -ab 32 -f flv -s 480x360 -aspect 4:3 -y ".$outputFile);

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
unlink($video_path . $tmp_video_filename);
break;

case "flv":

/*@var $flvtool2 Program_flvtool2 */
$flvtool2 -> setInputFile($outputFile);
$flvtool2 -> setOutputFile($outputFile);

//obtenemos la captura
exec($ffmpegPath." -i ".$inputFile." -t 00:00:05 -ss 00:00:05 -vframes 1 ".$outputDir."foto%d.jpg");
//renombramos el archivo resultante
if (file_exists($outputDir."foto1.jpg")) {
rename($outputDir."foto1.jpg",$outputDir.$video_thumb);

}
//movemos el archivo de sitio
rename($inputFile,$outputFile);

//convertimos a flv
exec($mencoderPath. " ". $inputFile." -o ".$outputFile." -noskip -mc 0 -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=480:360 -srate 22050 >/dev/null &");

//actualizamos los datos del flv
$res = $flvtool2 -> updateMetaTags();

//borramos el archivo de origen
@unlink($inputFile);
break;

}

Bueno, pues como habreis visto, para no alargar en exceso el articulo, he ido comentando cada una de las partes del script.

Trabajo con vídeo y audio en servidores linux con php. Parte II

15 de Abril de 2009

En este segundo artículo vamos a intentar seguir el orden lógico de las cosas.

Voy a enseñaros a usar un sistema que a mi me parece útil e interesante para subir vuestros vídeos.

El sistema en cuestión es el SWFUpload

IMPORTANTE: En algunos lugares quito el simbolo menor que (< ) del inicio de los scripts para que el blog no lo interprete.

Lo primero será descargar el SWFUpload de la web.

Creamos el archivo que usaremos para subir los vídeos y comenzamos insertando los CSS y JS pertinentes.

script src="/swfupload/swfupload.js" type="text/javascript">
script src="/js/fileprogress.js" type="text/javascript">
script src="/js/handlers.js" type="text/javascript">

Ahora definimos los parámetros del SWFUpload.

Vamos a fijarnos particularmente en estos parámetros:
upload_url --> Path al archivo upload.php que es será el encargado de mover el archivo a su ubicacion definitiva y hacer varias comprobaciones.

file_size_limit --> Tamaño máximo en bytes que permitiremos subir.

file_types --> Tipos de archivos que se permiten subir.

flash_url --> Ubicacion del archivo swf relativo al archivo actual.

Ahora vamos con la parte del HTML

Aparte de todo el resto de campos que deseeis insertar vosotros, aqui va la parte del uploader.

input id="txtFileName" style="border: solid 1px; background-color: #FFFFFF;" disabled="disabled" type="text" tabindex="3" />
(100 MB max)
div id="fsUploadProgress" class="flash">
input id="hidFileID" name="hidFileID" type="hidden" />

Ahora vamos a meternos con el archivo upload.php
Este es el encargao de recibir el archivo, guardarlo y pasarle el ID al archivo html desde el cual mostramos el uploader.

Lo primero es comprobar las sessiones.

< ?php

if (isset($_POST["PHPSESSID"])) {
session_id($_POST["PHPSESSID"]);
} else if (isset($_GET["PHPSESSID"])) {
session_id($_GET["PHPSESSID"]);

session_start();
}

Tras eso volvemos a comprobar el tamaño maxino del archivo subido pero ya por parte del server

$POST_MAX_SIZE = ini_get('post_max_size');
$unit = strtoupper(substr($POST_MAX_SIZE, -1));
$multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1)));

Si se pasa cantamos el mensaje de error

if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) {
header("HTTP/1.1 500 Internal Server Error");
echo "POST exceeded maximum allowed size.";
exit(0);
}

Definimos el path donde guardar el archivo

$save_path = "/MI_RUTA/";

Especificamos el nombre del archivo

$upload_name = "resume_file";

El tamaño en bytes

$max_file_size_in_bytes = 2147483647;				// 2GB in bytes

El tipo de archivos soportado

$extension_whitelist = array("avi", "wmv", "mpg", "mpeg", "mov", "rm", "ram", "swf", "asf", "flv", "mkv");

Los caracteres permitidos en el nombre del archivo

$valid_chars_regex = '.A-Z0-9_!@#$%^&()+={}\[\]\',~`-`';

El numero de caracteres maximo del nombre del archivo

$MAX_FILENAME_LENGTH = 260;

Declaramos y vaciamos las variables de nombre del archivo y la extension

$file_name = "";
$file_extension = "";

Definimos una serie de errores tipicos

$uploadErrors = array(
0=>"There is no error, the file uploaded with success",
1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini",
2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
3=>"The uploaded file was only partially uploaded",
4=>"No file was uploaded",
6=>"Missing a temporary folder"
);

Y procedemos a validar la subida

if (!isset($_FILES[$upload_name])) {
HandleError("No upload found in \$_FILES for " . $upload_name);
exit(0);
} else if (isset($_FILES[$upload_name]["error"]) && $_FILES[$upload_name]["error"] != 0) {
HandleError($uploadErrors[$_FILES[$upload_name]["error"]]);
exit(0);
} else if (!isset($_FILES[$upload_name]["tmp_name"]) || !@is_uploaded_file($_FILES[$upload_name]["tmp_name"])) {
HandleError("Upload failed is_uploaded_file test.");
exit(0);
} else if (!isset($_FILES[$upload_name]['name'])) {
HandleError("File has no name.");
exit(0);
}

Validamos el tamaño del archivo

$file_size = @filesize($_FILES[$upload_name]["tmp_name"]);
if (!$file_size || $file_size > $max_file_size_in_bytes) {
HandleError("File exceeds the maximum allowed size");
exit(0);
}

if ($file_size < = 0) {
HandleError("File size outside allowed lower bound");
exit(0);
}

Validamos el nombre del archivo y sustituimos ciertos caracteres invalidos

$file_name = preg_replace('/[^'.$valid_chars_regex.']|\.+$/i', "", basename($_FILES[$upload_name]['name']));
if (strlen($file_name) == 0 || strlen($file_name) > $MAX_FILENAME_LENGTH) {
HandleError("Invalid file name");
exit(0);
}

Comprobar que no existe un archivo con el mismo nombre

if (file_exists($save_path . $file_name)) {
HandleError("File with this name already exists");
exit(0);
}

Validar extensiones de archivos aceptadas

$path_info = pathinfo($_FILES[$upload_name]['name']);
$file_extension = $path_info["extension"];
$is_valid_extension = false;
foreach ($extension_whitelist as $extension) {
if (strcasecmp($file_extension, $extension) == 0) {
$is_valid_extension = true;
break;
}
}
if (!$is_valid_extension) {
HandleError("Invalid file extension");
exit(0);
}

Comprobar que el archivo se ha guardao correctamente

if (!@move_uploaded_file($_FILES[$upload_name]["tmp_name"], $save_path.$file_name)) {
HandleError("File could not be saved.");
exit(0);
}

Devolver la salida al navegador

exit(0);

Y aqui tenemos la funcion encargada de dar los errores

function HandleError($message) {
header("HTTP/1.1 500 Internal Server Error");
echo $message;
}

?>

Por ultimo nos queda la pagina que se encarga de recoger los datos del formulario que hemos creado.

Lo primero que tenemos que hacer es comprobar si el archivo se ha subido con SWFUpload o de forma tradicional via HTML

$used_degraded = false;
    $resume_id = "";
    if (isset($_FILES["resume_degraded"]) && is_uploaded_file($_FILES["resume_degraded"]["tmp_name"]) && $_FILES["resume_degraded"]["error"] == 0) {
        $resume_id = $_FILES["resume_degraded"]["name"];
        $used_degraded = true;
    }

Ahora obtenemos el ID (nombre del archivo) que genero el SWFUpload

if (isset($_POST["hidFileID"]) && $_POST["hidFileID"] != "" ) {
        $resume_id = $_POST["hidFileID"];
    }

En el siguiente artículo veremos como obtener duración, dimensiones, etc de este archivo para posteriormente tratar con el.

Espero que esto que estoy haciendo os guste.

Salu2.

SauronZ

Trabajo con vídeo y audio en servidores linux con php. Parte I

13 de Abril de 2009

Esto, por lo que creo va a ser el inicio de una larga serie de artículos, en el cual trataré de explicar de la mejor manera posible como montar un sistema de publicacion de videos con todo lo que conlleva.

Conversión, capturas, previews, streaming, etc.

Para poder desarrollar estas tareas es necesario cumplir con ciertos requisitos técnicos.
Lo primero es, en mi caso, trabajar con una máquina linux.
Para poder convertir los vídeos y audios lo que vamos a montar es lo siguiente:

- FFmpeg
- FFmpeg-PHP
- Mplayer + Mencoder
- flv2tool
- LAME MP3 Encoder
- Libogg
- Libvorbis
- Faac
- Xvidcore
- Amr

Posteriormente para el streaming de vídeo montaremos el Red5.

Comencemos con la instalación de los codecs, conversores, etc.

1.- Tendremos que entrar a nuestro server via SSH como root.

2.- Entramos en el directorio donde descargaremos todo.


cd /usr/local/src

3.- Instalamos Faac

wget http://mesh.dl.sourceforge.net/sourceforge/faac/faac-1.26.tar.gz
tar -zxf faac-1.26.tar.gz
cd faac
sh bootstrap
./configure
make
make install
cd ..

4.- Instalamos Xvidcore


wget http://downloads.xvid.org/downloads/xvidcore-1.1.2.tar.gz
tar xzf xvidcore-1.1.2.tar.gz
cd xvidcore-1.1.2/build/generic
./configure
make
make install
cd ../../..

5.- Instalamos el Lame MP3


wget http://surfnet.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz
tar fxvz lame-3.97.tar.gz
cd lame-3.97
./configure --enable-shared
make
make install
cd ..
echo "/usr/local/lib/" >>/etc/ld.so.conf
ldconfig

6.- Ahora vamos con el Amr


wget http://ftp.penguin.cz/pub/users/utx/amr/amrnb-7.0.0.2.tar.bz2
tar -xvjf amrnb-7.0.0.2.tar.bz2
cd amrnb-7.0.0.2
./configure
make
make install
cd ..
ldconfig

wget http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.3.tar.bz2
tar -xvjf amrwb-7.0.0.3.tar.bz2
cd amrwb-7.0.0.3
./configure
make
make install
cd ..
ldconfig

wget http://liba52.sourceforge.net/files/a52dec-0.7.4.tar.gz
tar fxvz a52dec-0.7.4.tar.gz
cd a52dec-0.7.4
./configure
make
make install
cd ..
ldconfig

7.- Vamos con el libvorbis


wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.0.zip
unzip libvorbis-1.2.0.zip
cd libvorbis-1.2.0
./configure
make
make install
cd ..
ldconfig

8.- Ahora libogg


wget http://downloads.xiph.org/releases/ogg/libogg-1.1.3.tar.gz
tar -xvzf libogg-1.1.3.tar.gz
cd libogg-1.1.3
./configure
make
make install
cd ..
ldconfig

9.- Ahora instalamos el FFmpeg mediante svn


svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
cd ffmpeg

./configure --prefix=/usr/local --enable-libxvid --enable-gpl --enable-shared --enable-pthreads --enable-libmp3lame --enable-libfaac --enable-libvorbis --enable-libamr-nb --enable-libamr-wb --enable-nonfree --enable-libfaad
make clean
make
make install
cd ..

10.- Vamos a por el flvtool2


wget http://rubyforge.org/frs/download.php/17497/flvtool2-1.0.6.tgz
tar fxvz flvtool2-1.0.6.tgz
cd flvtool2-1.0.6
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install
cd ..

11.- Ahora codecs varios


mkdir /usr/local/lib/codecs
wget http://www7.mplayerhq.hu/MPlayer/releases/codecs/essential-20071007.tar.bz2
tar fxvj essential-20071007.tar.bz2
chown root.root essential-20071007/ -R
cp essential-20071007/* /usr/local/lib/codecs
ldconfig

12.- Instalación de mencoder


wget http://www7.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc2.tar.bz2
tar fxvj MPlayer-1.0rc2.tar.bz2
cd MPlayer-1.0rc2
./configure
make
make install
cd ..

13.- Instalación de FFmpeg-PHP


wget http://mesh.dl.sourceforge.net/sourceforge/ffmpeg-php/ffmpeg-php-0.5.3.1.tbz2
tar fxvj ffmpeg-php-0.5.3.1.tbz2
cd ffmpeg-php-0.5.3.1
phpize
./configure
make
make install
cp /usr/local/lib/php/extensions/no-debug-non-zts-20020429/ffmpeg.so /usr/local/lib/php/extensions/
cp /usr/local/lib/php/extensions/no-debug-non-zts-20060613/ffmpeg.so /usr/local/lib/php/extensions/
echo 'extension="ffmpeg.so"' >> /usr/local/lib/php.ini

14.- Creacion de los enlaces simbólicos


ln -s /usr/local/bin/ffmpeg /ffmpeg
ln -s /usr/bin/flvtool2 /flvtool2
ln -s /usr/local/bin/mencoder /mencoder
ln -s /usr/local/bin/mplayer /mplayer

Ahora una vez terminado con todo lo referente a conversión vamos a proceder a instalar el servidor de Streaming Red5.

1.- Necesitamos tener instalado el java JDK y el SDK, por lo tanto nos lo bajamos de la pagina de SUN.
Los encontraremos en la pagina http://java.sun.com/javase/downloads/index_jdk5.jsp
Yo os recomiendo que descargeis el jdk-1_5_0_15-linux-i586.bin y una vez descargado para ejecutarlo:


./jdk-1_5_0_15-linux-i586.bin

2.- Tambien necesitamos Apache Ant para poder trabajar con Red5. Procedemos a su descarga e instalación.


wget http://apache.mirror.transip.nl/ant/binaries/apache-ant-1.7.0-bin.tar.gz
tar -zxf apache-ant-1.7.0-bin.tar.gz
mv apache-ant-1.7.0 /opt/ant
export ANT_HOME=/opt/ant
ln -s /opt/ant/bin/ant /usr/bin/ant

3.- Ahora instalamos el Red5 por SVN


svn co http://red5.googlecode.com/svn/java/server/trunk red5

4.- Una vez tenemos descargados los fuentes de Red5 exportamos las variables con los paths (verifica que en tu caso son los correctos segun la version de java que hayas descargado)


export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun/
export ANT_HOME=/opt/ant/

5.- Procedemos a compilar


cd red5
/opt/ant/bin/ant prepare
/opt/ant/bin/ant dist

6.- Ahora el directorio “dist” contiene los archivos ya compilados y listos para ser ejecutados.


cd dist
sh red5.sh

7.- Ahora Red5 ya tiene que estar corriendo en el puerto 5080 y el servicio rtmp en el puerto 1935.
Puedes probarlo accediendo desde el servidor a la siguiente url: http://localhost:5080/demos/port_tester.swf

O bien si tienes el Nmap instalado mediante:


nmap -v localhost

Con todo este rollo ya tendremos todas las herramientas necesarias para poder trabajar con archivos de audio y video asi como poder ofrecer streaming, grabación online, edición y un sinfín de utilidades más.

En la parte II. veremos donde ubicar los archivos subidos, como editarlos, generar capturas, previews, etc.

Pero eso será una historia que deberá contarse en otro momento….

SauronZ

Crear archivo excel con php

13 de Abril de 2009

Bueno, en esta primera entrada vamos a hacer algo realmente sencillo.

Me acaban de pedir que exporte un listado de artículos de una tienda que he desarrollado a un archivo de excel y que sea descargable.

lo primero que haremos sera hacer el include de la clase encargada de hacer todo el trabajo sucio.

include("includes/excelwriter.inc.php");

tras ello especificamos la ruta donde guardaremos nuestro archivo:

$excel=new ExcelWriter("/ruta_destino/miXls.xls");

Ahora comprobamos que no haya ningun error en la ruta del fichero y que haya permisos de escritura, recuerda que el directorio donde se va a ubicar el archivo de salida ha de tener permisos de escritura.

if($excel==false)
echo $excel->error;

Ahora toca la parte de rellenar el archivo de excel.
Primero definimos las columnas metiendo los valores en un array y procedemos a escribirlo:

$myArr=array("PRODUCTO","MARCA","MODELO","COLORES","PRECIO","PR. OFERTA");
$excel->writeLine($myArr);

Ahora creamos el salto de fila para que quede mas chulo:

$myArr=array(" "," "," "," ", " "," ");
$excel->writeLine($myArr);

Y el resto de valores de la tabla de excel pues o bien lo meteis a mano o bien los sacais de la base de datos y los meteis en el array tal y como he hecho con la fila de campos en blanco.

Una vez rellenado el archivo de excel con los datos que queremos procedemos a cerrar el archivo:

$excel->close();

Como veis no tiene ningun misterio ya que la clase excelwriter hace todo el trabajo arduo por nosotros.

Para hacer el archivo descargable, ¿no os tengo que decir que con un link vale no?
O un link o se lo pasais a la cabecera del navegador

Podeis descargaros la clase desde esta url:
http://www.phpclasses.org/browse/package/2037.html

Nada que decir…

9 de Febrero de 2009

Hola a tod@s!

Bueno, pues tal y como su título indica, he montado este blog porque no tengo nada que decir.

Así que espero que lo que vayais encontrando os guste ;-)

Salu2.

SauronZ