写点什么

PHP-FFMpeg 操作音视频

作者:极客飞兔
  • 2023-10-19
    江苏
  • 本文字数:4643 字

    阅读完需:约 15 分钟

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(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(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,则只需要填写 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(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: 比特率


<?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 = new FFMpeg\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(new FFMpeg\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), new FFMpeg\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(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: 设置音频比特率


<?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 = 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


<?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(new FFMpeg\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);
复制代码


详细信息


发布于: 刚刚阅读数: 6
用户头像

极客飞兔

关注

风起于青萍之末,浪成于微澜之间 2023-03-02 加入

华为云云享专家 思否2022年度先锋榜单 CSDN专家博主,领域之星 阿里天猫精灵首席测评官,专家博主

评论

发布
暂无评论
PHP-FFMpeg 操作音视频_php_极客飞兔_InfoQ写作社区