PHP-FFMpeg 操作音视频

news2024/12/23 8:41:02

✨ 目录

    • 🎈 安装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 中需要指定系统软件中 ffmpegffprobe 的安装位置
  • 通过 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,则只需要填写 xy 坐标即可
  • 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',
]);

// Open your video file / 打开视频文件
$video = $ffmpeg->open( 'video.mp4' );

// Set an audio format / 设置音频格式
$audio_format = new FFMpeg\Format\Audio\Mp3();

// Extract the audio into a new file as mp3 / 保存成 mp3 文件
$video->save($audio_format, 'audio.mp3');

// Set the audio file / 打开 mp3 文件
$audio = $ffmpeg->open( 'audio.mp3' );

// Create the waveform / 生成波形图
$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: 指定要裁剪的点,xy 坐标和 是否动态裁剪
  • 这里 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');

// 也可以通过 get 获取指定信息的内容,第二个参数为默认值,如果获取不到该信息的话返回默认值
$duration = $ffprobe
    ->format('audio.mp3')
    ->get('duration', 100);

var_dump($videoInfo);
var_dump($duration);

详细信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

印刷包装经营小程序商城的作用是什么

印刷包装业的市场需求度非常高&#xff0c;如礼品盒、标签、购物袋、企业宣传物料、周边等大小服务&#xff0c;线下各城市从业者与线上行业电商数量也很多。 然而随着线下竞争激烈、用户线上消费度提升&#xff0c;同时线上第三方平台入驻商家面临抽成/入驻费/流量费、难以打…

最近邻插值的原理及实现

1. 介绍 插值算法一般用来做上采样和下采样,最邻近插值算法,是插值算法中最简单的一种。 最邻近插值:将每个目标像素找到距离它最近的原图像素点,然后将该像素的值直接赋值给目标像素。 优点: 实现简单,计算速度快 缺点:插值结果缺乏连续性,可能会产生锯齿状的边缘,对…

docker 配置mongoDB

## 拉取镜像 docker pull mongo## 设置默认账号密码 test:test 默认数据 test docker run -d --name mongo-container -e MONGO_INITDB_ROOT_USERNAMEtest -e MONGO_INITDB_ROOT_PASSWORDtest -e MONGO_INITDB_DATABASEtest -p 27017:27017 mongo

nginx优先级和匹配方式

在http模块有server server中才有location location匹配的是uri Nginx正则表达式&#xff1a; ^&#xff1a;字符串的起始位置 $&#xff1a;字符串的结束位置 *&#xff1a;匹配所有 &#xff1a;匹配前面的字符一次或多次 &#xff1f;&#xff1a;匹配前面的字符0次或…

redhat配置本地yum源(超详细,超简单)

目录 ​编辑 1、硬件配置 2、配置本地yum源 1、硬件配置 注意这里要使用is

2023年浙大MEM考前80天上岸经验分享

时间过得真快&#xff0c;转眼间已经是十月份了。回想起去年这个时候&#xff0c;我还在为考研而感到焦虑不安。然而&#xff0c;如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中&#xff0c;我不仅学到了许多专业知识&#xff0c;还结识了很多志同道合…

C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)

C(Qt)软件调试—linux使用dmesg定位程序崩溃位置&#xff08;14&#xff09; 文章目录 C(Qt)软件调试---linux使用dmesg定位程序崩溃位置&#xff08;14&#xff09;1、前言2、ELF文件3、常用工具4、使用dmesg定位异常位置1.1 异常发生在可执行程序中1.2 异常发生在动态库中 1、…

上海见 | 易基因科技与您相约2023年中国微生物学会学术年会

由中国微生物学会、上海市微生物学会主办&#xff0c;复旦大学、复旦大学上海医学院、上海交通大学、华东理工大学承办的“2023年中国微生物学会学术年会”将于2023年10月20—23日在上海光大会展中心有限公司国际大酒店举行。会议热忱欢迎全国从事微生物学研究、教学和微生物开…

ms-sql server sql 把逗号分隔的字符串分开

案例&#xff1a; sql 查询-字段里是逗号,分隔开的数组&#xff0c;查询匹配数据 sql 查询-字段里是逗号,分隔开的数组&#xff0c;查询匹配数据_sql server 数组匹配-CSDN博客 SQL SERVER 把逗号隔开的字符串拆分成行 SQL SERVER 把逗号隔开的字符串拆分成行_sqlserver拆分…

Linux磁盘扩容(超详细)

一、第一步VM虚拟机扩容磁盘 首先我们要先关闭虚拟机&#xff0c;然后这个虚拟机不能存在镜像&#xff0c;否则无法进行扩容 提示&#xff1a; 如果想要某个镜像扩容的解决办法&#xff1a; 可以先保存当前镜像&#xff0c;然后在跳转到你想保存的镜像当中&#xff0c;然后对那…

21款奔驰GLS400升级电吸门 告别异响

这项功能作用&#xff1a; 1.关闭车门时就不用很大力&#xff0c;增加了舒适性&#xff0c;也使关门动作更优雅。 2.车门没有完全关闭会增加危险性&#xff0c;有了此功能就不必担心&#xff0c;Xjh15863 电吸门可以避免车门未关紧闭带来的安全隐患&#xff0c;这款电吸门&a…

SpringBoot 快速实现 api 接口加解密

在项目中&#xff0c;为了保证数据的安全&#xff0c;我们常常会对传递的数据进行加密。常用的加密算法包括对称加密&#xff08;AES&#xff09;和非对称加密&#xff08;RSA&#xff09; 项目介绍 该项目使用RSA加密方式对API接口返回的数据加密&#xff0c;让API数据更加安…

为什么嵌入通常优于TF-IDF:探索NLP的力量

塔曼纳 一、说明 自然语言处理&#xff08;NLP&#xff09;是计算机科学的一个领域&#xff0c;涉及人类语言的处理和分析。它用于各种应用程序&#xff0c;例如聊天机器人、情绪分析、语音识别等。NLP 中的重要任务之一是文本分类&#xff0c;我们根据文本的内容将文本分类为不…

windows设置右键打开 vscode的方法(简易版)

实现效果如下&#xff1a; 如果安装VScode时没有选择下面两项&#xff0c;则无法通过快捷键打开 如何设置右键打开VSCode&#xff1f; 具体步骤如下&#xff1a; 找到 VSCode的快捷方式&#xff0c;右键选择 属性。 复制目标中的文件所在路径。 创建一个文本文档&#…

实现最简的内核模块

实现最简单的内核模块&#xff0c;可从中窥探内核模块的编写流程。同时&#xff0c;也可以在其上进行扩展&#xff0c;对内核函数和全局变量进行调用和打印&#xff0c;熟悉内核接口。 在实现最简内核模块之前&#xff0c;在本地安装配置开发环境。可用选择使用vagrant工具快速…

AMEYA360:ROHM开发出可更大程度激发GaN器件性能的超高速栅极驱动器IC

全球知名半导体制造商ROHM(总部位于日本京都市)开发出一款超高速驱动GaN器件的栅极驱动器IC“BD2311NVX-LB”。 近年来&#xff0c;在服务器系统等领域&#xff0c;由于 IoT 设备的需求日益增长&#xff0c;电源部分的功率转换效率提升和设备的小型化已经成为重要的社会课题&am…

Cannot use object of type __PHP_Incomplete_Class as array

场景&#xff1a;将项目复制 出来一份后&#xff0c;修改控制器&#xff0c;打开后就报错 解决&#xff1a;将runtime 清除后就正常了

GEE:为机器学习算法(随机森林、支持矢量机等)加入膨胀/腐蚀特征

作者:CSDN @ _养乐多_ 腐蚀和膨胀 是数学形态学图像处理中的两个基本操作,用于修改和分析二值图像(包含只有两个像素值的图像,通常是黑和白)。这些操作可用于博客《GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)》中写的机器学习…

字节码增强技术-ASM

概述 在Java中一般是用javac命令编译源代码为字节码文件&#xff0c;一个.java文件从编译到运行的示例如图所示: 使用字节码的好处&#xff1a;一处编译&#xff0c;到处运行。java 就是典型的使用字节码作为中间语言&#xff0c;在一个地方编译了源码&#xff0c;拿着.class …

逻辑回归揭秘: 从分类原理到机器学习实践

机器学习 第五课 逻辑回归 概述逻辑回归应用领域逻辑回归 vs 线性回归基本定义输出类型函数关系误差计算使用场景数据分布 逻辑回归的数学原理Sigmoid 函数多数几率似然函数逻辑回归损失函数 正则化L1 正则化L2 正则化L1 vs L2 实例 标准化为什么要标准化?如何进行标准化? 梯…