ダークエリア

SEのお仕事の備忘録や、ゲームの話などなどを記事に放り込む!!

PHPで動画ファイルを変換したい【ffmpeg】

動画のアップロード時、絶対画面に出せるように変換をかけた。

※前提

・AmazonLinux2

・PHP7 Laravel6

 

拡張子多すぎ問題!!!!

みんな平和に再生できればいいのに…(´・ω・`)

 

 

ffmpegをインストール

CentOS 6系,7系にFFmpegをインストールする手順|新卒エンジニアの開発日記

rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm

yum install ffmpeg ffmpeg-devel

 

これでうまくいかなかった…🐓ので、下記を実施。

How to install FFMPEG on EC2 running Amazon Linux? | by Vivek Maskara | Medium

・/usr/local/binにffmpegを入れる
$ cd /usr/local/bin
$ mkdir ffmpeg && cd ffmpeg
$ uname -a
$ wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
$ tar -xf ffmpeg-release-amd64-static.tar.xz

・場所を変更、リンクを貼ってバージョン確認。最後に削除も。
$ mv ffmpeg-4.3-amd64-static/* .
$ ./ffmpeg -version
$ ln -s /usr/local/bin/ffmpeg/ffmpeg /usr/bin/ffmpeg
$ ln -s /usr/local/bin/ffmpeg/ffprobe /usr/bin/ffprobe
$ ffmpeg -version
$ rm -fr ffmpeg-4.3-amd64-static
$ rm -f ffmpeg-release-amd64-static.tar.xz

 

■laravel-ffmpegを入れる

laravel-ffmpegを使って動画の変換をしてみる - Qiita

$ composer require pbmedia/laravel-ffmpeg

$ composer update

※1行目時点で下記が出た…🐓 composer.jsonの"repositories"定義が原因。削除した

フォトショのpsdファイル読めるようにしてたんだよねぇ…

phpclasses/phppsdreader

[InvalidArgumentException]
Could not find a matching version of package pbmedia/laravel-ffmpeg.

 

■config/app.phpに追記し、php artisan config:cache

GitHub - pascalbaljetmedia/laravel-ffmpeg:.

※ここは、githubを参考にしないと間違えてた。

・providers

ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider::class,

・aliases

'FFMpeg' => ProtoneMedia\LaravelFFMpeg\Support\FFMpeg::class,

 

■artisanコマンドでconfigファイルを作成させる

php artisan vendor:publish --provider="ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider"

「/config/laravel-ffmpeg.php」ができるので、パスを.envに下記を追加

$ vi .env

FFMPEG_BINARIES=/usr/bin/ffmpeg
FFPROBE_BINARIES=/usr/bin/ffprobe

 

■disk設定を追加(個人的に必要だった。。)

実装してみて「Unable to probe」が出た。原因はパス間違い。

ffmpegはdiskを利用するためこうなる。/config/filesystems.phpに下記を追加。

(storageを使わず、直接publicを使ってるため)

(ほんとうはすべきじゃないかもだけど知らん)

    'disks' => [
        'upload' => [
            'driver' => 'local',
            'root' => public_path(),
        ],

 

■実装

// ファイル変換(mp4にする)
if ( !in_array($extension, [ 'mp4', 'avi', 'mov' ]) ) {
    $format = new \FFMpeg\Format\Video\X264('libmp3lame', 'libx264');
    $ffmpeg = FFMpeg::fromDisk('upload')
        ->open( $path . $filename . '.' . $extension )->export()->toDisk('upload')->inFormat($format)
        ->save( $path . $filename . '.' . 'mp4' );
    unlink( public_path() . $path . $filename . '.' . $extension );
    $extension = 'mp4';
}

※「new \FFMpeg\Format\Video\X264()」だとEncoding failedが起きる。

 「new \FFMpeg\Format\Video\X264('libmp3lame', 'libx264')」が正解。

php - Laravel FFMPEG Error Encoding Failed using Laravel Queue - Stack Overflow

 

★上の実装のまま、変換を確認できたもの

動画形式とその特徴について を参考に、よく使われるであろう拡張子で動確。

avi⇒mp4

mov⇒mp4

wmv⇒mp4

flv⇒mp4

mpg⇒mp4

webm⇒mp4

み、みごとにぜんぶ変換できちゃ~~!🌸