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.