PHP-FFMpeg 操作音视频

✨ 目录

    • 🎈 安装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.rhkb.cn/news/164007.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微前端四:qiankun在开发中遇到的问题

在qiankun开发中会遇到很多问题&#xff0c;上一篇微前端三&#xff1a;qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题&#xff0c;下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…

Linux-git

文章目录 git简介git常用命令配置初始化仓库将文件添加到暂存区将暂存区文件加入版本库对比工作区某文件和暂存区中的区别将暂存区的文件移除但git仍管理将文件移除暂存区并且git不再管理查看版本库切换到之前的版本恢复文件持久化 云端将本地的项目推送到远程仓库将远程仓库的…

weapp-tailwindcss for uni-app 样式条件编译语法插件

weapp-tailwindcss for uni-app 样式条件编译语法插件 版本需求 2.10.0 weapp-tailwindcss for uni-app 样式条件编译语法插件 这是什么玩意?如何使用 tailwind.config.js 注册postcss 插件注册 uni-app vite vue3uni-app vue2 配置完成 配置项 这是什么玩意? 在 uni-app …

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍 本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽&#xff0c;后端使用GO开发&#xff0c;前端使用VUE的Element-Plus作为UI框架&#xff0c;整个面板的管理都是基于docker的&#xff0c;想法很先进。官方还提供了视频的使用教程&…

vue使用pdf-dist实现pdf预览以及水印

vue使用pdf-dist实现pdf预览以及水印 一.使用pdf-dist插件将PDF文件转换为一张张canvas图片 npm install pdf-dist二.页面引入插件 const pdfJS require("pdfjs-dist"); pdfJS.GlobalWorkerOptions.workerSrc require("pdfjs-dist/build/pdf.worker.entry&…

ubuntu18.04 LTS卸载qtcreator-10.0.2

之前通过命令&#xff0c;通过.run文件&#xff0c;安装了Qt Creator 默认安装路径是/opt/ 卸载 在安装路径下&#xff0c;可以看到QtCreatorUninstaller文件 命令行运行该执行文件&#xff0c;会弹出卸载窗口&#xff0c;记得勾选下面的“仅卸载”

el-upload实现上传文件夹

背景&#xff1a;如图一所示&#xff0c;最下面有一个黄色上传文件按钮&#xff0c;为手动上传而且上传区域有上传文件和上传文件夹的区分 所以需要在点击了上传文件夹做特殊处理使得el-upload可以上传文件夹 一、template区域 <el-uploadclass"upload-file"dra…

小程序:uniapp解决主包体积过大的问题

已经分包但还是体积过大 运行时勾选“运行时是否压缩代码”进行压缩 在manifest.json配置&#xff08;开启分包优化&#xff09; "mp-weixin" : {"optimization" : {"subPackages" : true}//.... },在app.json配置&#xff08;设置组件按需注入…

客户端post请求,服务器收到{}数据解决方法

当我们发起登录请求时&#xff0c;后台接收到的为{}数据 原因&#xff1a;传送过去的对象格式不对 解决方案&#xff1a; 引入qs npm install qs 在data中格式化数据 const res await axios({url:http://127.0.0.1:3000/post,method:post,data:Qs.stringify({username:te…

华为智选SF5,AITO问界的车怎么样

#华为智选 #赛力斯SF5 #aito问界m5 #aito问界m7 #华为汽车 华为的车&#xff0c;后杠焊两点&#xff0c;拉车的时候&#xff0c;拖车钩断了&#xff0c;后杠拉出来了&#xff0c;这质量可以吗&#xff1f;是否应该全部召回&#xff1f;M5&#xff0c;M7是不是也这样&#xff1f…

MIT6.5830 Lab0-Go tutorial实验记录(二)

MIT6.5830 Lab0-Go tutorial实验记录&#xff08;二&#xff09; – WhiteNights Site 标签&#xff1a;Golang, 数据库 在将数据库的数据转换为图表前&#xff0c;我们需要先测试是否能正常访问数据库文件。 写者注 为什么要怎么做&#xff1f;因为这块 非常容易出问题。在h…

https证书配置(nginx)

HTTPS 是什么 HTTPS 是一种应用层协议&#xff0c;是一种透过计算机网络进行安全通信的传输协议&#xff0c;HTTPS 经由 HTTP 进行通信&#xff0c;但是在 HTTP 的基础上引入了一个加密层&#xff0c;使用 SSL/TLS 来加密数据包&#xff0c;HTTPS 开发的主要目的&#xff0c;是…

作用域和作用域链

概述 本文将讲解作用域的形成和应用&#xff0c;并且在这基础上简单讲解for循环中的let创建的块级作用域原理。 一&#xff0c;作用域 1.1&#xff0c;作用域的概念 作用域是指在程序中定义变量的区域&#xff0c;该位置决定了变量的生命周期。 function testFn(){var a1 …

Zookeeper 和 Kafka 工作原理及如何搭建 Zookeeper集群 + Kafka集群

目录 1 Zookeeper 1.1 Zookeeper 定义 1.2 Zookeeper 工作机制 1.3 Zookeeper 特点 1.4 Zookeeper 数据结构 1.5 Zookeeper 应用场景 1.6 Zookeeper 选举机制 2 部署 Zookeeper 集群 2.1 安装前准备 2.2 安装 Zookeeper 3 Kafka 3.1 为什么需要消息队列&#xff08;…

SSH连接华为交换机慢

ssh连接交换机慢是因为交换计算密钥算法阶段默认使用安全性更高的秘钥&#xff0c;由于性能问题导致连接比较慢&#xff0c;如一台华为S5735S-L24T4S-QA2的交换机默认使用如下秘钥&#xff0c;安全行由高到低。 ssh server key-exchange dh_group16_sha512 dh_group15_sha512 …

Redux详解(二)

1. 认识Redux Toolkit Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。 通过传统的redux编写逻辑方式&#xff0c;会造成文件分离过多&#xff0c;逻辑抽离过于繁琐&#xff08;具体可看上篇文章 Redux详解一&#xff09;&#xff0c;React官方为解决这一问题&#xff0c;推…

HCIP静态路由综合实验

题目&#xff1a; 步骤&#xff1a; 第一步&#xff1a;搭建上图所示拓扑; 第二步&#xff1a;为路由器接口配置IP地址&#xff1b; R1&#xff1a; [R1]display current-configuration intinterface GigabitEthernet0/0/0ip address 192.168.1.1 255.255.255.252 interfa…

【试题026】赋值运算符小例题

1.题目&#xff1a;设int x100;表达式x%2(x1)%2的值是&#xff1f; 2.代码解析&#xff1a; #include <stdio.h> int main() {//设int x100;表达式x%2(x1)%2的值是&#xff1f;int x 100,y,c;printf("y%d\n", (y(x 1) % 2));c x % 2;printf("c1%d\n&…

全球二氧化碳排放数据1deg产品(ODIAC)数据

简介 全球二氧化碳排放数据1deg产品(ODIAC)是一个空间分辨率为1deg*1deg的全球化石燃料燃烧产生的二氧化碳空间分布产品。它率先将基于空间的夜间灯光数据与单个发电厂的排放/位置相结合来估计化石燃料二氧化碳的排放。该产品被国际研究界广泛用于各种研究应用&#xff08;例如…

前端(十九)——vue/react脚手架的搭建方式

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;前端&#xff08;十九&#xff09;——vue/react脚手架的搭建方式 文章目录 前言Vue脚手架搭建方法Vue CLI脚手架Vite脚手架其他方式 React脚手架搭建方法Create React App脚手架Vite脚手架其他方式…