0


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');

提取图片

🎈 视频中提取多张图片

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(newFFMpeg\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');

插入水印

🎈 生成音频波形

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

波形图

🎈 音频转换

  • 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');

音频数据

🎈 拼接多个音视频

  • 如果想把多个音视频拼成一个音视频的话,可以使用 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');

动图提取

🎈 裁剪视频

  • 通过 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');

帧率

🎈 获取音视频信息

  • 可以通过 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);

详细信息

标签: php ffmpeg 音视频

本文转载自: https://blog.csdn.net/weixin_41635750/article/details/133924308
版权归原作者 极客飞兔 所有, 如有侵权,请联系我们删除。

“PHP-FFMpeg 操作音视频”的评论:

还没有评论