PHP-FFMpeg 操作音视频-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

✨ 目录

安装PHP-FFMpeg

composer require php-ffmpeg/php-ffmpeg

视频中提取一张图片

  • 这里的 video.mp4 准备的是一段宫崎骏的视频片段
  • FFMpeg\FFMpeg::create 中需要指定系统软件中 ffmpegffprobe 的安装位置
  • 通过 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则只需要填写 xy 坐标即可
  • 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 指定要裁剪的点xy 坐标和 是否动态裁剪
  • 这里 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);

详细信息

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php

“PHP-FFMpeg 操作音视频-CSDN博客” 的相关文章