PHP-FFMpeg 操作音视频

简介: 快速掌握音视频操作神器

🎈 安装PHP-FFMpeg

composer require php-ffmpeg/php-ffmpeg


🎈 视频中提取一张图片

  • 这里的 video.mp4 准备的是一段宫崎骏的视频片段
  • FFMpeg\FFMpeg::create 中需要指定系统软件中 ffmpegffprobe 的安装位置
  • 通过 FFMpeg\Coordinate\TimeCode::fromSeconds 可以指定提取第几秒的视频作为图片保存
<?phprequire'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');


1.jpeg

🎈 视频中提取多张图片

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 是否强制使用最近的纵横比标准
<?phprequire'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(newFFMpeg\Coordinate\Dimension(160,90), FFMpeg\Filters\Video\ResizeFilter::RESIZEMODE_FIT, true);
$video->save(newFFMpeg\Format\Video\X264(), 'video_new.mp4');


🎈 视频添加水印

  • 通过 watermark 可以设置水印的相关信息,第一个参数是设置水印的地址,第二个参数里面可以设置水印位置参数
  • position: 可以选择 relative 相对定位,或者 absolute 绝对定位,如果选择 absolute,则只需要填写 xy 坐标即可
  • top / bottom / left / right: 四个方位上下左右距离边缘的位置
<?phprequire'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(newFFMpeg\Format\Video\X264(), 'video_watermark_new.mp4');


2.png


🎈 生成音频波形

  • 可以看到,想要生成音频波形,必须使用的是音频文件,如果是视频文件,需要先将其中的音频提取出来
  • 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=newFFMpeg\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' );


3.png


🎈 音频转换

  • Flac; 为无损压缩格式
  • setAudioChannels: 声道设置,1单声道,2双声道,3立体声
  • setAudioKiloBitrate: 比特率
<?phprequire'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=newFFMpeg\Format\Audio\Flac();
$format->on('progress', function ($audio, $format, $percentage) {
echo"$percentage% 进度";
});
$format->setAudioChannels(2)
->setAudioKiloBitrate(256);
$audio->save($format, 'audio.flac');


🎈 给音频添加元数据

  • 支持给音频添加标题、艺术家、专辑、艺术家、作曲家、曲目、年份、描述、艺术品等
<?phprequire'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');


4.png


🎈 拼接多个音视频

  • 如果想把多个音视频拼成一个音视频的话,可以使用 concat 命令
  • concat: 参数中设置想拼接的各个短视频
  • saveFromSameCodecs: 设置拼接后的视频名称,第二个参数设置为 true 则允许复制参数,可以加速文件的生成
<?phprequire'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: 有两个参数,第一个是从第几秒开始截取,第二个是截取多少秒,如果不填,则截取到最后
<?phprequire'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(newFFMpeg\Format\Video\X264(), 'video_clip.mp4');


🎈 提取 gif 动图

  • 使用 gif 命令可以提取视频中的动图
  • fromSeconds 可以设置从第几秒开始提取,Dimension 可以设置大小和持续的时间
<?phprequire'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), newFFMpeg\Coordinate\Dimension(640, 480), 3)
->save('video.gif');


5.gif


🎈 裁剪视频

  • 通过 crop 可以裁剪视频
  • Dimension: 设置裁剪后的视频尺寸
  • Point: 指定要裁剪的点,xy 坐标和 是否动态裁剪
  • 这里 x 的值是 t*100 是从画面左边移动到右边这样裁剪,值越大,移动速度越快
<?phprequire'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(newFFMpeg\Coordinate\Point("t*100", 0, true), newFFMpeg\Coordinate\Dimension(200, 600));
$video->save(newFFMpeg\Format\Video\X264(), 'video_crop.mp4');


🎈 转换视频格式

  • setKiloBitrate: 设置视频比特率
  • setAudioChannels: 声道设置,1单声道,2双声道,3立体声
  • setAudioKiloBitrate: 设置音频比特率
<?phprequire'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=newFFMpeg\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
<?phprequire'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(newFFMpeg\Format\Video\X264(), 'video_rate.mp4');


6.png


🎈 获取音视频信息

  • 可以通过 format 获取音视频的所有信息
  • 可以通过 get 获取指定信息的值
<?phprequire'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);

7.png

相关文章
|
6月前
|
编解码
项目实战——Qt实现FFmpeg音视频转码器(二)
项目实战——Qt实现FFmpeg音视频转码器(二)
123 0
|
6月前
|
编解码 编译器
项目实战——Qt实现FFmpeg音视频转码器(一)
项目实战——Qt实现FFmpeg音视频转码器(一)
171 0
|
3月前
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
80 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
2月前
|
Android开发 计算机视觉 C++
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
音视频编程对许多程序员来说是一片充满挑战的领域,但借助如OpenCV、LearnOpenGL、FFmpeg、OBS Studio及VLC media player等强大的开源工具,可以降低入门门槛。这些框架不仅覆盖了计算机视觉、图形渲染,还包括多媒体处理与直播技术,通过多种编程语言如Python、C++的应用,使得音视频开发更为便捷。例如,OpenCV支持跨平台的视觉应用开发,FFmpeg则擅长多媒体文件的处理与转换,而VLC media player则是验证音视频文件质量的有效工具。
93 0
FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架
|
2月前
用ffmpeg提取合并音视频
用ffmpeg提取合并音视频
|
4月前
|
达摩院 语音技术 异构计算
语音识别-免费开源的语音转文本软件Whisper的本地搭建详细教程,python版本是3.805,ffmpeg是专门处理音视频的,ffmpeg的下载链接,现在要求安装python和ffmpeg
语音识别-免费开源的语音转文本软件Whisper的本地搭建详细教程,python版本是3.805,ffmpeg是专门处理音视频的,ffmpeg的下载链接,现在要求安装python和ffmpeg
|
5月前
|
存储 编解码 Linux
rodert教你学FFmpeg实战这一篇就够了 - 音视频处理入门篇
rodert教你学FFmpeg实战这一篇就够了 - 音视频处理入门篇
63 1
|
4月前
|
C#
C#进程调用FFmpeg操作音视频
因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并、音频合并、音频与视频合并成视频这几个简单的音视频操作。
|
6月前
|
存储 缓存 调度
FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
《FFmpeg开发实战》第10章示例playsync.c在处理音频流和视频流交错的文件时能实现同步播放,但对于分开存储的格式,会出现先播放全部声音再快速播放视频的问题。为解决此问题,需改造程序,增加音频处理线程和队列,以及相关锁,先将音视频帧读入缓存,再按时间戳播放。改造包括声明新变量、初始化线程和锁、修改数据包处理方式等。代码修改后在playsync2.c中,编译运行成功,控制台显示日志,SDL窗口播放视频并同步音频,证明改造有效。
108 0
FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
|
6月前
|
编解码 安全 计算机视觉
FFMPEG常用命令 音视频合并
FFMPEG常用命令 音视频合并
138 2