PHP-FFMpeg 操作音视频-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
✨ 目录
安装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);
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |