Criando histórias para Instagram a partir do PHP

Entrada


Recentemente, as pessoas estão mais dispostas a assistir a vídeos nas redes sociais do que a procurar fotos. O Storis no Instagram obtém 3-4 vezes mais visualizações do que apenas uma foto.

E, é claro, não paramos de esquecer que as redes sociais não são apenas para se mostrar, ver os outros, mas também para promover seus bens, serviços etc. Há muito tempo aprendemos a postar notícias publicadas recentemente no site no VKontakte. Mas e se formos mais longe? E se você enviar essas informações como um vídeo? Ou envie histórias de vídeo interessantes no Instagram para atrair mais atenção do público?

Então, tive a idéia de criar uma biblioteca que me permitisse criar vídeos curtos a partir de fotografias, textos e animações desses objetos. Sim, alguém pode dizer que já existem serviços que permitem que você faça isso, e por que usar uma bicicleta? Em primeiro lugar - eu quero, em segundo lugar - eu posso, em terceiro lugar - será gratuito.

Este artigo é sobre como trabalhar com a biblioteca, como criar suas próprias histórias a partir do PHP.

Limitações


Deve-se dizer imediatamente que a biblioteca usa o FFmpeg para gerar o arquivo de vídeo final. O FFmpeg deve estar instalado no servidor. Talvez no futuro haja uma opção para gerar histórias como um arquivo gif, mas por mim mesmo escolhi o arquivo de vídeo como resultado do trabalho.

Preparação


A biblioteca é instalada através do compositor

composer require borodin-vasiliy/php-stories 

Criando histórias


É hora de criar sua própria história. Por exemplo, queremos ver a foto de fundo de um gatinho, que está um pouco mais próxima ao longo da história e exibir 2 textos com uma animação da aparência. Fácil!

Inicialização Storis
 //    5    720x1280 $stories = new Stories([ "width" => 720, "height" => 1280, "duration" => 5 ]); 


Como você pode ver, todos os parâmetros são passados ​​como uma matriz. No momento, você pode alterar:

  • "Width" - largura do Storis em pixels
  • "Altura" - altura em pixels
  • "Duração" - Duração em segundos
  • "Fps" - O número de quadros por segundo, de acordo com o padrão - 30

Em seguida, precisamos adicionar 3 objetos (uma imagem e 2 textos) à nossa história futura. No momento, a biblioteca permite adicionar 4 tipos de objetos diferentes - imagem, texto, eleps, retângulo. Cada objeto tem seu próprio método, o argumento do método é uma matriz dos parâmetros do objeto adicionado.

Os objetos têm como parâmetros comuns:

  • "Top" - a posição do objeto a partir da borda superior da história
  • "Esquerda" - a posição do elemento a partir da borda esquerda da história
  • "Opacidade" - transparência, como em css [0 ... 1]
  • "Rodar" - o ângulo de rotação do objeto [0 ... 359]
  • "Z-index" - uma camada, como um z-index em css - quanto maior, mais alta será a camada no elemento de quadro
  • "Iniciar" - o segundo quando o item deve ser adicionado à história
  • "Fim" - o segundo quando o item deve ser removido da história

Tão exclusivo para cada tipo de objeto, por exemplo, para uma imagem:

  • "Caminho" - o caminho para a imagem que queremos adicionar
  • "Escala" - multiplicador de tamanho da imagem (aproximação)

Adicionando uma imagem à história
 //      $main_image = $dir."/images/1.jpg"; //   ) list($image_width, $image_height) = getimagesize($main_image); // ,      ,       $image_start_scale = round(1280 / $image_height, 1); //   $stories->addImage([ "path" => $main_image, "top" => round(-1 * ($image_height * $image_start_scale - $stories_height) / 2), //        "left" => round(-1 * ($image_width * $image_start_scale - $stories_width) / 2), //        "scale" => $image_start_scale ]); 


Feito! Se agora gerar uma história, por 5 segundos admiraremos o gato. Mas prometi que haverá animação, vamos adicioná-lo.

A animação do objeto é adicionada usando um método separado, cujo argumento é uma matriz de parâmetros para os quais o objeto deve chegar. As animações para um objeto podem ser qualquer número. Vale dizer que a sintaxe da biblioteca implica o uso da Interface Fluente.

Adicionando imagens e animações
 //      $main_image = $dir."/images/1.jpg"; //   ) list($image_width, $image_height) = getimagesize($main_image); // ,      ,       $image_start_scale = round(1280 / $image_height, 1); // $image_end_scale = $image_start_scale + 0.5; //     $stories->addImage([ "path" => $main_image, "top" => round(-1 * ($image_height * $image_start_scale - $stories_height) / 2), //        "left" => round(-1 * ($image_width * $image_start_scale - $stories_width) / 2), //        "scale" => $image_start_scale ])->addAnimation([ "top" => round(-1 * ($image_height * $image_end_scale - $stories_height) / 2), //         "left" => round(-1 * ($image_width * $image_end_scale - $stories_width) / 2),//         "scale" => $image_end_scale, ]); 


Como você deve ter notado, o método addAnimation é usado para adicionar animação. Parâmetros necessários para animação:

  • "Iniciar" - O segundo quando a animação deve começar. Se não estiver definido, a animação começará quando o objeto for adicionado.
  • "Duração" - a duração da animação em segundos

Uma matriz de parâmetros que a animação pode afetar:

  • "Top"
  • "Esquerda"
  • "Opacidade"
  • "Rodar"
  • "Escala"
  • "Largura"
  • "Altura"

Adicionando texto
 //   $stories->addText([ "text" => "Hello world!", "path" => $dir."/fonts/helvetica.ttf", "size" => 130, "color" => "#ffffff", "width" => 620, "top" => 200, "left" => 50, "opacity" => 0, "shadow" => [ "color" => "#000000", "top" => 4, "left" => 4 ] ])->addAnimation([ "duration" => 1, "opacity" => 1 ])->addAnimation([ "start" => 4.5, "duration" => 0.5, "opacity" => 0 ]); //   $stories->addText([ "text" => "This is a test of function adding text", "path" => $dir."/fonts/helvetica.ttf", "size" => 100, "color" => "#ffffff", "width" => 620, "top" => 750, "left" => 50, "start" => 0.5, "opacity" => 0, "shadow" => [ "color" => "#000000", "top" => 4, "left" => 4 ] ])->addAnimation([ "duration" => 1, "opacity" => 1 ])->addAnimation([ "start" => 4.5, "duration" => 0.5, "opacity" => 0 ]); 


O texto possui seus próprios parâmetros exclusivos:

  • "Texto" - o texto que você deseja exibir - obrigatório
  • "Caminho" - caminho para a fonte (.ttf) - obrigatório
  • "Tamanho" - tamanho da fonte
  • "Cor" - cor, por exemplo "#ffffff"
  • "Largura" - a largura do bloco de texto, se definido, o texto será automaticamente dividido em linhas
  • "Alinhar" - alinhamento do texto [esquerda, centro, direita]
  • "Sombra" é uma sombra

Uma sombra também é uma matriz de parâmetros:

  • "Cor" - a cor da sombra
  • "Top" - recuo de cima
  • "Esquerda" - margem esquerda

Geração de histórias
 $file_hash = $stories->generate("/tmp"); 


Como resultado, obtemos o nome do arquivo que está na pasta temporária passado como argumento.

Resultado do trabalho




Vale dizer que a velocidade de criação de histórias não é grande, em um bom computador é gerado um clipe de 5 segundos na ordem de um minuto, em um servidor simples por mais de 3 minutos.

Planos de desenvolvimento


  • Adicionando scripts de animação padrão para reduzir o código
  • Animações de texto (aparência linha por linha, etc.)
  • Plano de fundo para o texto.

Espero que alguém ache esta biblioteca útil. Ficarei feliz em ouvir críticas e desejos no funcional.

Repositório Git

Source: https://habr.com/ru/post/pt436514/


All Articles