安装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 操作音视频的更多相关文章

  1. C#进程调用FFmpeg操作音视频

    项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...

  2. javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

    通过"javaCV入门指南:序章 "大家知道了处理音视频流媒体的前置基本知识,基本知识包含了像素格式.编解码格式.封装格式.网络协议以及一些音视频专业名词,专业名词不会赘述,自行搜 ...

  3. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  4. FFmpeg处理音视频流程学习笔记

    原文作者:一叶知秋0830 链接:https://www.jianshu.com/p/1b715966af50 FFmpeg处理音视频完整流程包括5个阶段(输入文件—>编码数据包—>解码后 ...

  5. FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据

    如何使用FFmpeg抽取音视频的视频数据,代码如下: // FFmpegTest.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include ...

  6. FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据

    如何使用FFmpeg抽取音视频的音频数据,代码如下: void adts_header(char *szAdtsHeader, int dataLen); // 使用FFmpeg从视频中抽取音频 vo ...

  7. 如何使用ffmpeg进行音视频裁剪命令和音视频合成命令

    音视频剪裁命令 ffmpeg -i input.mp4 -ss 00:00:00 -t 10 out.ts -i : 指定视频 -ss : 开始时间 -t : 指定裁剪的秒数 音视频合并的命令 ffm ...

  8. ffmpeg实战-音视频基础概念

    转发自白狼栈:查看原文 关于音视频,相信大家都看过电影(视频),听过音乐(音频),至少应该都知道mp4是视频文件,mp3是音频文件. 对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过 ff ...

  9. FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息

    在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...

  10. FFmpeg采集音视频数据命令

    文章转自:https://www.jianshu.com/p/4709ccbda3f9 1.ffmpeg 把文件当做直播推送至服务器 (RTMP + FLV) ffmpeg - re -i demo. ...

随机推荐

  1. .NET周报 【7月第1期 2023-07-02】

    国内文章 C# 实现 Linux 视频聊天.远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS) https://www.cnblogs.com/shawshank/p/17420469.htm ...

  2. 如何制作 GitHub 个人主页

    人们在网上首先发现你的地方是哪里?也许你的社交媒体是人们搜索你时首先发现的东西,亦也许是你为自己创建的投资组合网站.然而,如果你使用GitHub来分享你的代码并参与开源项目,那么你的GitHub个人主 ...

  3. 从零实现的Chrome扩展

    从零实现的Chrome扩展 Chrome扩展是一种可以在Chrome浏览器中添加新功能和修改浏览器行为的软件程序,例如我们常用的TamperMonkey.Proxy SwitchyOmega.AdGu ...

  4. Blazor提取出Razor类库,没有css的class的智能提示

    最开始从stackoverflow上找到了答案,有两种办法,但都不太理想 后来自己找了新的办法,其实很简单,把要用的css复制到Razor类库的wwwroot文件夹中,默认是不会复制到引用Razor类 ...

  5. 将Dubbo注册到Nacos,与DubboAdmin的部署

    王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人 本文是<从 0 开始学 Dubbo>系列文章中应用篇的番外篇. 在这篇文章中我会和大家一起部署 ...

  6. Vue详解----一篇带你从头领悟到尾,享受飞升的感觉

    脚手架文件结构 """ ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ...

  7. Codeforces Round #888 (Div. 3) A-G

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  8. Mac装机必备软件2023

        码农一枚,Mac作为生产力工具已经有10多年了. 用Mac的原因除了系统清爽,逼格高之外,最主要还是因为作为一个资深全栈,要做Apple相关开发,必须用MacOS系统. 与Windows不同, ...

  9. 「Python实用秘技16」快速提取字体子集

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第16 ...

  10. 【hack】浅浅说说自己构造hack的一些逻辑~

    怎么说呢,相信很多考过竞赛的同学都会在平时的练习/考试中遭遇过100分但没有AC的情况,结果一看评测结果:subtask的数据点没过! 这时候就是遇到hack数据了,如果被这类数据卡住,说明你的代码可 ...