Hoje vamos falar de um assunto bastante divertido e que é de muita
utilidade para todos nós. Vamos aprender como capturar a miniatura
(thumbnail) de um vídeo em PHP e, posteriormente, salvá-la no HD. Todo
serviço que trabalha com algum tipo de mídia precisa de algumas
ferramentas para fazer essa manipulação. O PHP não oferece suporte
utilizando funções nativas para manipular arquivos de áudio ou de vídeo.
Por isso, vocês precisam de 3 coisas muito importantes que são
descritas logo à frente para seguirmos com este artigo.
Requisitos
- ffmpeg-0.4.9_pre1 ou superior.
- ffmpeg-php 0.5.3 ou superior.
- gd-2.0 ou superior (a versão que vem compilada com o PHP funciona também).
obs: Neste artigo não é meu objetivo ensinar a
fazer a instalação desses recursos, pois, com uma rápida googada, você
resolve o problema.
- O que é o ffmpeg: é um conjunto de bibliotecas de uso livre e open-source que
oferece um suporte completo para você converter e interagir com
praticamente qualquer tipo de mídia.
- O que é o ffmpeg-php: é uma extensão php desenvolvida para que nós, programadores PHP,
possamos interagir com o ffmpeg sem utilizarmos a “perigosa” função system()
(e derivadas) do PHP. Mas vale lembrar que ela cobre “em partes” as
funções do ffmpeg. Você não consegue com ffmpeg-php converter vídeos,
por exemplo, mas com o ffmpeg, você consegue.
Recebendo as informações do vídeo com PHP
Antes de começar a brincar com o vídeo, nós precisamos aprender como
pegar as informações do vídeo. O ffmpeg-php permite que você acesse
estas informações:
//Return the duration of a movie or audio file in seconds.<br />$movie->getDuration()<br />//Return the number of frames in a movie or audio file.<br />$movie->getFrameCount()<br />//Return the frame rate of a movie in fps.<br />$movie->getFrameRate()<br />//Return the path and name of the movie file or audio file.<br />$movie->getFilename()<br />//Return the comment field from the movie or audio file.<br />$movie->getComment()<br />//Return the title field from the movie or audio file.<br />$movie->getTitle()<br />//alias $movie->getArtist() Return the author field from the movie or the artist ID3 field from an mp3 file.<br />$movie->getAuthor()<br />//Return the copyright field from the movie or audio file.<br />$movie->getCopyright()<br />//Return the artist ID3 field from an mp3 file.<br />$movie->getArtist()<br />//Return the genre ID3 field from an mp3 file.<br />$movie->getGenre()<br />//Return the track ID3 field from an mp3 file.<br />$movie->getTrackNumber()<br />//Return the year ID3 field from an mp3 file.<br />$movie->getYear()<br /> //Return the height of the movie in pixels.<br />$movie->getFrameHeight()<br />//Return the width of the movie in pixels.<br />$movie->getFrameWidth()<br />//Return the pixel format of the movie.<br />$movie->getPixelFormat()<br />//Return the bit rate of the movie or audio file in bits per second.<br />$movie->getBitRate()<br />//Return the bit rate of the video in bits per second.<br />$movie->getVideoBitRate()<br />//Return the audio bit rate of the media file in bits per second.<br />$movie->getAudioBitRate()<br />//Return the audio sample rate of the media file in bits per second.<br />$movie->getAudioSampleRate()<br />//Return the current frame index.<br />$movie->getFrameNumber()<br />//Return the name of the video codec used to encode this movie as a string.<br />$movie->getVideoCodec()<br />//Return the name of the audio codec used to encode this movie as a string.<br />$movie->getAudioCodec()<br />//Return the number of audio channels in this movie as an integer.<br />$movie->getAudioChannels()<br />//Return boolean value indicating whether the movie has an audio stream.<br />$movie->hasAudio()<br />//Return boolean value indicating whether the movie has a video stream.<br />$movie->hasVideo()<br />//Returns a frame from the movie as an ffmpeg_frame object.<br />//Returns false if the frame was not found.<br />//framenumber - Frame from the movie to return.<br />//If no framenumber is specified, returns the next frame of the movie.<br />$movie->getFrame([Integer framenumber])<br />//Returns the next key frame from the movie as an ffmpeg_frame object.<br />//Returns false if the frame was not found.<br />$movie->getNextKeyFrame()No nosso caso, os únicos métodos que vão nos interessar serão:
getFrameRate, getDuration, getFrameCount, getFrameHeight ,
getFrameWidth e getFrame.
No início do seu script, coloque esta linha só por segurança:
if ( ! extension_loaded ( 'ffmpeg' ) ) exit ( 'ffmpeg não foi carregado!' );Para receber as informações do vídeo dentro do seu arquivo PHP, você
precisa utilizar a classe ffmpeg_movie do ffmpeg-php e passar como
parâmetro o caminho do vídeo que quer manipular.
// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo<br />$movie = new ffmpeg_movie($movie_file);<br />// pegamos a duranção do video em segundos<br />$duration = round ( $movie->getDuration() , 0 );<br />// recebemos o número de frames do vídeo<br />$totalFrames = $movie->getFrameCount();<br />// recebemos a altura do vídeo em pixels<br />$height = $movie->getFrameHeight ();<br />// recebemos a largura do vídeo em pixels<br />$width = $movie->getFrameWidth ();Recebendo o frame do vídeo e salvando
Agora que já temos as informações do vídeo, podemos capturar a
miniatura de um determinado frame do vídeo e salva-lá em nosso HD.
Vamos utilizar outra classe do ffmpeg-php chamada ffmpeg_frame e
utilizarmos a função toGDImage para convertermos o frame para uma
imagem GD.
Para escolhermos o frame, podemos utilizar algumas técnicas:
Miniatura de um segundo específico:
$thumbnailOf = $movie->getFrameRate() * 5;Miniatura do meio do vídeo:
$thumbnailOf = round ( $movie->getFrameCount() / 2 );Neste exemplo, vou fazer um cálculo para receber um frame do meio do vídeo e salvar no HD.
// precisamos criar uma imagem GD para o ffmpeg-php trabalhar nela<br />$image = imagecreatetruecolor ( $width , $height ) ;<br />// criamos a instancia do frame com a classe ffmpeg_frame<br />$frame = new ffmpeg_frame ( $image );<br />// escolhemos o frame que queremos salvar como jpeg<br />$thumbnailOf = (int) round ($movie->getFrameCount() / 2.5);<br />// recebe o frame<br />$frame = $movie->getFrame ( $thumbnailOf );<br />// converte para uma imagem GD<br />$image = $frame->toGDImage ();<br />//salva no HD.<br />imagejpeg($image, $movie_file.'.jpg', 100);Pronto! Agora não tem desculpa. Vocês já sabem capturar o frame de um vídeo e salvar uma miniatura dele.
Redimencionando o frame do video
Este capitulo é um bônus. Vocês também podem salvar um frame
específico do video como jpeg, redimencioná-lo antes e salvar no HD. A
função resize() da classe ffmpeg_frame faz isso para gente:
$frame->resize(Integer width, Integer height [, Integer crop_top [, Integer crop_bottom [, Integer crop_left [, Integer crop_right ]]]])Utilizando o mesmo código acima, acrescentando somente uma linha:
// colei esta linha somente como referencia<br />$frame = $movie->getFrame ( $thumbnailOf );<br />// redimenciona o frame para 200 de lagura por 100 de algura.<br />$frame->resize ( 200, 100 );Podemos, também, redimencionar esta imagem e fazer um crop nela:
// colei esta linha somente como referencia<br />$frame = $movie->getFrame ( $thumbnailOf );<br />// redimencionamos o frame para 200x100 e mas com o acrescimo de um crop de 30x30x30x30.<br />$frame->resize ( 200, 100, 30, 30, 30, 30 );É isso aí!
Maiores informações na documentação oficial do ffmpeg-php.
[]’s
Igor.







