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.mzph.cn/news/112424.shtml

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

相关文章

利用ArcGIS获取每一个冰川的中心位置经纬度坐标:要素转点和要素折点转点的区别

问题概述&#xff1a;下图是天山地区的冰川的分布&#xff0c;我们可以看到每一条冰川是一个面要素&#xff0c;要求得到每一个冰川&#xff08;面要素&#xff09;的中心经纬度坐标。 1.采用要素转点功能 选择工具箱的【数据管理工具】-【要素】-【要素转点】。完成之后再采用…

计算机基础知识36

数据库数据的演变史 ATM&#xff1a;1. 把数据都存在了文件中&#xff0c;文件名不规范 kevin|123 kevin123 kevin*123 2. 存储数据的文件越来越多&#xff0c;放在db文件夹&#xff0c;占用空间&#xff0c;查询存储不方便&#xff0c;速度慢 # 数据库软件能解…

lnmp架构部署Discuz论坛并配置重定向转发

lnmp架构部署Discuz论坛并配置重定向转发 文章目录 lnmp架构部署Discuz论坛并配置重定向转发环境说明部署Discuz论坛系统下载Discuz论坛系统代码包&#xff0c;官网地址如下&#xff1a;部署Discuz论坛系统步骤&#xff1a;解压安装Discuz源码包配置虚拟主机进入Discuz安装界面…

Janus: 逆向思维,以数据为中心的MoE训练范式

文章链接&#xff1a;Janus: A Unified Distributed Training Framework for Sparse Mixture-of-Experts Models 发表会议: ACM SIGCOMM 2023 (计算机网络顶会) 目录 1.背景介绍all-to-allData-centric Paradigm 2.内容摘要关键技术Janus细粒度任务调度拓扑感知优先级策略预取…

Android推送问题排查

针对MobPush智能推送服务在使用过程中可能出现的问题&#xff0c;本文为各位开发者们带来了针对MobPush安卓端推送问题的解决办法。 TCP在线推送排查 排查TCP在线收不到推送时&#xff0c;我们先通过客户端的RegistrationId接口获取设备的唯一标识 示例&#xff1a; MobPush…

代码随想录算法训练营第五十六天 | 1143.最长公共子序列、1035.不相交的线 、53. 最大子序和 动态规划

1143.最长公共子序列 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列_哔哩哔哩_bilibili 代码随想录 &#xff08;1&#xff09;代码 1035.不相交的线 视频讲解&#xff1a;动态规划之子序列问题&#xff0c;换汤不换药 | Leet…

高数二阶导数例子

例子&#xff1a; 当 x 0 x 0 x0时 f(x) 1&#xff0c;当 x ≠ 0 x \ne 0 x0时&#xff0c; f ( x ) sin ⁡ x x f(x) \frac{\sin x}{x} f(x)xsinx​, 求f’(x)。 解&#xff1a; 二阶导数是导数的导数&#xff0c;按照定义为&#xff1a; f ′ ′ ( x ) lim ⁡ x →…

基于Java的垃圾分类管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

安卓逆向之抽象函数public abstract的hook定位处理

一、抽象类调用过程 1、定义接口 public abstract class AbsNetHelper{public abstract int X(int x,int y); }2、其他类调用 public class f extends AbsNetHelper {public abstract int X(int x,int y){ return xy;} }二、如何HOOK 想hook调用AbsNetHelper类的X抽…

linux uboot kenerl filesystem关系

每次烧写都是uboot&#xff0c;image&#xff0c;roots&#xff0c;为什么不整一套&#xff0c;为什么分开 什么是uboot 什么是内核&#xff0c;三者为什么分开 如果你上网去搜一下&#xff0c;你会发现这样的答案 另注&#xff1a;本文含有大量的错误和意测成份&#xff0c…

Linux系统编程04

进程的概念 进程&#xff08;动态&#xff09;是一个正在运行的程序&#xff08;静态&#xff09; 多道程序设计缺点&#xff1a; &#xff08;1&#xff09;缺乏隔离&#xff0c;各个程序之间可以直接访问&#xff0c;使用对方的数据 &#xff08;2&#xff09;内存使用率低&a…

香港服务器在国内访问太慢怎么能提高?

​  一直以来&#xff0c;全球化业务需求的增长是跟随着蓬勃向上的互联网而发展的。有了网络&#xff0c;海外贸易就在鼠标的轻点中完成。而IDC市场中的香港服务器也因为免备案政策的特性&#xff0c;开始逐渐成为企业想要跨越地域壁垒而考虑的对象。但在使用过程中&#xff…

新手如何找到Docker容器(redis)中的持久化文件?

具体步骤 要查看Docker容器的dump.rdb和appendonly.aof文件&#xff08;如果启用了AOF持久化&#xff09;的位置&#xff0c;我们需要知道容器中Redis配置文件的内容或者容器的数据卷的挂载位置。 这里是一般步骤&#xff1a; 查找容器的数据卷挂载位置 使用docker inspect命令…

内存爆炸、CPU100%问题定位

目录 一、内存爆炸相关1、关于-Xms(最小堆内存)和-Xmx(最大堆内存)2、JVM初始化时申请实际物理内存3、OutOfMemory问题排查(1) 堆内存溢出排查(2) 堆外内存溢出排查 二、CPU 100及死锁问题定位1、CPU 100问题排查(1) 找到程序对应进程号(2) 查找进程对应的线程编号(3)查看线程堆…

零基础入门网络渗透到底要怎么学?_网络渗透技术自学

前言&#xff1a; 很多朋友问我&#xff0c;想搞网络安全&#xff0c;编程重要吗&#xff0c;选什么语言呢&#xff1f; 国内其实正经开设网络安全专业的学校很少&#xff0c;大部分同学是来自计算机科学、网络工程、软件工程专业的&#xff0c;甚至很多非计算机专业自学的。…

驱动day2:LED灯实现三盏灯的亮灭

head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_PE_MODER 0x50006000 #define PHY_PF_MODER 0x50007000 #define PHY_PE_ODR 0x50006014 #define PHY_PF_ODR 0x50007014 #define PHY_RCC 0x50000A28#endif 应用程序 #include <stdio.h> #include <sys/…

Linux性能优化--补充

14.1. 性能工具的位置 本书描述的性能工具来源于Internet上许多不同的位置。幸运的是&#xff0c;大多数主要发行版都把它们放在一起&#xff0c;包含在了其发行版的当前版本中。表A-1描述了全部工具&#xff0c;提供了指向其原始源位置的地址&#xff0c;并注明它们是否包含在…

YOLOv7改进实战 | 更换轻量化主干网络Backbone(一)之Ghostnet

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

官方认证:研发效能(DevOps)工程师职业技术认证

培养端到端的研发效能人才 为贯彻落实《关于深化人才发展体制机制改革的意见》&#xff0c;推动实施人才强国战略&#xff0c;促进专业技术人员提升职业素养、补充新知识新技能&#xff0c;实现人力资源深度开发&#xff0c;推动经济社会全面发展&#xff0c;根据《中华人民共…

Apache Doris (四十五): Doris数据更新与删除 - Sequence 列

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 基本原理