如何在PHP中使用FFmpeg进行音视频操作

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。

Github地址:https://github.com/BtbN/FFmpeg-Builds/releases

安装

以 Ubuntu 18.04.5 LTS 为例

安装

sudo apt-get install ffmpeg

查看ffmpeg 版本版本号

ffmpeg -version
ffmpeg version 3.4.11-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)

查看ffprobe 版本版本号

ffprobe -version
ffprobe version 3.4.11-0ubuntu0.1 Copyright (c) 2007-2022 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)

使用

安装webman框架

$ composer create-project workerman/webman webman2024

安装 PHP-FFMpeg

注意:此库需要PHP 8.0或更高版本,这里使用PHP 8.2.14

composer require php-ffmpeg/php-ffmpeg

指定PHP版本安装

$ /usr/local/php-8.2.14/bin/php /home/www/build/composer.phar require php-ffmpeg/php-ffmpeg
./composer.json has been updated
Installing dependencies from lock file (including require-dev)
Package operations: 8 installs, 1 update, 10 removals
  - Downloading symfony/process (v5.4.34)
  - Downloading symfony/var-exporter (v7.0.1)
  - Downloading symfony/service-contracts (v3.4.0)
  - Downloading psr/cache (3.0.0)
  - Downloading symfony/cache-contracts (v3.4.0)
  - Downloading symfony/cache (v6.4.2)
  - Downloading spatie/temporary-directory (2.2.0)
  - Downloading evenement/evenement (v3.0.2)
  - Downloading php-ffmpeg/php-ffmpeg (v1.1.0)

案例1:MP4视频中提取一张图片

/**
* @desc 案例1:MP4视频中提取一张图片
* @param Request $request
* @author Tinywan(ShaoBo Wan)
*/
public function ffmpeg(Request $request)
{
    /** 1. 初始化配置*/
    $ffmpeg = \FFMpeg\FFMpeg::create([
        'ffmpeg.binaries' => '/usr/bin/ffmpeg',
        'ffprobe.binaries' => '/usr/bin/ffprobe'
    ]);

    /** 2. 读取视频文件*/
    $video = $ffmpeg->open(runtime_path() . DIRECTORY_SEPARATOR . 'tinywan.mp4');

    /** 3. 提取一张图片,从视频的 20 秒处 */
    $res = $video->frame(\FFMpeg\Coordinate\TimeCode::fromSeconds(20))
        ->save(runtime_path() . DIRECTORY_SEPARATOR . 'tinywan.jpg');
    var_dump($res);
}

访问地址curl http://127.0.0.1:8888/index/ffmpeg 以上打印输出

    ...
      ["mapper":"FFMpeg\FFProbe":private]=>
      object(FFMpeg\FFProbe\Mapper)#45 (0) {
      }
    }
    ["filters":protected]=>
    object(FFMpeg\Filters\FiltersCollection)#58 (2) {
      ["sorted":"FFMpeg\Filters\FiltersCollection":private]=>
      NULL
      ["filters":"FFMpeg\Filters\FiltersCollection":private]=>
      array(0) {
      }
    }
    ["streams":"FFMpeg\Media\AbstractStreamableMedia":private]=>
    NULL
    ["fs":protected]=>
    NULL
    ["fsId":protected]=>
    NULL
  }
}

原视频截图:

如何在PHP中使用FFmpeg进行音视频操作

通过 FFmpeg 进行截图:

如何在PHP中使用FFmpeg进行音视频操作

案例2:给MP4视频添加水印

/**
 * @desc 案例2:给MP4视频添加水印
 * @param Request $request
 * @author Tinywan(ShaoBo Wan)
 */
public function watermark(Request $request)
{
    /** 1. 初始化配置*/
    $ffmpeg = \FFMpeg\FFMpeg::create([
        'ffmpeg.binaries' => '/usr/bin/ffmpeg',
        'ffprobe.binaries' => '/usr/bin/ffprobe'
    ]);

    /** 2. 读取视频文件*/
    $video = $ffmpeg->open(runtime_path() . DIRECTORY_SEPARATOR . 'tinywan.mp4');

    /** 3. 水印图片地址 */
    $watermarkpath = runtime_path() . DIRECTORY_SEPARATOR . 'tinywan-watermark.png';

    /** 4. 视频水印处理 */
    $video->filters()->watermark($watermarkpath, [
        'position' => 'relative',
        'bottom' => 120,
        'right' => 120,
    ]);

    /** 5. 解码和编码格式。x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库 */
    $format = new \FFMpeg\Format\Video\X264();

    /** 6. 保存添加水印视频文件 */
    $video->save($format, runtime_path() . DIRECTORY_SEPARATOR . 'tinywan-watermark.mp4');

访问地址curl http://127.0.0.1:8888/index/watermark 进行处理,这里处理时间和视频大小有关系

如何在PHP中使用FFmpeg进行音视频操作

可以看到 tinywan-watermark.mp4 视频被加上了开源技术小栈logo水印。

作者:Tinywan
来源:开源技术小栈
原文:https://mp.weixin.qq.com/s/maJxs7SYuk8jSrzwGTWONQ

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论