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
み、みごとにぜんぶ変換できちゃ~~!🌸