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

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

  • 1.
    Processamento avançado de vídeoscom FFmpeg e PHP Aryel Tupinambá PHP Conference 2017
  • 2.
    Sobre o palestrante AryelTupinambá @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 :)
  • 3.
  • 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 emffmpeg.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 formatode 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çode 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ídeoem 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
  • 10.
  • 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 umfiltro <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últiplasstreams 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
  • 16.
  • 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 Copiaum 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 Copiaum 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 entradade 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-outem um determinado stream ffmpeg -i video.mp4 -filter_complex " [1] fade=in:0:30, fade=out:2167:30; " output.mp4
  • 23.
    chromakey Aplica o efeitochromakey 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 stringde 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 naprática!
  • 29.
    Objetivos - Combinar doisvídeos com green-screen - Escrever "PHP Rocks!" no centro da tela - Salvar em .mp4 para visualização web
  • 30.
  • 31.
    Executando o ffmpegvia PHP - Método simples (exec() do command-line) - Método fácil (classe PHP-FFMpeg) - Método flexível (symfony/process)
  • 32.
  • 33.
  • 35.
  • 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
  • 37.
  • 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