🎈 安装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);
 
