SlideShare uma empresa Scribd logo
Processamento avançado de
vídeos com FFmpeg e PHP
Aryel Tupinambá
PHP Conference 2017
Sobre o palestrante
Aryel Tupinambá
@DfKimera
Co-fundador e CTO da
LQDI Digital
Projetos para empresas como Porto
Seguro, Nestlé, Ticket e American
Express
CTO da
PedeSabores.com.br
E-commerce de frutas, verduras,
legumes e outros produtos
alimentícios
13 anos trabalhando
com PHP
Desde a época que o PHPClasses
era a onda :)
Sobre o FFmpeg
Sobre o FFmpeg
- Projeto open source de 2000
- Conjunto de bibliotecas de transcoding de áudio e vídeo (libavcodec, libavformat)
- Software command-line para conversão e manipulação de áudio e vídeo (ffmpeg)
- Usado por grandes players de vídeo do mercado (YouTube, Vimeo, etc)
Instalação
Baixar binários em ffmpeg.org
brew install ffmpeg --with-freetype apt-get install ffmpeg
O que dá pra fazer?
- Conversão de áudio e vídeo (formato, codec, resolução, qualidade)
- Extrair áudio, vídeo ou snapshots
- Manipular vídeos (FPS, coloração, audio mixing)
- Combinar e compor vídeos (sobrepor, recortar, colar)
- Streaming de áudio/vídeo / Transmissão ao vivo (ffserver)
Convertendo o formato de um vídeo
ffmpeg -i youtube.flv -c:v libx264 filename.mp4
Define
entrada
Seta o
codec de
vídeo
Define
saída
Recortando o pedaço de um vídeo
ffmpeg -i input.mp4 -ss 00:00:50.0 –c:v copy -t 20 output.mp4
Define
entrada
Define o
ponto de
início
Seta o codec
para "copy"
(usa o mesmo
formato de
origem)
Define a
duração,
em
segudos
Define
saída
Transformando um vídeo em GIF
ffmpeg -i video.mp4 -vf scale=500:-1 -t 10 -r 10 image.gif
Define
entrada
-vf = "set
video
filters"
Define a
duração do
clip
Define o
"rate"
Define a
saída
Hack para
definir o
aspect ratio e
converter
vídeo para
imagem
Aprofundando no FFmpeg
FFmpeg filters (-filter_complex)
- Entradas e saídas; arquivos e streams
- Piping das transformações
- Streams indicam acesso a mais de uma mídia em um mesmo arquivo
- Saídas "virtuais" são usadas como entradas "virtuais" de outros filtros
#0
background.mp4
#1
person.mp4
crop drawtext
chromakey
overlay
#0
output.webm
format
Anatomia de um filtro
<inputs> filter=param=value:param2=value2 <outputs>
Usando os filtros
ffmpeg -i video.mp4 -i logo.png
-filter_complex "[0][1] overlay" output.mp4
input #0 input #1
inputs
(#0 e #1)
overlay filter
(input #1 sobre
#0)
Output
final
Filtros com múltiplas streams
ffmpeg -i video.mp4 -filter_complex
"[0:0] copy; [0:1] acodec=ogg" output.mp4
input #0
input #0,
stream #0
(vídeo)
Input #0,
stream #1
(áudio)
Final
output
Encadeando filtros (chaining)
ffmpeg -i gameplay.mp4 -i player.mp4 -i logo.png
-filter_complex "
[1] scale=w=100:h=150 [logo];
[0][logo] overlay=x=0:y=0 [vid];
[2] crop=x=20:y=20:w=80:h=80 [player];
[player][vid] overlay=x=0:y=0
" output.mp4
Conhecendo alguns filtros
scale
Redimensiona um vídeo / imagem
ffmpeg -i video.mp4
-filter_complex "
[0] scale=w=1280:h=720
" resized_video.mp4
crop
Recorta um vídeo / imagem
ffmpeg -i video.mp4
-filter_complex "
[0] crop=x=32:y=32:w=300:h=200
" resized_video.mp4
copy / acopy
Copia um stream de vídeo / áudio sem alterá-lo
ffmpeg -i input_with_audio.mp4
-filter_complex "
[0:0] scale=w=100:h=150;
[0:1] acopy;
" output_with_unchanged_audio.mp4
copy / acopy
Copia um stream de vídeo / áudio sem alterá-lo
ffmpeg -i input_with_multiple_audio.mp4
-filter_complex "
[0:0] copy;
[0:2] copy;
" output_with_single_audio.mp4
overlay
Sobrepõe uma entrada de vídeo sobre outra
ffmpeg -i video1.mp4 -i video2.mp4
-filter_complex "
[0][1] overlay=x=10:y=10:w=100:h=200:enable='between(t,1,3)';
" output.mp4
fade
Efeito fade-in fade-out em um determinado stream
ffmpeg -i video.mp4
-filter_complex "
[1] fade=in:0:30, fade=out:2167:30;
" output.mp4
chromakey
Aplica o efeito chromakey em um vídeo
ffmpeg -i background.mp4 -i chroma.mp4
-filter_complex "
[1] chromakey=color=green:similarity=0.1 [chroma];
[0][chroma] overlay;
" output.mp4
drawtext
Desenha uma string de texto sobre um input
ffmpeg -i video1.mp4
-filter_complex "
[0] drawtext=fontsize=30:fontfile=Arial.ttf
:enable='between(t,1,3)':text='Hello world';
" output.mp4
Parâmetros com expressões
ffmpeg -i video1.mp4
-filter_complex "
[0] drawtext=fontsize=30:fontfile=Arial.ttf
:enable='between(t,1,3)':text='Hello world';
" output.mp4
- É o que torna o ffmpeg tão flexível
- Quase qualquer parâmetro numérico permite que sejam usadas expressões
- Cada filtro tem uma série de variáveis nessas expressões
Expressão entre aspas simples;
O valor binário dessa expressão
é aplicada frame a frame no
parâmetro enable
Variável t recebe o segundo atual ao
longo do processamento
Parâmetros com expressões
ffmpeg -i video1.mp4
-filter_complex "
[0] drawtext=fontsize=30
:fontfile=Arial.ttf:text='Hello world'
:x='(w/2)-(text_w/2)':y='(w/2)-(text_w/2)';
" output.mp4
As variáveis w e h contem as
dimensões do vídeo. As variáveis
text_w e text_h contém as dimensões
do bloco de texto
Aqui usamos expressões para
determinar o X e o Y para o
centro da tela
Parâmetros com expressões
ffmpeg -i video1.mp4
-filter_complex "
[0] drawtext=fontfile=Arial.ttf
:text='Hello world':x=15:y=15
:fontsize='max(t/2, 30)';
" output.mp4
Vamos testar na prática!
Objetivos
- Combinar dois vídeos com green-screen
- Escrever "PHP Rocks!" no centro da tela
- Salvar em .mp4 para visualização web
Executando o ffmpeg via PHP
Executando o ffmpeg via PHP
- Método simples (exec() do command-line)
- Método fácil (classe PHP-FFMpeg)
- Método flexível (symfony/process)
Rodando via exec()
Rodando via symfony/process
A biblioteca FFmpeg-PHP
A biblioteca PHP-FFmpeg
- Disponível para download no Composer (composer require php-ffmpeg/php-ffmpeg)
- Abstrai chamadas diretamente no binary (via BinaryDriver)
- Tem suporte a transcoding, filtros básicos, etc
- Não possui uma série de filtros (principalmente que envolvem inputs/outputs)
- Permite que você implemente filtros através da interface FilterInterface)
- Recomendado para transformações e composições simples
Usando a biblioteca
Conclusão
- O ffmpeg é uma ferramenta que faz muito mais que converter vídeos
- É possível implementar um editor de vídeos completo sobre a ffmpeg
- O uso com o PHP é simples, através de command-line ou controle de processos
- As operações de processamento de vídeos são pesadas; é recomendado trabalhar com elas
em fila, e não via request HTTP
Obrigado!
Telegram: @DfKimera
E-mail / Hangouts: aryel.tupinamba@lqdi.net
Facebook: http://facebook.com/aryel.tupinamba
Twitter: http://twitter.com/DfKimera
LinkedIn: http://linkedin.com/in/aryeltupinamba
http://lqdi.net
Mais informações:
https://ffmpeg.org/ffmpeg-filters.html
https://trac.ffmpeg.org/wiki/FilteringGuide
https://github.com/nwochaadim/ffmpeg-
installation/wiki/Applying-complex-filters-to-videos
https://github.com/PHP-FFMpeg/PHP-FFMpeg
Slides da palestra: http://slideshare.net/aryeltupinamba

Mais conteúdo relacionado

Mais procurados

O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
Jose Berardo
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)
Rudá Moura
 
Aula 9 - Introdução ao Python
Aula 9 - Introdução ao PythonAula 9 - Introdução ao Python
Aula 9 - Introdução ao Python
Paulo Roberto Donatilio Rego
 
Python + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certoPython + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certo
Fernando Macedo
 
TDC2016POA | Trilha IoT - Controlando AR Drone com PHP
TDC2016POA | Trilha IoT -  Controlando AR Drone com PHPTDC2016POA | Trilha IoT -  Controlando AR Drone com PHP
TDC2016POA | Trilha IoT - Controlando AR Drone com PHP
tdc-globalcode
 
Curso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFXCurso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFX
Curso em Vídeo - Cursos Grátis com Certificado
 
Docker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHONDocker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHON
Iago Machado
 
Python com r (mini projeto)
Python com r (mini projeto)Python com r (mini projeto)
Python com r (mini projeto)
Danilo Costa
 
Aula 2 primeiros programas 1e
Aula 2 primeiros programas 1eAula 2 primeiros programas 1e
Aula 2 primeiros programas 1e
Vania V. Estrela
 
Tudo o que você precisa saber sobre o php7
Tudo o que você precisa saber sobre o php7Tudo o que você precisa saber sobre o php7
Tudo o que você precisa saber sobre o php7
Er Galvão Abbott
 
Devcpp
DevcppDevcpp
Php7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saberPhp7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saber
Er Galvão Abbott
 
Primeira Aula PHP
Primeira Aula PHPPrimeira Aula PHP
Primeira Aula PHP
Helton Ritter
 
Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)
Cristiano Rafael Steffens
 
Sim, existe vida além do FTP!
Sim, existe vida além do FTP!Sim, existe vida além do FTP!
Sim, existe vida além do FTP!
Gustavo Pereira
 
Curso de Java #07 - Operadores (Parte 1)
Curso de Java #07 - Operadores (Parte 1)Curso de Java #07 - Operadores (Parte 1)
Curso de Java #07 - Operadores (Parte 1)
Curso em Vídeo - Cursos Grátis com Certificado
 
PHP-CLI em 7 passos
PHP-CLI em 7 passosPHP-CLI em 7 passos
PHP-CLI em 7 passos
Henrique Moody
 
MSDN Webcast: Task-based Asynchronous Pattern (TAP), async e await
MSDN Webcast: Task-based Asynchronous Pattern (TAP), async e awaitMSDN Webcast: Task-based Asynchronous Pattern (TAP), async e await
MSDN Webcast: Task-based Asynchronous Pattern (TAP), async e await
Rogério Moraes de Carvalho
 

Mais procurados (18)

O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)
 
Aula 9 - Introdução ao Python
Aula 9 - Introdução ao PythonAula 9 - Introdução ao Python
Aula 9 - Introdução ao Python
 
Python + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certoPython + Delphi: Um relacionamento que está dando certo
Python + Delphi: Um relacionamento que está dando certo
 
TDC2016POA | Trilha IoT - Controlando AR Drone com PHP
TDC2016POA | Trilha IoT -  Controlando AR Drone com PHPTDC2016POA | Trilha IoT -  Controlando AR Drone com PHP
TDC2016POA | Trilha IoT - Controlando AR Drone com PHP
 
Curso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFXCurso de Java #05 - Swing e JavaFX
Curso de Java #05 - Swing e JavaFX
 
Docker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHONDocker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHON
 
Python com r (mini projeto)
Python com r (mini projeto)Python com r (mini projeto)
Python com r (mini projeto)
 
Aula 2 primeiros programas 1e
Aula 2 primeiros programas 1eAula 2 primeiros programas 1e
Aula 2 primeiros programas 1e
 
Tudo o que você precisa saber sobre o php7
Tudo o que você precisa saber sobre o php7Tudo o que você precisa saber sobre o php7
Tudo o que você precisa saber sobre o php7
 
Devcpp
DevcppDevcpp
Devcpp
 
Php7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saberPhp7 esta chgando! O que você precisa saber
Php7 esta chgando! O que você precisa saber
 
Primeira Aula PHP
Primeira Aula PHPPrimeira Aula PHP
Primeira Aula PHP
 
Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)Simpósio Unicruz: OpenCV + Python (parte 1)
Simpósio Unicruz: OpenCV + Python (parte 1)
 
Sim, existe vida além do FTP!
Sim, existe vida além do FTP!Sim, existe vida além do FTP!
Sim, existe vida além do FTP!
 
Curso de Java #07 - Operadores (Parte 1)
Curso de Java #07 - Operadores (Parte 1)Curso de Java #07 - Operadores (Parte 1)
Curso de Java #07 - Operadores (Parte 1)
 
PHP-CLI em 7 passos
PHP-CLI em 7 passosPHP-CLI em 7 passos
PHP-CLI em 7 passos
 
MSDN Webcast: Task-based Asynchronous Pattern (TAP), async e await
MSDN Webcast: Task-based Asynchronous Pattern (TAP), async e awaitMSDN Webcast: Task-based Asynchronous Pattern (TAP), async e await
MSDN Webcast: Task-based Asynchronous Pattern (TAP), async e await
 

Semelhante a PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP

Desenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTV
Desenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTVDesenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTV
Desenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTV
mulder3
 
TV Digital - Entendendo a transmissão de aplicações - TDC2011
TV Digital - Entendendo a transmissão de aplicações - TDC2011TV Digital - Entendendo a transmissão de aplicações - TDC2011
TV Digital - Entendendo a transmissão de aplicações - TDC2011
Hugo Lavalle
 
Workshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgestWorkshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgest
Articacc, Lda
 
Vídeo digital ass
Vídeo digital  assVídeo digital  ass
Vídeo digital ass
Rafael Peixoto
 
Python 08
Python 08Python 08
Python 08
Bruno Catão
 
Html 5
Html 5Html 5
O ecossistema e o estado atual do php - o presente, o passado e o futuro da ...
O ecossistema e o estado atual do php  - o presente, o passado e o futuro da ...O ecossistema e o estado atual do php  - o presente, o passado e o futuro da ...
O ecossistema e o estado atual do php - o presente, o passado e o futuro da ...
Rodrigo Wanderley de Melo Cardoso
 
SAPO Videos
SAPO VideosSAPO Videos
SAPO Videos
codebits
 
Integração contínua em PHP com Jenkins
Integração contínua em PHP com JenkinsIntegração contínua em PHP com Jenkins
Integração contínua em PHP com Jenkins
Gilmar Pupo
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
Jaime Neto
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
Alessandro Binhara
 
Realidade Aumentada
Realidade AumentadaRealidade Aumentada
Realidade Aumentada
Campus Party Brasil
 
Tutorial poke-tool
Tutorial poke-toolTutorial poke-tool
Tutorial poke-tool
unifesptk
 
Video Distribution in the Internet (pt_BR)
Video Distribution in the Internet (pt_BR)Video Distribution in the Internet (pt_BR)
Video Distribution in the Internet (pt_BR)
Marcello Azambuja
 
Xdebug seus problemas acabaram - TDC - PHPeste
Xdebug   seus problemas acabaram - TDC - PHPesteXdebug   seus problemas acabaram - TDC - PHPeste
Xdebug seus problemas acabaram - TDC - PHPeste
Vitor Mattos
 
TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!
TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!
TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!
tdc-globalcode
 
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP SnifferSeguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
Vinicius Warto Campos
 
Raspberry pi - Dicas e truques
Raspberry pi - Dicas e truquesRaspberry pi - Dicas e truques
Raspberry pi - Dicas e truques
Marcelo Laranjeira Melo
 
2290494 integrando-flex-com-php
2290494 integrando-flex-com-php2290494 integrando-flex-com-php
2290494 integrando-flex-com-php
Brenno Abreu
 
Ligação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHP
elliando dias
 

Semelhante a PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP (20)

Desenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTV
Desenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTVDesenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTV
Desenvolvimento de Aplicacoes de TV interactiva na plataforma MEO IPTV
 
TV Digital - Entendendo a transmissão de aplicações - TDC2011
TV Digital - Entendendo a transmissão de aplicações - TDC2011TV Digital - Entendendo a transmissão de aplicações - TDC2011
TV Digital - Entendendo a transmissão de aplicações - TDC2011
 
Workshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgestWorkshop video 2014_metamorfoseii_culturgest
Workshop video 2014_metamorfoseii_culturgest
 
Vídeo digital ass
Vídeo digital  assVídeo digital  ass
Vídeo digital ass
 
Python 08
Python 08Python 08
Python 08
 
Html 5
Html 5Html 5
Html 5
 
O ecossistema e o estado atual do php - o presente, o passado e o futuro da ...
O ecossistema e o estado atual do php  - o presente, o passado e o futuro da ...O ecossistema e o estado atual do php  - o presente, o passado e o futuro da ...
O ecossistema e o estado atual do php - o presente, o passado e o futuro da ...
 
SAPO Videos
SAPO VideosSAPO Videos
SAPO Videos
 
Integração contínua em PHP com Jenkins
Integração contínua em PHP com JenkinsIntegração contínua em PHP com Jenkins
Integração contínua em PHP com Jenkins
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
 
Realidade Aumentada
Realidade AumentadaRealidade Aumentada
Realidade Aumentada
 
Tutorial poke-tool
Tutorial poke-toolTutorial poke-tool
Tutorial poke-tool
 
Video Distribution in the Internet (pt_BR)
Video Distribution in the Internet (pt_BR)Video Distribution in the Internet (pt_BR)
Video Distribution in the Internet (pt_BR)
 
Xdebug seus problemas acabaram - TDC - PHPeste
Xdebug   seus problemas acabaram - TDC - PHPesteXdebug   seus problemas acabaram - TDC - PHPeste
Xdebug seus problemas acabaram - TDC - PHPeste
 
TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!
TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!
TDC2016 | Trilha PHP - Xdebug: Seus problemas acabaram!
 
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP SnifferSeguindo padrões: Codificando profissionalmente com PHP Sniffer
Seguindo padrões: Codificando profissionalmente com PHP Sniffer
 
Raspberry pi - Dicas e truques
Raspberry pi - Dicas e truquesRaspberry pi - Dicas e truques
Raspberry pi - Dicas e truques
 
2290494 integrando-flex-com-php
2290494 integrando-flex-com-php2290494 integrando-flex-com-php
2290494 integrando-flex-com-php
 
Ligação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHP
 

Mais de Aryel Tupinambá

PHP Conference 2017: Como melhorar seu código com Laravel Collections
PHP Conference 2017: Como melhorar seu código com Laravel CollectionsPHP Conference 2017: Como melhorar seu código com Laravel Collections
PHP Conference 2017: Como melhorar seu código com Laravel Collections
Aryel Tupinambá
 
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Aryel Tupinambá
 
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
Aryel Tupinambá
 
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
Aryel Tupinambá
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
Aryel Tupinambá
 
Mini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe FlashMini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe Flash
Aryel Tupinambá
 

Mais de Aryel Tupinambá (6)

PHP Conference 2017: Como melhorar seu código com Laravel Collections
PHP Conference 2017: Como melhorar seu código com Laravel CollectionsPHP Conference 2017: Como melhorar seu código com Laravel Collections
PHP Conference 2017: Como melhorar seu código com Laravel Collections
 
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
Laraconf 2016: Construindo e mantendo aplicações multi-tenant (multi-cliente)
 
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
FrontInVale 2016: Webpack - A evolução do asset pipeline (Lightning Talk)
 
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...PHP Conference 2015:  Construindo e mantendo aplicações multi-tenant (multi-c...
PHP Conference 2015: Construindo e mantendo aplicações multi-tenant (multi-c...
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
 
Mini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe FlashMini-curso: Desenvolvimento de Games no Adobe Flash
Mini-curso: Desenvolvimento de Games no Adobe Flash
 

Último

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 

Último (6)

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 

PHP Conference 2017 - Processamento avançado de vídeos com FFmpeg e PHP

  • 1. Processamento avançado de vídeos com FFmpeg e PHP Aryel Tupinambá PHP Conference 2017
  • 2. Sobre o palestrante Aryel Tupinambá @DfKimera Co-fundador e CTO da LQDI Digital Projetos para empresas como Porto Seguro, Nestlé, Ticket e American Express CTO da PedeSabores.com.br E-commerce de frutas, verduras, legumes e outros produtos alimentícios 13 anos trabalhando com PHP Desde a época que o PHPClasses era a onda :)
  • 4. Sobre o FFmpeg - Projeto open source de 2000 - Conjunto de bibliotecas de transcoding de áudio e vídeo (libavcodec, libavformat) - Software command-line para conversão e manipulação de áudio e vídeo (ffmpeg) - Usado por grandes players de vídeo do mercado (YouTube, Vimeo, etc)
  • 5. Instalação Baixar binários em ffmpeg.org brew install ffmpeg --with-freetype apt-get install ffmpeg
  • 6. O que dá pra fazer? - Conversão de áudio e vídeo (formato, codec, resolução, qualidade) - Extrair áudio, vídeo ou snapshots - Manipular vídeos (FPS, coloração, audio mixing) - Combinar e compor vídeos (sobrepor, recortar, colar) - Streaming de áudio/vídeo / Transmissão ao vivo (ffserver)
  • 7. Convertendo o formato de um vídeo ffmpeg -i youtube.flv -c:v libx264 filename.mp4 Define entrada Seta o codec de vídeo Define saída
  • 8. Recortando o pedaço de um vídeo ffmpeg -i input.mp4 -ss 00:00:50.0 –c:v copy -t 20 output.mp4 Define entrada Define o ponto de início Seta o codec para "copy" (usa o mesmo formato de origem) Define a duração, em segudos Define saída
  • 9. Transformando um vídeo em GIF ffmpeg -i video.mp4 -vf scale=500:-1 -t 10 -r 10 image.gif Define entrada -vf = "set video filters" Define a duração do clip Define o "rate" Define a saída Hack para definir o aspect ratio e converter vídeo para imagem
  • 11. FFmpeg filters (-filter_complex) - Entradas e saídas; arquivos e streams - Piping das transformações - Streams indicam acesso a mais de uma mídia em um mesmo arquivo - Saídas "virtuais" são usadas como entradas "virtuais" de outros filtros #0 background.mp4 #1 person.mp4 crop drawtext chromakey overlay #0 output.webm format
  • 12. Anatomia de um filtro <inputs> filter=param=value:param2=value2 <outputs>
  • 13. Usando os filtros ffmpeg -i video.mp4 -i logo.png -filter_complex "[0][1] overlay" output.mp4 input #0 input #1 inputs (#0 e #1) overlay filter (input #1 sobre #0) Output final
  • 14. Filtros com múltiplas streams ffmpeg -i video.mp4 -filter_complex "[0:0] copy; [0:1] acodec=ogg" output.mp4 input #0 input #0, stream #0 (vídeo) Input #0, stream #1 (áudio) Final output
  • 15. Encadeando filtros (chaining) ffmpeg -i gameplay.mp4 -i player.mp4 -i logo.png -filter_complex " [1] scale=w=100:h=150 [logo]; [0][logo] overlay=x=0:y=0 [vid]; [2] crop=x=20:y=20:w=80:h=80 [player]; [player][vid] overlay=x=0:y=0 " output.mp4
  • 17. scale Redimensiona um vídeo / imagem ffmpeg -i video.mp4 -filter_complex " [0] scale=w=1280:h=720 " resized_video.mp4
  • 18. crop Recorta um vídeo / imagem ffmpeg -i video.mp4 -filter_complex " [0] crop=x=32:y=32:w=300:h=200 " resized_video.mp4
  • 19. copy / acopy Copia um stream de vídeo / áudio sem alterá-lo ffmpeg -i input_with_audio.mp4 -filter_complex " [0:0] scale=w=100:h=150; [0:1] acopy; " output_with_unchanged_audio.mp4
  • 20. copy / acopy Copia um stream de vídeo / áudio sem alterá-lo ffmpeg -i input_with_multiple_audio.mp4 -filter_complex " [0:0] copy; [0:2] copy; " output_with_single_audio.mp4
  • 21. overlay Sobrepõe uma entrada de vídeo sobre outra ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex " [0][1] overlay=x=10:y=10:w=100:h=200:enable='between(t,1,3)'; " output.mp4
  • 22. fade Efeito fade-in fade-out em um determinado stream ffmpeg -i video.mp4 -filter_complex " [1] fade=in:0:30, fade=out:2167:30; " output.mp4
  • 23. chromakey Aplica o efeito chromakey em um vídeo ffmpeg -i background.mp4 -i chroma.mp4 -filter_complex " [1] chromakey=color=green:similarity=0.1 [chroma]; [0][chroma] overlay; " output.mp4
  • 24. drawtext Desenha uma string de texto sobre um input ffmpeg -i video1.mp4 -filter_complex " [0] drawtext=fontsize=30:fontfile=Arial.ttf :enable='between(t,1,3)':text='Hello world'; " output.mp4
  • 25. Parâmetros com expressões ffmpeg -i video1.mp4 -filter_complex " [0] drawtext=fontsize=30:fontfile=Arial.ttf :enable='between(t,1,3)':text='Hello world'; " output.mp4 - É o que torna o ffmpeg tão flexível - Quase qualquer parâmetro numérico permite que sejam usadas expressões - Cada filtro tem uma série de variáveis nessas expressões Expressão entre aspas simples; O valor binário dessa expressão é aplicada frame a frame no parâmetro enable Variável t recebe o segundo atual ao longo do processamento
  • 26. Parâmetros com expressões ffmpeg -i video1.mp4 -filter_complex " [0] drawtext=fontsize=30 :fontfile=Arial.ttf:text='Hello world' :x='(w/2)-(text_w/2)':y='(w/2)-(text_w/2)'; " output.mp4 As variáveis w e h contem as dimensões do vídeo. As variáveis text_w e text_h contém as dimensões do bloco de texto Aqui usamos expressões para determinar o X e o Y para o centro da tela
  • 27. Parâmetros com expressões ffmpeg -i video1.mp4 -filter_complex " [0] drawtext=fontfile=Arial.ttf :text='Hello world':x=15:y=15 :fontsize='max(t/2, 30)'; " output.mp4
  • 28. Vamos testar na prática!
  • 29. Objetivos - Combinar dois vídeos com green-screen - Escrever "PHP Rocks!" no centro da tela - Salvar em .mp4 para visualização web
  • 31. Executando o ffmpeg via PHP - Método simples (exec() do command-line) - Método fácil (classe PHP-FFMpeg) - Método flexível (symfony/process)
  • 34.
  • 36. A biblioteca PHP-FFmpeg - Disponível para download no Composer (composer require php-ffmpeg/php-ffmpeg) - Abstrai chamadas diretamente no binary (via BinaryDriver) - Tem suporte a transcoding, filtros básicos, etc - Não possui uma série de filtros (principalmente que envolvem inputs/outputs) - Permite que você implemente filtros através da interface FilterInterface) - Recomendado para transformações e composições simples
  • 38. Conclusão - O ffmpeg é uma ferramenta que faz muito mais que converter vídeos - É possível implementar um editor de vídeos completo sobre a ffmpeg - O uso com o PHP é simples, através de command-line ou controle de processos - As operações de processamento de vídeos são pesadas; é recomendado trabalhar com elas em fila, e não via request HTTP
  • 39. Obrigado! Telegram: @DfKimera E-mail / Hangouts: aryel.tupinamba@lqdi.net Facebook: http://facebook.com/aryel.tupinamba Twitter: http://twitter.com/DfKimera LinkedIn: http://linkedin.com/in/aryeltupinamba http://lqdi.net Mais informações: https://ffmpeg.org/ffmpeg-filters.html https://trac.ffmpeg.org/wiki/FilteringGuide https://github.com/nwochaadim/ffmpeg- installation/wiki/Applying-complex-filters-to-videos https://github.com/PHP-FFMpeg/PHP-FFMpeg Slides da palestra: http://slideshare.net/aryeltupinamba