Do not speak Portuguese? Translate this site with Google or Bing Translator
Laravel Queue com FFmpeg

Posted on: August 26, 2022 11:42 AM

Posted by: Renato

Views: 983

Transcodificação de vídeos para web streaming com FFmpeg usando Laravel Queues


Estou trabalhando em um projeto em que estávamos usando o transcodificador elástico da AWS para conversão de mídia. O Elastic transcoder é uma solução altamente escalável para transcodificação de mídia. No entanto, ele cobra por minuto para conversão de mídia, dependendo da sua região.Para reduzir os custos operacionais, decidimos deixar o transcodificador da AWS e usar o FFmpeg com Laravel para conversão de mídia em nossos próprios servidores. Neste tutorial, mostrarei como podemos usar o FFmpeg para conversão de mídia e processamento de adiamento usando Laravel Queues.

 

Vamos começar configurando um novo projeto. Crie um novo modelo de vídeo, sua migração e controlador. Armazenaremos as informações dos vídeos enviados na tabela de vídeos.

 

No upload do arquivo, armazenaremos o título do vídeo, o nome do arquivo original e o caminho do arquivo armazenado no banco de dados. Após o upload, enviaremos um Job para transcodificá-lo para um formato streamable da web e atualizar stream_path com o caminho do arquivo de saída, atualizar o convert_for_streaming_at timestamp e definir o processo como true depois que o FFmpeg terminar de processar o arquivo de mídia carregado.

Na classe de modelo de vídeo  , adicione a  coluna convert_for_streaming_at à matriz datas  para que ela seja alterada para datas como as colunas created_at  ou updated_at  .

Adicione essas rotas ao web arquivo php  .

A rota GET uploader  renderizará um formulário para upload de vídeos e a rota POST upload  tratará do envio do formulário, fará upload do vídeo, criará um registro de banco de dados e enviará um trabalho de transcodificação FFmpeg. A rota GET /  index renderizará a visualização de vídeos onde todos os vídeos enviados serão exibidos no player de vídeo HTML nativo.

Em VideoController  adicione esses métodos.

Criar  carregador lâmina php  no diretório views.

Além disso, crie uma  solicitação de formulário StoreVideoRequest para validar a entrada do formulário do carregador.

 

Temos uma   regra de validação de mimetypes com vídeo *  curinga para permitir apenas uploads de vídeo.

Agora crie um  trabalho ConvertVideoForStreaming  que será despachado depois que o vídeo for carregado e um registro de banco de dados for criado no método VideoController store  .

 

No método handle )  do trabalho despachado, criaremos um formato X264 de baixa taxa de bits. Abriremos o arquivo carregado do disco público e adicionaremos um filtro de redimensionamento a ele. Em seguida, diremos ao FFmpeg  para iniciar a transcodificação chamando o método export )  e o arquivo de saída para o disco público em um formato de contêiner mp4 de baixa taxa de bits.

Antes de testá-lo, certifique-se de ter instalado o pacote Laravel FFmpeg que estamos usando em nosso trabalho de transcodificação.

Além disso, certifique-se de ter os binários ffmpeg instalados em sua máquina. Se você estiver executando o Linux, poderá instalá-lo facilmente executando o seguinte comando apt install.

Você também deve adicionar FFmpeg  Service Provider e Facade ao app php .

 

e execute o seguinte comando para publicar os arquivos de configuração do pacote.

Se você estiver executando o Windows, você deve adicionar binários ffmpeg ao PATH do sistema. Se você não tiver acesso a isso, poderá definir essas variáveis ​​de ambiente em seu arquivo arquivo env  .

 

Configuração de filas do Laravel

Você também precisa configurar a conexão de fila em seu arquivo env. Para este tutorial, estou usando a conexão de fila de banco de dados. Editar env   e atualize a variável QUEUE_CONNECTION  para o banco de dados.

Execute também  php artisan queue table  para criar a migração da tabela de fila de banco de dados e php artisan migrate  para criar a tabela. Para lidar com trabalhos com falha, execute  php artisan queue failed table  para criar a tabela de migração de trabalhos de fila com falha e  php artisan migrate  para criar a tabela.

Trabalhador de fila em execução

Antes de irmos testar, execute o queue worker do Laravel

adicionamos um sinalizador -- timeout  ao queue worker. Isso indica que não queremos que nossos trabalhos de fila sejam executados por mais de 8600 segundos.

Agora, se você acessar a rota uploader  em seu aplicativo e enviar um arquivo de vídeo, um registro de banco de dados será criado e um trabalho de transcodificação será enviado. Você poderá visualizar seu trabalho despachado no terminal.

Exibindo vídeos

Crie vídeos lâmina php  no diretório de visualização.

 

Mostraremos um alerta para vídeos que estão sendo processados ​​no momento. Para vídeos processados, renderizaremos um elemento de vídeo com stream_path transcodificado.

Aqui está uma demonstração do que fizemos até agora.

Eu configurei um repositório Github com código de aplicativo de exemplo. Se você tiver algum problema ou tiver alguma dúvida, deixe um comentário e tentarei ajudá-lo de todas as maneiras possíveis.


1

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email