Cada día la experiencia que uno obtiene de la WEB es más personalizada, al punto que hay sitios que te permiten crear y manipular tus propios videos de manera online. En este pequeño post hablaré de cómo podemos implementar el uso de la librería FFMPEG con PHP para detectar la orientación de un video.
FFMPEG
FFMPEG es un conjunto de software libre orientado a la codificación, decodificación y streaming de audio y video; FFMPEG está disponible para Linux, Windows y OSX, si deseas obtener mayor información, puedes visitar su sitio oficial ffmpeg.org
Una vez instalado, podemos ejecutar el comando ffmpeg
desde la terminal y nos debe aparecer la siguiente salida
ffmpeg version N-49844-g1ac0fa5 Copyright (c) 2000-2013 the FFmpeg developers built on Feb 12 2013 17:42:46 with gcc 4.7.2 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib libavutil 52. 17.101 / 52. 17.101 libavcodec 54. 91.103 / 54. 91.103 libavformat 54. 63.100 / 54. 63.100 libavdevice 54. 3.103 / 54. 3.103 libavfilter 3. 37.101 / 3. 37.101 libswscale 2. 2.100 / 2. 2.100 libswresample 0. 17.102 / 0. 17.102 libpostproc 52. 2.100 / 52. 2.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Metadatos del Video
Mediante FFMPEG podemos obtener información relevante de un video, como lo son: codificación de video, codificación del audio, bitrate, dimensión, cuados por segundos (fps) entre otras. Para esto usamos la opción –i la cual nos permite especificar el archivo de entrada. En este ejemplo utilizaré el siguiente video: FFMPEG_INPUT_VIDEO.MOV
Salida al ejecutar el comando ffmpeg –i FFMPEG_INPUT_VIDEO.MOV
ffmpeg version N-49844-g1ac0fa5 Copyright (c) 2000-2013 the FFmpeg developers built on Feb 12 2013 17:42:46 with gcc 4.7.2 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib libavutil 52. 17.101 / 52. 17.101 libavcodec 54. 91.103 / 54. 91.103 libavformat 54. 63.100 / 54. 63.100 libavdevice 54. 3.103 / 54. 3.103 libavfilter 3. 37.101 / 3. 37.101 libswscale 2. 2.100 / 2. 2.100 libswresample 0. 17.102 / 0. 17.102 libpostproc 52. 2.100 / 52. 2.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'FFMPEG_INPUT_VIDEO.MOV': Metadata: major_brand : qt minor_version : 0 compatible_brands: qt creation_time : 2013-02-10 08:05:11 make : Apple make-eng : Apple encoder : 4.0.1 encoder-eng : 4.0.1 date : 2011-02-28T15:26:23-0800 date-eng : 2011-02-28T15:26:23-0800 location : +34.0977-118.3329+077.026/ location-eng : +34.0977-118.3329+077.026/ model : iPhone model-eng : iPhone Duration: 00:00:21.24, start: 0.000000, bitrate: 794 kb/s Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 k b/s Metadata: creation_time : 2013-02-10 08:05:11 handler_name : Core Media Data Handler Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 480x272, 725 kb/s, 30 fps, 30 tbr, 600 tbn, 1200 tbc Metadata: rotate : 90 creation_time : 2013-02-10 08:05:11 handler_name : Core Media Data Handler At least one output file must be specified
Como verán, FFMPEG nuestra información relevante acerca de este video, de entre los cuales podemos destacar rotate: 90
.
PHP y FFMPEG
Utilizando un script PHP podemos combinar el uso de FFMPEG para determinar si un video necesita rotación o no, para esto utilizare expresiones regulares
<?php // PTYDev FFMPEG Rotation Demo $rotate_pattern = "/rotate\\s*:\s*([0-9]+)/i"; $has_rotation = false; $cmd = 'ffmpeg -v verbose -i "FFMPEG_INPUT_VIDEO.MOV" 2>&1'; $video_info = shell_exec($cmd); //let's check against the rotation pattern preg_match($rotate_pattern,$video_info,$matches); if(is_array($matches)) { if(isset($matches[1])) { $has_rotation = true; } } //let's see if the video has rotation or not if($has_rotation) { echo "Video has rotation"; } else echo "Video doesn't has rotation"; ?>
Rotación del Video
Si detectamos que nuestro video tiene rotación, lo podemos cambiar utilizando el filtro de video transpose
que ofrece FFMPEG y escribimos el resultado final en otro archivo, en mi ejemplo es el FFMPEG_OUTPUT_VIDEO.MOV, a continuación el script completo
<?php // PTYDev FFMPEG Rotation Demo $rotate_pattern = "/rotate\\s*:\s*([0-9]+)/i"; $has_rotation = false; $cmd = 'ffmpeg -v verbose -i "FFMPEG_INPUT_VIDEO.MOV" 2>&1'; $video_info = shell_exec($cmd); //let's check against the rotation pattern preg_match($rotate_pattern,$video_info,$matches); if(is_array($matches)) { if(isset($matches[1])) { $has_rotation = true; } } //let's see if the video has rotation or not if($has_rotation) { //rotate the video using transpose and write an output file $cmd = 'ffmpeg -v verbose -i "FFMPEG_INPUT_VIDEO.MOV" -vf "transpose=1" -y "FFMPEG_OUTPUT_VIDEO.MOV" 2>&1'; shell_exec($cmd); echo "Video has been rotated"; } else echo "Video doesn't has rotation, nothing to do"; ?>
Espero este post les puede ayudar en algún proyecto que requiera del uso de FFMPEG, estaré escribiendo más tips acerca de esta librería, no olivdes en dejar tu comentario, hasta el próximo post!