PHP调用FFmpeg实现视频切片
注:使用的视频为mp4,转换成.m3u8播放列表和.ts切片文件
1、安装FFmpeg
我这边是通过Nux Dextop仓库来安装FFmpeg。
(1) 安装EPEL仓库
(2)下载并安装Nux Dextop仓库的RPM包
(3)更新YUM缓存
(4) 安装FFmpeg
(5)验证安装
2、安装PHP
验证安装
3、php脚本
<?php // 设置输入视频文件、切片时长(秒)和输出目录 $videoFile = '/data/video/input.mp4'; // 输入视频文件路径 $segmentDuration = 10; // 切片时长,单位:秒 $outputDir = 'output'; // 输出目录 // 确保输出目录存在 if (!is_dir($outputDir)) { mkdir($outputDir, 0777, true); } // 构建并执行FFmpeg命令以生成.m3u8播放列表和.ts切片文件 // 使用'-strict -2'参数允许使用实验性编码器'aac' $cmd = "ffmpeg -i " . escapeshellarg($videoFile) . " -codec:v libx264 -codec:a aac -strict -2 -hls_time " . escapeshellarg($segmentDuration) . " -hls_list_size 0 -hls_flags delete_segments " . escapeshellarg($outputDir . "/output.m3u8"); // 或者,如果您有 'libfdk_aac' 可用,可以替换 '-codec:a aac -strict -2' 为 '-codec:a libfdk_aac' // $cmd = "ffmpeg -i " . escapeshellarg($videoFile) . // " -codec:v libx264 -codec:a libfdk_aac -hls_time " . escapeshellarg($segmentDuration) . // " -hls_list_size 0 -hls_flags delete_segments " . escapeshellarg($outputDir . "/output.m3u8"); shell_exec($cmd); // 设置目标目录 $targetDir = 'target_dir'; if (!is_dir($targetDir)) { mkdir($targetDir, 0777, true); } // 检查.m3u8文件是否存在 $playlistFile = $outputDir . '/output.m3u8'; if(file_exists($playlistFile)){ // 复制.m3u8播放列表文件 copy($playlistFile, $targetDir . '/output.m3u8'); // 获取所有.ts切片文件,并将其复制到目标目录 $tsFiles = glob($outputDir . '/*.ts'); foreach ($tsFiles as $tsFile) { copy($tsFile, $targetDir . '/' . basename($tsFile)); } echo "视频切片及文件复制操作完成。\n"; } else { echo "FFmpeg处理失败,未找到输出文件。\n"; } ?>
4、创建目录(/data)
视频目录:/data/video
php脚本目录:/data 脚本名称:slice_video.php
5、执行脚本
6、生成的切片文件夹
7、安装Nginx
(1)安装
(2)启动 Nginx
(3) 检查 Nginx 状态
(4)关闭防火墙
(5)nginx.conf文件配置
文件位置:/etc/nginx/nginx.conf
sudo nginx -t # 测试配置文件语法是否正确 sudo systemctl reload nginx # 重新加载 Nginx使配置生效 user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; server { listen 80; server_name 192.168.126.129; location /hls/ { alias /data/target_dir/; # 替换为你的实际目录路径 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } add_header 'Cache-Control' 'no-cache'; add_header 'Access-Control-Allow-Origin' '*'; } } }
您可能感兴趣的文章
- 07-25PHP调用FFmpeg实现视频切片
- 07-25PHP WindSearch实现站内搜索功能
- 07-25PHP建立MySQL与MySQLi持久化连接(长连接)区别
- 02-10windows服务器iis+php获得错误信息的配置方法
- 02-09通过PHP接入DeepSeek API的两种方法
- 02-07PHP调用DeepSeek API的完整指南
- 02-06PHP foreach引用变量导致的问题及其解决方案
- 02-02PHP使用puppeteer抓取JS渲染后的页面内容
- 01-17PHP SM4加密的实现
- 01-17PHP实现用户认证与权限管理的实现


阅读排行
推荐教程
- 07-25PHP建立MySQL与MySQLi持久化连接(长连接)区别
- 07-25PHP WindSearch实现站内搜索功能
- 07-25PHP调用FFmpeg实现视频切片
- 11-23PHP 7安装使用体验之性能大提升,兼容性强,扩展支
- 11-22PHP自定义函数判断是否为Get、Post及Ajax提交的方法
- 11-23隐藏PHP版本与PHP基本安全设置
- 11-23PHP+MYSQL 读写分离简单实战
- 11-23php中 == 和 === 的区别和应用说明
- 11-22详解PHP防止直接访问.php 文件的实现方法
- 11-22PHP编程求最大公约数与最小公倍数的方法示例