✨ 目录  
  🎈 安装PHP-FFMpeg 🎈 视频中提取一张图片 🎈 视频中提取多张图片 🎈 调整视频大小 🎈 视频添加水印 🎈 生成音频波形 🎈 音频转换 🎈 给音频添加元数据 🎈 拼接多个音视频 🎈 截取音视频 🎈 提取 gif 动图 🎈 裁剪视频 🎈 转换视频格式 🎈 调整视频帧率 🎈 获取音视频信息   
 
 
  
在使用 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 命令可以提取视频中的动图 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  ; 
} ) ; 
$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 ) ;