✨ 目录
🎈 安装PHP-FFMpeg 🎈 视频中提取一张图片 🎈 视频中提取多张图片 🎈 调整视频大小 🎈 视频添加水印 🎈 生成音频波形 🎈 音频转换 🎈 给音频添加元数据 🎈 拼接多个音视频 🎈 截取音视频 🎈 提取 gif 动图 🎈 裁剪视频 🎈 转换视频格式 🎈 调整视频帧率 🎈 获取音视频信息
🎈 安装PHP-FFMpeg
在使用 ffmpeg 之前,需要 安装软件
和 操作命令库
软件根据系统,自行选择安装,而操作命令库需要根据下列的命令进行安装 软件地址: https://github.com/BtbN/FFmpeg-Builds/releases命令地址: https://github.com/PHP-FFMpeg/PHP-FFMpeg/
composer require php-ffmpeg/php-ffmpeg
🎈 视频中提取一张图片
这里的 video.mp4
准备的是一段宫崎骏的视频片段 FFMpeg\FFMpeg::create
中需要指定系统软件中 ffmpeg
和 ffprobe
的安装位置通过 FFMpeg\Coordinate\TimeCode::fromSeconds
可以指定提取第几秒的视频作为图片保存
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> frame ( FFMpeg\ Coordinate\ TimeCode :: fromSeconds ( 10 ) )
-> save ( 'image.jpg' ) ;
🎈 视频中提取多张图片
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> filters ( )
-> extractMultipleFrames ( FFMpeg\ Filters\ Video\ ExtractMultipleFramesFilter :: FRAMERATE_EVERY_10SEC , '/path/to/destination/folder/' )
-> synchronize ( ) ;
$video
-> save ( new FFMpeg\ Format\ Video\ X264 ( ) , '/path/to/new/file' ) ;
🎈 调整视频大小
FFMpeg\Coordinate\Dimension
可以设置调整后的分辨率ResizeFilter::RESIZEMODE_FIT
是缩放模式中的一种,按照给定值进行调整ResizeFilter::RESIZEMODE_INSET
是缩放模式中的一种,按照给定的尺寸,等比缩放,如果设置的宽高比跟原视频不一样,那会自动根据宽或高进行等比缩放ResizeFilter::RESIZEMODE_SCALE_WIDTH
是缩放模式中的一种,高按照给定值,宽进行比例缩放ResizeFilter::RESIZEMODE_SCALE_HEIGHT
是缩放模式中的一种,宽按照给定值,高进行比例缩放true / false
是否强制使用最近的纵横比标准
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> filters ( )
-> resize ( new FFMpeg\ Coordinate\ Dimension ( 160 , 90 ) , FFMpeg\ Filters\ Video\ ResizeFilter :: RESIZEMODE_FIT , true ) ;
$video
-> save ( new FFMpeg\ Format\ Video\ X264 ( ) , 'video_new.mp4' ) ;
🎈 视频添加水印
通过 watermark
可以设置水印的相关信息,第一个参数是设置水印的地址,第二个参数里面可以设置水印位置参数 position:
可以选择 relative
相对定位,或者 absolute
绝对定位,如果选择 absolute
,则只需要填写 x
和 y
坐标即可top / bottom / left / right:
四个方位上下左右距离边缘的位置
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> filters ( )
-> watermark ( 'watermark.png' , array (
'position' => 'relative' ,
'bottom' => 10 ,
'right' => 10 ,
) ) ;
$video -> save ( new FFMpeg\ Format\ Video\ X264 ( ) , 'video_watermark_new.mp4' ) ;
🎈 生成音频波形
可以看到,想要生成音频波形,必须使用的是音频文件,如果是视频文件,需要先将其中的音频提取出来 waveform:
中可以设置波形图的长宽还有波形颜色
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$audio = $ffmpeg -> open ( 'audio.mp3' ) ;
$waveform = $audio -> waveform ( 640 , 120 , array ( '#00FF00' ) ) ;
$waveform -> save ( 'waveform.png' ) ;
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$audio_format = new FFMpeg\ Format\ Audio\ Mp3 ( ) ;
$video -> save ( $audio_format , 'audio.mp3' ) ;
$audio = $ffmpeg -> open ( 'audio.mp3' ) ;
$waveform = $audio -> waveform ( ) ;
$waveform -> save ( 'waveform.png' ) ;
🎈 音频转换
Flac;
为无损压缩格式setAudioChannels:
声道设置,1单声道,2双声道,3立体声setAudioKiloBitrate:
比特率
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$audio = $ffmpeg -> open ( 'audio.mp3' ) ;
$format = new FFMpeg\ Format\ Audio\ Flac ( ) ;
$format -> on ( 'progress' , function ( $audio , $format , $percentage ) {
echo "$percentage % 进度" ;
} ) ;
$format
-> setAudioChannels ( 2 )
-> setAudioKiloBitrate ( 256 ) ;
$audio -> save ( $format , 'audio.flac' ) ;
🎈 给音频添加元数据
支持给音频添加标题、艺术家、专辑、艺术家、作曲家、曲目、年份、描述、艺术品等
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$audio = $ffmpeg -> open ( 'audio.mp3' ) ;
$audio -> filters ( ) -> addMetadata ( [
"title" => "this is a song title" ,
"artist" => "tinygeeker" ,
"album" => "1024" ,
"composer" => "tinygeeker" ,
"track" => 1 ,
"year" => 2023 ,
"description" => "this is a song description" ,
"artwork" => "artwork.jpg"
] ) ;
$audio -> save ( new \ FFMpeg\ Format\ Audio\ Mp3( ) , 'audio_new.mp3' ) ;
🎈 拼接多个音视频
如果想把多个音视频拼成一个音视频的话,可以使用 concat
命令 concat:
参数中设置想拼接的各个短视频saveFromSameCodecs:
设置拼接后的视频名称,第二个参数设置为 true
则允许复制参数,可以加速文件的生成
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video_1.mp4' ) ;
$video
-> concat ( array ( 'video_1.mp4' , 'video_2.mp4' , 'video_3.mp4' ) )
-> saveFromSameCodecs ( 'video.mp4' , TRUE ) ;
🎈 截取音视频
TimeCode::fromSeconds:
有两个参数,第一个是从第几秒开始截取,第二个是截取多少秒,如果不填,则截取到最后
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> filters ( )
-> clip ( FFMpeg\ Coordinate\ TimeCode :: fromSeconds ( 30 ) ) ;
$video
-> save ( new FFMpeg\ Format\ Video\ X264 ( ) , 'video_clip.mp4' ) ;
🎈 提取 gif 动图
使用 gif
命令可以提取视频中的动图 fromSeconds
可以设置从第几秒开始提取,Dimension
可以设置大小和持续的时间
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> gif ( FFMpeg\ Coordinate\ TimeCode :: fromSeconds ( 30 ) , new FFMpeg\ Coordinate\ Dimension ( 640 , 480 ) , 3 )
-> save ( 'video.gif' ) ;
🎈 裁剪视频
通过 crop
可以裁剪视频 Dimension:
设置裁剪后的视频尺寸Point:
指定要裁剪的点,x
、y
坐标和 是否动态裁剪
这里 x
的值是 t*100
是从画面左边移动到右边这样裁剪,值越大,移动速度越快
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> filters ( )
-> crop ( new FFMpeg\ Coordinate\ Point ( "t*100" , 0 , true ) , new FFMpeg\ Coordinate\ Dimension ( 200 , 600 ) ) ;
$video -> save ( new FFMpeg\ Format\ Video\ X264 ( ) , 'video_crop.mp4' ) ;
🎈 转换视频格式
setKiloBitrate:
设置视频比特率setAudioChannels:
声道设置,1单声道,2双声道,3立体声setAudioKiloBitrate:
设置音频比特率
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$format = new FFMpeg\ Format\ Video\ X264 ( ) ;
$format -> on ( 'progress' , function ( $video , $format , $percentage ) {
echo "$percentage % transcoded" ;
} ) ;
$format
-> setKiloBitrate ( 1000 )
-> setAudioChannels ( 2 )
-> setAudioKiloBitrate ( 256 ) ;
$video -> save ( $format , 'video.avi' ) ;
🎈 调整视频帧率
framerate:
可以设置视频的帧速率大家应该都知道,视频其实是由一张张图片组成的,而一秒中播放30张以上其实肉眼就会把图片看成视频了,这里的 30
就是所谓的帧速了,一般设置 60
即可,为了测试这里设置成 1000
<?php
require 'vendor/autoload.php' ;
$ffmpeg = FFMpeg\ FFMpeg :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$video = $ffmpeg -> open ( 'video.mp4' ) ;
$video
-> filters ( )
-> framerate ( new \ FFMpeg\ Coordinate\ FrameRate( 1000 ) , 120 ) ;
$video
-> save ( new FFMpeg\ Format\ Video\ X264 ( ) , 'video_rate.mp4' ) ;
🎈 获取音视频信息
可以通过 format
获取音视频的所有信息 可以通过 get
获取指定信息的值
<?php
require 'vendor/autoload.php' ;
$ffprobe = FFMpeg\ FFProbe :: create ( [
'ffmpeg.binaries' => 'F:\ffmpeg\bin\ffmpeg.exe' ,
'ffprobe.binaries' => 'F:\ffmpeg\bin\ffprobe.exe' ,
] ) ;
$videoInfo = $ffprobe -> format ( 'video.mp4' ) ;
$duration = $ffprobe
-> format ( 'audio.mp3' )
-> get ( 'duration' , 100 ) ;
var_dump ( $videoInfo ) ;
var_dump ( $duration ) ;