PHP-FFMpeg 操作音视频
安装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',
]);
// 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:指定要裁剪的点,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');
// 也可以通过 get 获取指定信息的内容,第二个参数为默认值,如果获取不到该信息的话返回默认值
$duration = $ffprobe
->format('audio.mp3')
->get('duration', 100);
var_dump($videoInfo);
var_dump($duration);

PHP-FFMpeg 操作音视频的更多相关文章
- C#进程调用FFmpeg操作音视频
项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...
- javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?
通过"javaCV入门指南:序章 "大家知道了处理音视频流媒体的前置基本知识,基本知识包含了像素格式.编解码格式.封装格式.网络协议以及一些音视频专业名词,专业名词不会赘述,自行搜 ...
- FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频
一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...
- FFmpeg处理音视频流程学习笔记
原文作者:一叶知秋0830 链接:https://www.jianshu.com/p/1b715966af50 FFmpeg处理音视频完整流程包括5个阶段(输入文件—>编码数据包—>解码后 ...
- FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据
如何使用FFmpeg抽取音视频的视频数据,代码如下: // FFmpegTest.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include ...
- FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据
如何使用FFmpeg抽取音视频的音频数据,代码如下: void adts_header(char *szAdtsHeader, int dataLen); // 使用FFmpeg从视频中抽取音频 vo ...
- 如何使用ffmpeg进行音视频裁剪命令和音视频合成命令
音视频剪裁命令 ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.ts -i : 指定视频 -ss : 开始时间 -t : 指定裁剪的秒数 音视频合并的命令 ffm ...
- ffmpeg实战-音视频基础概念
转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...
- FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息
在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...
- FFmpeg采集音视频数据命令
文章转自:https://www.jianshu.com/p/4709ccbda3f9 1.ffmpeg 把文件当做直播推送至服务器 (RTMP + FLV) ffmpeg - re -i demo. ...
随机推荐
- 暴力密码破解工具——Hydra
Hydra简介 hydra中文意思为九头蛇,它是黑客组织thc开发一款开源暴力密码破解工具,可以在线破解多种密码,支持Windows Linux MAC系统安装使用(Kali Linux自带), 支持 ...
- 如何使用Java在Excel中实现一个数据透视表
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前一段时间淘宝出了一个"淘宝人生"的模块, ...
- langchain:Prompt在手,天下我有
目录 简介 好的prompt 什么是prompt template 在langchain中创建prompt template Chat特有的prompt template 总结 简介 prompts是 ...
- 大语言模型中一个调皮的EOS token
背景 最近需要做一个微调的培训,所以不可避免地需要上手一下相关的微调,而受限于机器资源,暂时没法做全参数微调,所以就尝试了目前比较火的两种高效微调方式,分别是PTuning和LoRA.模型选择得自然是 ...
- k8s+containerd安装
准备环境 准备两台服务器节点,如果需要安装虚拟机,可以参考<wmware和centos安装过程> 机器名 IP 角色 CPU 内存 centos01 192.168.109.130 mas ...
- 使用DBeaver连接数据库
下载网站:官网下载 参考链接:使用 DBeaver 连接 OceanBase
- VIM编辑器和Shell命令脚本
注意:在Linux中一切皆文件,而配置一个服务就是在修改其配置文件的参数. VIM编辑器有三种模式: 命令模式:控制光标移动,可对文本进行复制.粘贴.删除和查找等工作 在该模式下不能对文件直接编辑,可 ...
- TypeScript: 類型 'HTMLElement | null' 不可指派給類型 'HTMLElement'。 類型 'null' 不可指派給類型 'HTMLElement'
报错截图 解决方案 在结尾添加叹号 // 获取页面中food的元素并将其赋值给element this.element = document.getElementById('food')!;
- 【转自知乎】NLP算法面试必备!史上最全!PTMs:NLP预训练模型的全面总结
NLP算法面试必备!史上最全!PTMs:NLP预训练模型的全面总结 预训练模型(Pre-trained Models,PTMs)的出现将NLP带入了一个全新时代.2020年3月18日,邱锡鹏老师发表了 ...
- 去中心化组件共享方案 —— Webpack Module Federation(模块联邦)
在大型应用中, 我们可能会对其进行拆分,分成容器.主应用和多个子应用,使拆分后的应用独立开发与部署,更加容易维护.但无论是微应用.公共模块应用,都需要放到容器中才能使用. 如果多个应用之间希望资源共享 ...