Igor Escobar

Igor Escobar

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Home page: http://www.igorescobar.com

Posts by Igor Escobar

Aumente a performance do seu site com cache .htaccess

2

Existem várias formas de se aumentar a performance de uma aplicação web, e quando eu falo aplicação web o mesmo se aplica a sites. Uma das formas mais eficientes de lidar com performance é concentrar esforços para aumentar a sensação de carregamento instantâneo da sua aplicação.

Steve Souders escreveu um livro excelente chamado: High Performance Websites e nele, Steve, falou algo que me chamou muita atenção:

“Na maior parte da minha carreira em Internet, fui engenheiro de back-end. Como tal, eu diligentemente atacava cada projeto de performance como um exercício em otimização de back-end, me concentrando em opções de compilação, índices de bases de dados, gerenciamento de memória, etc. Existe muita atenção e vários livros dedicados a otimização performance nessas áreas, então é nelas que a maioria das pessoas emprega seu tempo, procurando melhorias. Na realidade, para a maioria das páginas de Internet, menos de 10% a 20% do tempo de resposta experimentado pelos usuários finais é gasto trazendo o documento HTML do servidor para o browser. Se você quer redurzir dramaticamente os tempos de resposta de suas páginas, tem de se concentrar nos restantes 80% a 90% da experiência do usuário final. No que sesses 80% a 90% são empregados?”

Umas das regras para se otimizar o carregamento de uma interface web, talvez uma das mais importantes, é diminuindo o número de requisições HTTP que esta interface está fazendo.

Existem diversas técnicas para se reduzir o número de requisições HTTP de uma aplicação web, porém, a que vamos abordar hoje é somente um pequeno pedaço deste trabalho, porém, uma parte muito importante dele.

A negligência e o cache.

Existe uma negligência muito grande por parte dos programadores e engenheiros com relação ao cache. Não podemos simplesmente cachear tudo e todos. Existe um nível de importancia que deve ser empregado para cada tipo de mídia que estamos cacheando. Vai de negócio para negócio, Na aplicação X os arquivos javascript podem não ser muito importante mas os arquivos mp3 são importantíssimos e vice-versa. É muito importante darmos o tempo certo de vida para cada tipo de mídia sempre olhando para o nosso negócio.

Botando a negligência de lado, por quê o cache é importante? para evitar que o usuário pague o preço. Para que ele baixe somente o que é necessário.

Diretivas .htaccess para cache

# 1 ANO
<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>
# 1 SEMANA
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
# 2 DIAS
<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=172800, proxy-revalidate"
</FilesMatch>
# 1 MINUTO
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>

Veja que é possível darmos um tempo de “vida” do cache de um arquivo de acordo com a sua extensão. É importante ressaltar que os tempos que foram dados no exemplo acima é somente um exemplo. Como eu disse acima, é importante você colocar na balança o que é mais importante para o seu negócio.

.htaccess Time Cheatsheet

# TIME CHEAT SHEET
#      300   5 MIN
#      600  10 MIN
#      900  15 MIN
#     1800  30 MIN
#     2700  45 MIN
#
#     3600   1 HR
#     7200   2 HR
#    10800   3 HR
#    14400   4 HR
#    18000   5 HR
#    36000  10 HR
#    39600  11 HR
#    43200  12 HR
#    46800  13 HR
#    50400  14 HR
#    54000  15 HR
#    86400  24 HR
#
#    86400   1 DAY
#   172800   2 DAY
#   259200   3 DAY
#   345600   4 DAY
#   432000   5 DAY
#   518400   6 DAY
#   604800   7 DAY
#
#   604800   1 WEEK
#  1209600   2 WEEK
#  1814400   3 WEEK
#  2419200   4 WEEK
#
#  2419200   1 MONTH
#  4838400   2 MONTH
#  7257600   3 MONTH
#  9676800   4 MONTH
# 12096000   5 MONTH
# 14515200   6 MONTH
# 16934400   7 MONTH
# 19353600   8 MONTH
# 21772800   9 MONTH
# 24192000  10 MONTH
# 26611200  11 MONTH
# 29030400  12 MONTH

Se este snipet não funcionar (o que é bem improvável) você pode utilizar este snipet em conjunto com a extensão mod_expires do apache.

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A300
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A3600
ExpiresByType text/css A3600
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A300
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A300
</IfModule>

O legal de se utilizar o mod_expires é que ele trata o a questão do cache de acordo com o mime-type de cada arquivo e não somente pela extensão.

Tá, mais, é o ideal gerenciar desta forma?

Não. Existem formas mais inteligentes de gerenciar as mudanças dos seus arquivos e fazer com que eles sejam baixados novamente pelo navegador do usuário somente quando ele realmente for atualizado, porém, esta é uma forma um pouco mais “custosa” e eu certamente irei falar com mais profundidade sobre isso em um próximo post.

Conclusão

Podemos minimizar o número de requisições HTTP de nossa aplicação gerenciando de forma mais inteligente os arquivos que estamos incorporando dentro de nossa aplicação web utilizando recursos simples e nativos do nosso apache, como o exemplificado aqui. Esta não é a forma mais eficiente, mas com certeza, vai ajudar muito a minimizar o número de requisições HTTP que sua aplicação web fará nas nas próximas paginas que seu usuário for navegar.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

  • Nenhum post relacionado!

Abreviando um texto sem cortar palavras no PHP

14

Olá Pessoal!
Como apresentar soluções para problemas cotidianos, é um dos objetivos deste blog, vou compartilhar com vocês uma solução que escrevi para que vocês possam abreviar um texto, sem cortar qualquer palavra pela metade.

É extremamente chato, quando estamos lendo o resumo de uma notícia e nos deparamos com uma palavra cortada, dificultando a compreensão do texto. É feio, principalmente para a estética do layout.

A maioria das funções escritas (em qualquer linguagem) para abreviar um texto, acabam cortando o texto pela metade. Você passa 2 parâmetros: String Texto e Int Limite.

Texto é o texto própriamente dito, e Limite é o tamanho máximo que o texto deve ocupar. Se o texto for maior que 250 caractéres, o script abrevia o texto sem estourar o limite e sem cortar palavras pela metade, caso contrário, deixa o textocomo está.

A solução que escrevi foi esta:

public function abreviaString($texto, $limite, $tres_p = '...')
{
    $totalCaracteres = 0;
    //Retorna o texto em plain/text
    $texto = Biblioteca::somenteTexto($texto);
    //Cria um array com todas as palavras do texto
    $vetorPalavras = explode(" ",$texto);
    if(strlen($texto) <= $limite):
        $tres_p = "";
        $novoTexto = $texto;
    else:
        //Começa a criar o novo texto resumido.
        $novoTexto = "";
        //Acrescenta palavra por palavra na string enquanto ela
        //não exceder o tamanho máximo do resumo
        for($i = 0; $i <count($vetorPalavras); $i++):
            $totalCaracteres += strlen(" ".$vetorPalavras[$i]);
            if($totalCaracteres <= $limite)
                $novoTexto .= ' ' . $vetorPalavras[$i];
            else break;
        endfor;
    endif;
    return $novoTexto . $tres_p;
}

Note que eu chamei uma função estática chamada somenteTexto(). Quem quiser o fonte dela e saber como ela está implementada, está ai:

    public static function somenteTexto($string)
    {
        $trans_tbl = get_html_translation_table(HTML_ENTITIES);
        $trans_tbl = array_flip($trans_tbl);
        return trim(strip_tags(strtr($string, $trans_tbl)));
    }

Esta é a solução enviada pelo Carlos André Ferrari nos comentários do blog:

function abreviaString($texto, $limite, $tres_p = '…') {
  //Retorna o texto em plain/text
  $texto = Biblioteca::somenteTexto($texto);

  if (strlen($texto) <= $limite)
    return $texto;
  return array_shift(explode('||', wordwrap($texto, $limite, '||'))) . $tres_p;
}

É importante que, antes de abreviarmos um texto, recebermos o texto puro, livre de tags htmls, scripts ou qualquer outra coisa que não faça parte do texto. Quando isso ocorre, dificulta a abreviação pois o algoritmo não sabe o que é texto e o que é metacaracter.

E é isso aí pessoal, o código está bem comentádo e documentado, caso vocês tenham alguma dúvida, fiquem a vontade para perguntar nos comentários.

Qualquer outra implementação que vocês tenham, que faça a mesma coisa, até mesmo em outras linguagens, o share é totalmente bem-vindo.

[]‘s
Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

Screenshots com PHP

3

Salvar screenshots de um site não é uma tarefa muito comum de um programador, porém, esta é uma tarefa interessante de ser feita. Existem algumas soluções interessantes para se resolver esta tarefa, porém, existe um cara em especial que me chamou a atenção e atendeu muito bem as minhas necessidades. Requisito para prosseguir com a solução apresentada neste post é instalar o wkhtmltoimage. Se você acessar o site do projeto vai ver que o nome dele é wkhtmltopdf e não wkhtmltoimage, como é mencionado. O wkhtmltoimage existe nos downloads do projeto, você só precisa instalar a versão adequada para o seu sistema operacional. Tem versões para Linux, Mac e Windows. Vou guiá-los com base no texto Taking screenshots of websites with PHP.

O wkhtmltoimage é um simples utilitário para ser executado via shell que faz a conversão de HTML para imagem usando o WebKit Engine e QT. Não é bem uma conversão. A ferramenta renderiza o endereço requisitado utilizando o WebKit Engine e tira um screenshot desta renderização utilizando o QT.

Fazendo sua primeira screenshot

Levando em consideração que você já tenha o wkhtmltoimage instalado corretamente, abra o seu terminal e digite:

wkhtmltoimage http://www.google.com google.jpg

O código acima vai converter toda a representação HTML do Google e vai converter isso para jpg usando o wkhtmltoimage.

Customizando a saída

O comando wkhtmltoimage tem uma série de opções:

  • Desabilitar a renderização de imagens.
  • Controlar a qualidade da imagem de output.
  • Salvar o screenshot com uma resolução específica.
  • Salvar uma região especifíca do screenshot (crop).
  • Desabilitar o javascript da pagina requisitada.

Exemplos

//renderiza sem imagens
wkhtmltoimage --no-images http://www.google.com google.jpg

//não carrega os javascripts
wkhtmltoimage --no-javascript http://www.google.com google.jpg

//reduz a qualidade da imagem de output
wkhtmltoimage --quality 50 http://www.google.com google.jpg

//personaliza a largura e a altura do screenshot
wkhtmltoimage --height 600 --width 1800 http://www.google.com google.jpg

//faz um crop de 300x300 pixels partindo do eixo x0 e y0
wkhtmltoimage --crop-h 300 --crop-w 300 --crop-x 0 --crop-y 0 http://www.google.com google.jpg

Utilizando com PHP

Como já era de se imaginar, toda esta façanha não é feita somente com PHP. Você precisa da ajuda de alguns caras e para que o PHP consiga executar estes comandos, vamos precisar da ajuda de um método chamado shell_exec do PHP. Também podemos utilizar um wrapper escrito em PHP5 que abstrai os métodos do wkhtmltoimage e wkhtmltopdf chamado Snappy escrito em PHP5 do PHP.

Método 1: shell_exec

shell_exec('./wkhtmltoimage --quality 50 http://www.google.com google.jpg');

Método 2: Snappy

<?php

namespace Knplabs\Snappy;

require_once('Knplabs/Snappy/Media.php');
require_once('Knplabs/Snappy/Image.php');

/* 'wkhtmltoimage' executable  is located in the current directory */
$snap = new Image('./wkhtmltoimage');

/* Displays the bbc.com website index page screenshot in the browser */
header("Content-Type: image/jpeg");
$snap->output('http://www.bbc.com');

?>

Com alguns métodos adicionados…

<?php

namespace Knplabs\Snappy;

require_once('Knplabs/Snappy/Media.php');
require_once('Knplabs/Snappy/Image.php');

$options = array('zoom' => 0.5, 'no-images' => true);

/* 'wkhtmltoimage' executable  is located in the current directory */
$snap = new Image('./wkhtmltoimage-i386',$options);

/* Displays the bbc.com website index page screen-shot in the browser */
header("Content-Type: image/jpeg");
$snap->output('http://www.bbc.com');

?>

É isso aí!

Qualquer dúvida, estou à disposição.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

Git: Visualizando versões anteriores de um arquivo

0

Um dos principais objetivos que me fez criar este blog é ajudar as pessoas que me acompanham a resolver problemas corriqueiros quando se trabalha com desenvolvimento de software.

No último mês trabalhei em um projeto onde tive vários problemas com versões de arquivo. As coisas simplesmente sumiam de onde deveriam estar ou cagadas decorrentes de comandos espartanos.

Então, aqui vai um comando do git bem interessante, que me salvou diversas vezes:

 git show HEAD~2:/caminho/do/arquivo.txt 

Só para você conseguir entender melhor o comando, a estrutura é bem simples. HEAD seria a revisão onde o arquivo se encontra e o que tem depois do “~” seria a versão do arquivo onde 1 seria a versão atual e a 2 seria a anterior a atual e este número pode ser o numero que você quiser (desde que a versão existe). E após os dois pontos seria o caminho do arquivo que você quer ver a versão.

E foi assim que eu consegui resolver vários problemas sem ter que re-escrever tudo denovo.

Conclusão

Use o git (ou qualquer controle de versão) não importa o tamanho ou a importância do projeto. Use um controle de versão. Além dele garantir o versionamento dos seus arquivos, ter uma boa gama de recursos para melhor organização, dinâmica de projeto, trabalho em grupo e etc., ele proporciona uma camada a mais de segurança dos seus arquivos. Se não fosse pelo git eu estaria atrasado com o meu prazo ou muito provavelmente teria madrugado algumas noites a mais.

[]‘s

Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

Personalizando o terminal para trabalhar com Git

2

Olá Pessoal,

Esta é uma dica bem simples para deixar o seu terminal um pouco mais intuitivo. Muitas vezes quando estamos trabalhando com git, precisamos saber exatamente onde estamos no repositório. Vou compartilhar um simples snippet de código que pode deixar a vista algumas informações bem úteis para vocês quando você estiver dentro e fora de um repositório git.

Configurando o Terminal

Abra o seu arquivo .bashrc:


$> vim ~/.bashrc

E insira o seguinte código no final do arquivo:

PS1='\[\033[0;37m\][\t]\[\033[0;32m\][\u]\[\033[31m\][\h]`git branch 2>/dev/null | grep \* | head -1 | sed "s/\* //g" | awk "{ print \"[ \"\\\$1 \" ]\" }"` \[\033[1;33m\]\w\a\[\033[0m\]\n\$ '

Execute o seu .bashrc para que as alterações entrem em vigor:


$> . ~/.bashrc

E o seu terminal vai ficar parecido com assim:

Ele vai informar para você Hora, Usuário, Máquina, Branch, Diretório e também organiza a área onde você digita seus comandos na linha de baixo para aumentar a área útil do terminal.

[]‘s

Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

Detectando Requisições Ajax com PHP

6

É bem comum trabalharmos com requisições Ajax que batem em um servidor rodando alguma aplicação PHP. O problema é que as vezes utilizamos o mesmo método para atender tanto a arquitetura do seu sistema quanto as requisições que são feitas via Ajax.

Por exemplo: Temos um objeto PHP que tem como objetivo recuperar todas as notícias cadastradas na base de dados.

<?php
class MinhaClasse {
    public function getAllNews(){
        // implementação para receber as notícias

        return $news;
    }
}
?>

Como eu faço para que este mesmo método supra as minhas requisições Ajax sem que eu tenha que criar outro?

É bem comum vermos por aí programadores criando dois objetos diferentes para atender as duas necessidades (aplicação e Ajax). Sendo que a única diferença entre eles é como o método retorna.

Podemos utilizar o mesmo método e fazer com que retorne de forma diferente dependendo de como eu estou chamando o método.

Vamos criar um método chamado isAjax():

public function isAjax(){
        return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
    }

Funciona de forma simples: Sempre que uma requsição Ajax é disparada um header é setado nesta requisição chamada HTTP_X_REQUESTED_WITH e o valor dela é setado como XMLHttpRequest.

Desta forma a nossa classe ficaria assim:

<?php
class MinhaClasse {
    public function isAjax(){
        return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
    }
    public function getAllNews(){
        // implementação para receber as notícias
        // ..

        // se o metodo for invocado via Ajax, retorne um JSON
        if($this->isAjax()) {
            echo json_encode($news);
        } else {
            return $news;
        }

    }
}
?>

Veja que se a requisição for feita via Ajax o método dar um echo JSON de $news. Se o método for invocado de qualquer outra forma ele irá retornar normalmente.

É isso. Post rápido, pá pum :D

[]‘s
Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

  • Nenhum post relacionado!

Treinamento PHPUnit Gratuíto

1

Dia 4 de novembro, Nick Belhomme criou um treinamento gratuito para PHPUnit e divulgou em seu blog no formato SlideShare. Para que não está por dentro, PHPUnit é uma ferramenta criada por Sebastian Bergmann para criamos suites de testes dentro de nossas aplicações PHP para garantirmos as funcionalidades e entrega de nossa aplicação. A abrangência da ferramenta é gigantesca, da pra fazer muita coisa. Requisitos de funcionalidade, navegação, integração, integridade etc. Se você nunca ouviu falar de TDD (Test Driven Development) esta é a sua chamada. TDD é umas das vertentes do XP (Extreme Programming) onde você desenvolve toda a sua aplicação orientada a testes. Se serve de atrativo e porcamente falando, TDD é a forma que temos de garantir o funcionamento de todas as funcionalidades do software estão funcionando, incluindo suas camadas. Protege sua aplicação do famoso “Corrige aqui, Quebra alí”. O treinamento é em inglês e está logo abaixo.

Post rápido. Como alguns já sabem, agora eu trabalho como PHP Engineer na LBS Local (Apontador & MapLink) em São Paulo e o tempo tem ficado bem corrido. Sempre que der vou tentar divulgar por aqui bons materiais que vão acrescentar na vida acadêmica e profissional de cada um. Se não gosta de esperar, estou diáriamente divulgando bons links no meu twitter, follow me!

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

Redes Sociais Aplicada no Desenvolvimento de Aplicações Web

2

Com a Internet cada vez mais presente na vida de todos, as redes sociais estão ganhando força (muita força). A influência de uma marca nas redes sociais já pode ser convertida em lucro e a grande maioria das empresas já perceberam isso. Essas redes têm sido alvo de muitas empresas para fidelizar e conquistar novos clientes através de ações geniais e muito criativas.

Assim como qualquer outra profissão, as coisas mudam. As tendências mudam. As metodologias mudam. As tecnologias mudam. Tudo muda. Inclusive os desejos e prioridades de nossos clientes. Atualmente as empresas querem estar cada vez mais presentes na vida de cada um de seus clientes. FacebookTwitterOrkutYouTube, etc.. está tudo muito comum e nós precisamos aprender a interagir com estas comunidades para poder dar possibilidade ao seu cliente e potencializar a possibilidade de conversão.

Se você não está familiarizado com o termo “conversão”, podemos dizer que conversão é quando você anuncia e este anúncio é clicado. Isso é chamado de conversão.

O motivo para eu estar aqui hoje, falando sobre redes sociais para vocês, é para dar um puxão de orelha nos profissionais que ainda não estão dando a mínima para este novo (nem tanto assim) conceito de interação. As redes sociais são mais um leque de aplicações que surgiram com a web 2.0. Neste boom, o conceito de interação foi explorado em uma escala muito maior. Junto com todas as inovações e as modificações na forma como interagimos com os sites e aplicativos web hoje, a web 2.0 trouxe o que chamamos hoje de redes sociais.

O meu foco com este post é evangelizar. É fazer com que após você ter lido este post você comece a criar já pensando na integração com as redes sociais. Não faz ideia de como?

Vou te dar algumas ideias:

  • Já pensou que nas notícias do seu site poderia ter a possibilidade dos usuários comentarem nas notícias e replicarem o seu comentário para o Twitter?
  • Os comentários estão protegidos por login? Use o usuário do Twitter do seu visitante para possibilitar mais uma alternativa de autenticação.
  • Upload de vídeos? Dê uma folga para o seu data storage e faça o upload direto para o YouTube e busque as informações através da API.
  • Quer fazer transmissão ao vivo para os seus visitantes? Utilize toda a interação que ferramentas como o Twitcam oferecem para você.
  • Crie aplicativos para Orkut, Facebook e Smarthphones. Os seus usuários poderão ter um nível de interação muito maior e a experiência deles será muito mais rica.
  • Dê a possibilidade do usuário divulgar suas notícias, fotos, albuns e vídeos através das redes sociais que eles participam.
  • Crie aplicações onde o seu usuário possa acompanhar as atualizações das suas redes sociais através da aplicação da sua empresa ou start-up.

Essa lista pode crescer muito ainda. O importante é você ter a criatividade e começar a incluir as redes sociais no planejamento do novo produto ou site da sua empresa ou cliente.

[]‘s
Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

  • Nenhum post relacionado!

Capturando miniatura de vídeos com PHP

12

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 salva-las no HD. Todo serviço que trabalha com algum tipo de mídia precisa de algumas ferramentas para fazer esta manipulação. O PHP não oferece suporte utilizando funções nativas para manipular arquivos de audio ou vídeo. Por isso, vocês precisam de 3 coisas muito importantes que são descritas logo a 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 destes recursos pois com uma rápida googada você resolve o problema.

O que é o ffmpeg?

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?

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 do video:

//Return the duration of a movie or audio file in seconds.
$movie->getDuration()
//Return the number of frames in a movie or audio file.
$movie->getFrameCount()
//Return the frame rate of a movie in fps.
$movie->getFrameRate()
//Return the path and name of the movie file or audio file.
$movie->getFilename()
//Return the comment field from the movie or audio file.
$movie->getComment()
//Return the title field from the movie or audio file.
$movie->getTitle()
//alias $movie->getArtist()	Return the author field from the movie or the artist ID3 field from an mp3 file.
$movie->getAuthor()
//Return the copyright field from the movie or audio file.
$movie->getCopyright()
//Return the artist ID3 field from an mp3 file.
$movie->getArtist()
//Return the genre ID3 field from an mp3 file.
$movie->getGenre()
//Return the track ID3 field from an mp3 file.
$movie->getTrackNumber()
//Return the year ID3 field from an mp3 file.
$movie->getYear()
 //Return the height of the movie in pixels.
$movie->getFrameHeight()
//Return the width of the movie in pixels.
$movie->getFrameWidth()
//Return the pixel format of the movie.
$movie->getPixelFormat()
//Return the bit rate of the movie or audio file in bits per second.
$movie->getBitRate()
//Return the bit rate of the video in bits per second.
$movie->getVideoBitRate()
//Return the audio bit rate of the media file in bits per second.
$movie->getAudioBitRate()
//Return the audio sample rate of the media file in bits per second.
$movie->getAudioSampleRate()
//Return the current frame index.
$movie->getFrameNumber()
//Return the name of the video codec used to encode this movie as a string.
$movie->getVideoCodec()
//Return the name of the audio codec used to encode this movie as a string.
$movie->getAudioCodec()
//Return the number of audio channels in this movie as an integer.
$movie->getAudioChannels()
//Return boolean value indicating whether the movie has an audio stream.
$movie->hasAudio()
//Return boolean value indicating whether the movie has a video stream.
$movie->hasVideo()
//Returns a frame from the movie as an ffmpeg_frame object.
//Returns false if the frame was not found.
//framenumber - Frame from the movie to return.
//If no framenumber is specified, returns the next frame of the movie.
$movie->getFrame([Integer framenumber])
//Returns the next key frame from the movie as an ffmpeg_frame object.
//Returns false if the frame was not found.
$movie->getNextKeyFrame()

No nosso caso, os únicos métodos que vão nos interessar seram: 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 parametro o caminho do vídeo que você quer manipular.

// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo
$movie = new ffmpeg_movie($movie_file);
// pegamos a duranção do video em segundos
$duration = round ( $movie->getDuration() , 0 );
// recebemos o número de frames do vídeo
$totalFrames = $movie->getFrameCount();
// recebemos a altura do vídeo em pixels
$height = $movie->getFrameHeight ();
// recebemos a largura do vídeo em pixels
$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-la 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 especifico:

$thumbnailOf = $movie->getFrameRate() * 5;

Miniatura do meio do vídeo:

$thumbnailOf = round ( $movie->getFrameCount() / 2 );

Neste exemplo vou pegar fazer um calculo para receber um frame do meio do vídeo e salvar no HD.

// precisamos criar uma imagem GD para o ffmpeg-php trabalhar nela
$image = imagecreatetruecolor ( $width , $height ) ;
// criamos a instancia do frame com a classe ffmpeg_frame
$frame = new ffmpeg_frame ( $image );
// escolhemos o frame que queremos salvar como jpeg
$thumbnailOf = (int) round ($movie->getFrameCount() / 2.5);
// recebe o frame
$frame = $movie->getFrame ( $thumbnailOf );
// converte para uma imagem GD
$image = $frame->toGDImage ();
//salva no HD.
imagejpeg($image, $movie_file.'.jpg', 100);

Pronto! Agora não tem desculpa. Vocês já sabem capiturar o frame de um video e salvar uma miniatura dele.

Redimencionando o frame do video

Este capitulo é um bonus. Vocês também podem salvar um frame especifico do video como jpeg e redimenciona-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
$frame = $movie->getFrame ( $thumbnailOf );
// redimenciona o frame para 200 de lagura por 100 de algura.
$frame->resize ( 200, 100 );

Podemos também, redimencionar esta imagem e fazer um crop nela:

// colei esta linha somente como referencia
$frame = $movie->getFrame ( $thumbnailOf );
// redimencionamos o frame para 200x100 e mas com o acrescimo de um crop de 30x30x30x30.
$frame->resize ( 200, 100, 30, 30, 30, 30 );

É isso aí!

Maiores informações, na documentação oficial do ffmpeg-php.

[]‘s
Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

Feliz Dia Do Programador!

0

Esta é uma data nerd especial!

O Dia do Programador (em russo: День программиста) é um feriado profissional oficial na Rússia, celebrado no 256º dia do ano (255º dia, se 1 de janeiro for considerado o dia 0). O número 256 (28) foi escolhido para esta data porque 256 é o número de valores distintos que podem ser representados com um byte de oito bits, um número bem conhecido entre os programadores.

Além disso, ’256′ em hexadecimal é ’100′ (’0×100′), e é a maior potência de 2 abaixo de 365 (o número de dias em um ano). Nos anos bissextos, a data comemorativa é 12 de setembro (13 de setembro em outros anos).

http://pt.wikipedia.org/wiki/Dia_do_programador
Parabéns para nós!

[]‘s
Igor.

javascript freak, php lover, zend certified engineer, ruby programmer wannabe, ruby developer at Editora Abril, musician and skater at free time.

Twitter LinkedIn 


Posts Relacionados:

  • Nenhum post relacionado!
Igor Escobar's RSS Feed
Go to Top