已解决
PHP-FFMpeg 操作音视频
来自网友在路上 152852提问 提问时间:2023-10-20 06:08:19阅读次数: 52
最佳答案 问答题库528位专家为你答疑解惑
✨ 目录
- 🎈 安装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
中需要指定系统软件中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);
查看全文
99%的人还看了
相似问题
- 视频云存储EasyCVR平台国标接入获取通道设备未回复是什么原因?该如何解决?
- 短视频账号矩阵系统saas管理私信回复管理系统
- 剪辑视频怎么把说话声音转成文字?
- 互动直播 之 视频帧原始数据管理
- 音视频项目—基于FFmpeg和SDL的音视频播放器解析(十六)
- 【腾讯云 HAI域探秘】高性能服务器引领AI革新浪潮:从AI绘画、知识问答到PyTorch图像分类、视频检测的全方位探索
- 计算机毕业设计 基于SpringBoot的企业内部网络管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
- 智能驾驶汽车虚拟仿真视频数据理解(一)
- HandBrake :MacOS专业视频转码工具
- opencv将32位深图片合成视频跳帧解决办法
猜你感兴趣
版权申明
本文"PHP-FFMpeg 操作音视频":http://eshow365.cn/6-20113-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!