Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
21
Help us understand the problem. What is going on with this article?
@amymd

【Laravel】ffmpegで動画ファイルからサムネイル画像を取得してS3にアップロードする方法

More than 3 years have passed since last update.

概要

  • ユーザが動画ファイルをアップロードしてサイトで表示するようなサービスで、その動画のサムネイル画像を自動で指定したいときってありませんか?
  • そういう時、いちいち動画の中からサムネイル用画像を切り出すのってめんどくさいですよね
  • そこでFFMpegを使って、動画の1フレーム目を自動的に画像として取り出して、サーバにアップロードする機能を実装しました

FFmpegのインストール

FFmpegとは、動画や音声の変換や合成などの処理が可能なオープンソースのソフトウェアです。

インストール方法は下記の公式サイトで詳しく説明されているため、そこを参考にインストールしてみてください。
https://trac.ffmpeg.org/wiki/CompilationGuide

ちなみに自分はCentOS6系にインストールしたかったので、下記の記事を参考にさせていただきました。
CentOS6.xにFFmpegをインストールする - Code Life

インストールが終わると、ターミナルなどからffmpeg -versionのコマンドを実行して、きちんとインストールされたかどうかを確かめましょう。

Laravel FFMpegのインストール

インストールが終わったら、次はLaravelで使うための準備です。LaravelからFFmpegを使うためには、PHP-FFMpegのラッパーライブラリであるLaravel-FFMpegをインストールします。

ちなみにこのライブラリは、Laravel 5.1以上かつPHP 7.0, 7.1のみで動作するそうなので、バージョンには気をつけてください。

composer.jsonに下記のように一行を追加します。

composer.json
   "require": {
        "pbmedia/laravel-ffmpeg": "1.1.4"
    },

その後、composer updateを実行して、ライブラリをインストールしてください。
インストール後は、config/app.phpを下記のように編集します。

config/app.php

'providers' => [
    ...
    Pbmedia\LaravelFFMpeg\FFMpegServiceProvider::class,
    ...
];

'aliases' => [
    ...
    'FFMpeg' => Pbmedia\LaravelFFMpeg\FFMpegFacade::class
    ...
];

サムネイル画像の取得方法

これで準備は整ったので、あとは実装です!
基本的にライブラリの使い方は、GitHubのREADME.mdをみればわかるのですが、例えば、ローカルに保存した動画ファイルから、サムネイル画像を自動で取得し、S3にアップロードする処理を実装しようとすると、下記のようになります。

app/Http/Controllers/VideoController.php
<?php
namespace App\Http\Controllers;

use FFMpeg;

    public function upload_video()
    {
        // ローカルにある動画ファイルからサムネイル画像を取得し、S3にアップロード
        FFMpeg::fromDisk('local')
            ->open($file) // ローカル(storage/app)に保存したファイル名を指定
            ->getFrameFromSeconds(1)
            ->export()
            ->toDisk('s3')
            ->save('temp/thumbnail.jpg');
    }

getFrameFromSeconds(1)というのが、「動画の1フレーム目」を表しています。
これで簡単にサムネイル画像の取得とアップロードが実装できちゃいます。
他にも動画の形式の変換や、音声ファイルの変換もできるようなので、ぜひLaravelで実装したい方はお試しください。

21
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
amymd

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
21
Help us understand the problem. What is going on with this article?