Table des matières
1.2 Installer les bibliothèques dépendantes " > 1.2 Installer les bibliothèques dépendantes
Maison cadre php Laravel Explication détaillée de la façon dont Laravel installe FFmpeg et traite les fichiers vidéo

Explication détaillée de la façon dont Laravel installe FFmpeg et traite les fichiers vidéo

Aug 02, 2021 pm 02:34 PM
laravel

Ubuntu 18.04 Installer FFmpeg

1. Téléchargez le code source, compilez et installez

1.1 Téléchargez le code source

Adresse github : github.com/PHP-FFMpeg/PHP-FFMpeg

Il existe trois installations principales : yasm, sdl1.2 et sdl2.0

安装 yasmsudo apt-get install yasm
安装sdl1.2sudo apt-get install libsdl1.2-dev
安装 sdl2.0sudo apt-get install libstdl2-devsudo apt-get install libstdl2-dev
Copier après la connexion

S'il y a une erreur dans l'installation de sdl2.0, vous pouvez choisir la méthode de compilation et d'installation :
Télécharger la dernière version depuis le site officiel : www.libsdl.org/download-2.0.php
Après la décompression, entrez dans le répertoire et exécutez les commandes suivantes dans l'ordre :

./configure
make
sudo make install
Copier après la connexion


1.3 Compilez et installez ffmpeg
Entrez le dossier ffmpeg et exécutez le commandes suivantes dans l'ordre :

 ./configuremakesudo make install
Copier après la connexion

Insérer la description de l'image ici
1.4 Tester si l'installation est réussie

ffmpeg -version
ffplay -version
Copier après la connexion

installation de laravelPHP-FFMpegExtension

composer require php-ffmpeg/php-ffmpeg
Copier après la connexion

Utilisation de base
1.1, introduction au projet
Le l'introduction est terminée, il doit formuler deux informations sur le fichier de configuration afin que nous puissions l'utiliser normalement, qui est le ffmpeg mentionné ci-dessus Et ffprobe
1.2, configuration globale

Ajouter du code à AppServiceProvider.phpAppServiceProvider.php 中添加代码

    public function boot()
    {
        $this->registerSingleObject();
    }
     private function registerSingleObject()
    {//       $ffmpeg = FFMpeg::create(array(//           'ffmpeg.binaries'  => '/usr/local/ffmpeg/ffmpeg',//           'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',//           'timeout'          => 3600, // The timeout for the underlying process//           'ffmpeg.threads'   => 12,   // The number of threads that FFMpeg should use//       ));
        $this->app->singleton('ffmpeg', function ($app) {
            return FFMpeg::create([
                'ffmpeg.binaries'  => '/usr/local/ffmpeg/ffmpeg',
                'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',
            ]);
        });
        $this->app->singleton('ffprobe', function ($app) {
            return FFProbe::create([
                'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',
            ]);
        });
    }
Copier après la connexion

使用单例模式获取 FFMpegFFProbe 对象,其中 exec('which ffmpeg') 是获取 程序位置信息,以便创建类

基础封装

举例:

  • 视频的第一秒为封面
  • 获取视频基础信息
<?php

namespace AppHelpers;use FFMpegCoordinateTimeCode;use IlluminateSupportStr;class FFMpegUtil{

    // 获取视频信息
    public static function getVideoInfo($streamPath)
    {
        $ffprobe = app('ffprobe');
        $stream  = $ffprobe->streams($streamPath)->videos()->first();
        return $stream ? $stream->all() : [];
    }

    // 截取
    public static function getCover($streamPath, $fromSecond)
    {
        $ffmpeg   = app('ffmpeg');
        $video    = $ffmpeg->open($streamPath);
        $frame    = $video->frame(TimeCode::fromSeconds($fromSecond)); //提取第几秒的图像
        $fileName = 'video/' . Str::random(12) . '.jpg';
        if (!is_dir(storage_path("video"))) {
            mkdir(storage_path("video"), 0777);
        }
        $frame->save(storage_path($fileName));
        return $fileName;
    }}
Copier après la connexion

业务使用

接受 Request 对象传入的 视频 为例子

public function saveVideotoQiniu($file)
    {
        Auth::loginUsingId(1);
        if ($user = getUser()) {

            // 1.判断是否存在此视频
            $path  = $file->getRealPath();
            $hash  = md5_file($path);
            $video = Video::firstOrNew(['json->hash' => $hash]);
            if ($video->id) {
                $video->touch();
                return $video;
            }

            // 2.保存到 云
            $cdn_path = $this->saveFile($file);
            $db_path  = getPath($cdn_path);

            // 3.获取截图
            $fileName = FFMpegUtil::getCover($path, 1);
            $image    = $this->saveImage(new UploadedFile(storage_path($fileName), 'file.jpg'));

            //4.设置视频信息
            $data     = [];
            $data     = FFMpegUtil::getVideoInfo($path);
            $duration = array_get($data, 'duration');
            $duration = $duration > 0 ? ceil($duration) : $duration;

            $video->path    = $db_path;
            $video->user_id = $user->id;
            $video->setJsonData('width', array_get($data, 'width'));
            $video->setJsonData('height', array_get($data, 'height'));
            $video->duration = $duration;
            $video->setJsonData('cover', $image->path);
            $video->save();
        }
    }
Copier après la connexion

例子中的 saveImagerrreee

Utilisez le mode singleton pour obtenir les objets FFMpeg et FFProbe. Parmi eux, exec('which ffmpeg') permet d'obtenir les informations d'emplacement du programme dans afin de créer la classe

package de base🎜🎜Exemple : 🎜
  • La première seconde de la vidéo est la couverture li>
  • Obtenir des informations de base sur la vidéo
rrreee🎜🎜🎜Utilisation professionnelle🎜🎜Accepter la vidéo transmise par l'objet Request à titre d'exemple🎜rrreee🎜Le saveImage dans l'exemple est de La fonction de téléchargement d'images sur le cloud renvoie l'URL de l'image téléchargée 🎜🎜Pour plus d'articles techniques sur Laravel, veuillez visiter la colonne 🎜tutoriel Laravel🎜 ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP vs Flutter : le meilleur choix pour le développement mobile PHP vs Flutter : le meilleur choix pour le développement mobile May 06, 2024 pm 10:45 PM

PHP vs Flutter : le meilleur choix pour le développement mobile

Laravel - Commandes artisanales Laravel - Commandes artisanales Aug 27, 2024 am 10:51 AM

Laravel - Commandes artisanales

Analyse des avantages et inconvénients des outils de tests unitaires PHP Analyse des avantages et inconvénients des outils de tests unitaires PHP May 06, 2024 pm 10:51 PM

Analyse des avantages et inconvénients des outils de tests unitaires PHP

Comment utiliser le mappage objet-relationnel (ORM) en PHP pour simplifier les opérations de base de données ? Comment utiliser le mappage objet-relationnel (ORM) en PHP pour simplifier les opérations de base de données ? May 07, 2024 am 08:39 AM

Comment utiliser le mappage objet-relationnel (ORM) en PHP pour simplifier les opérations de base de données ?

Architecture et pratique du système distribué PHP Architecture et pratique du système distribué PHP May 04, 2024 am 10:33 AM

Architecture et pratique du système distribué PHP

Comparaison des dernières versions de Laravel et CodeIgniter Comparaison des dernières versions de Laravel et CodeIgniter Jun 05, 2024 pm 05:29 PM

Comparaison des dernières versions de Laravel et CodeIgniter

Comment les capacités de traitement des données de Laravel et de CodeIgniter se comparent-elles ? Comment les capacités de traitement des données de Laravel et de CodeIgniter se comparent-elles ? Jun 01, 2024 pm 01:34 PM

Comment les capacités de traitement des données de Laravel et de CodeIgniter se comparent-elles ?

Tests unitaires de code PHP et tests d'intégration Tests unitaires de code PHP et tests d'intégration May 07, 2024 am 08:00 AM

Tests unitaires de code PHP et tests d'intégration

See all articles