PHP-FFmpeg切片视频
一、环境准备
1.安装FFmpeg本体
liunx:
sudo apt update && sudo apt install ffmpeg # Debian/Ubuntu
#添加 EPEL 和 RPM Fusion 源
sudo yum install epel-release
sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
#安装 FFmpeg
sudo yum install ffmpeg ffmpeg-devel # CentOS
Windows:
从 FFmpeg 官网 下载并配置环境变量。
2.通过 Composer 安装 PHP-FFmpeg
composer require php-ffmpeg/php-ffmpeg
二、PHP 切片代码
<?php
require 'vendor/autoload.php';
use FFMpeg\FFMpeg;
use FFMpeg\Format\Video\X264;
// 1. 定义输入输出路径
$inputFile = __DIR__ . '/input.mp4'; // 输入视频路径
$outputDir = __DIR__ . '/hls_output/'; // 输出目录
$outputM3U8 = $outputDir . 'video.m3u8'; // M3U8 文件路径
// 2. 创建输出目录(如果不存在)
if (!is_dir($outputDir)) {
mkdir($outputDir, 0755, true);
}
// 3. 初始化 FFmpeg(重点检查路径!)
try {
$ffmpeg = FFMpeg::create([
'ffmpeg.binaries' => '/usr/bin/ffmpeg', // Linux 路径
// 'ffmpeg.binaries' => 'C:\ffmpeg\bin\ffmpeg.exe', // Windows 路径
'ffprobe.binaries' => '/usr/bin/ffprobe',
'timeout' => 3600, // 超时时间(秒)
]);
} catch (Exception $e) {
die("FFmpeg 初始化失败: " . $e->getMessage());
}
// 4. 打开视频文件
try {
$video = $ffmpeg->open($inputFile);
} catch (Exception $e) {
die("无法打开视频文件: " . $e->getMessage());
}
// 5. 配置 HLS 参数
$format = new X264();
$format->setAdditionalParameters([
'-hls_time', '10',//每个分片约10s
'-hls_list_size', '0',
'-c:v', 'copy',//复制流,速度更快
'-c:a', 'copy',
'-hls_segment_filename', $outputDir.'test%03d.ts'//分片文件名
]);
// 6. 执行转换
try {
$video->save($format, $outputM3U8);
echo "切片成功!M3U8 文件路径: " . realpath($outputM3U8);
} catch (Exception $e) {
die("切片失败: " . $e->getMessage());
}
也可以使用命令行
ffmpeg -i /path/local/input.mp4
-codec:v libx264 -codec:a aac
-hls_time 10
-hls_list_size 0
-hls_flags delete_segments
-hls_segment_filename /path/local/video_%03d.ts
/path/local/playlist.m3u8
