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

藏色散人
藏色散人avant
2021-08-02 14:34:322873parcourir

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

1.2 Installer les bibliothèques dépendantes

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

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


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

 ./configuremakesudo make install

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

ffmpeg -version
ffplay -version

installation de laravelPHP-FFMpegExtension

composer require php-ffmpeg/php-ffmpeg

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',
            ]);
        });
    }

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

基础封装

举例:

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

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

    // 获取视频信息
    public static function getVideoInfo($streamPath)
    {
        $ffprobe = app(&#39;ffprobe&#39;);
        $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;
    }}

业务使用

接受 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();
        }
    }

例子中的 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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer