注:使用的视频为mp4,转换成.m3u8播放列表和.ts切片文件
1、安装FFmpeg
我这边是通过Nux Dextop仓库来安装FFmpeg。
(1) 安装EPEL仓库- sudo yum install -y epel-release
复制代码 (2)下载并安装Nux Dextop仓库的RPM包- sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
复制代码 (3)更新YUM缓存(4) 安装FFmpeg- sudo yum install -y ffmpeg ffmpeg-devel
复制代码 (5)验证安装
2、安装PHP
- sudo yum install php php-cli
复制代码 验证安装
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)安装- sudo yum install nginx -y
复制代码 (2)启动 Nginx- sudo systemctl start nginx
- sudo systemctl enable nginx
复制代码 (3) 检查 Nginx 状态- sudo systemctl status nginx
复制代码 (4)关闭防火墙- sudo systemctl stop firewalld
- sudo systemctl disable firewalld
- sudo systemctl status firewalld
复制代码 (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' '*';
- }
- }
-
- }
复制代码 8、编写html播放器- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>HLS Stream Player</title>
- <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
- </head>
- <body>
-
- <h1>视频播放器</h1>
- <video id="video" controls autoplay></video>
-
- <script>
- if(Hls.isSupported()) {
- var video = document.getElementById('video');
- var hls = new Hls();
- // 这里替换为你的.m3u8文件的实际URL
- var url = 'http://192.168.126.129/hls/output.m3u8'; // 替换为你的实际URL
-
- hls.loadSource(url);
- hls.attachMedia(video);
- hls.on(Hls.Events.MANIFEST_PARSED, function() {
- video.play();
- });
- } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
- // 如果浏览器直接支持HLS,则可以直接设置src
- video.src = 'http://192.168.126.129/hls/output.m3u8'; // 替换为你的实际URL
- video.addEventListener('loadedmetadata', function() {
- video.play();
- });
- }
- </script>
-
- </body>
- </html>
复制代码 到此这篇关于PHP调用FFmpeg实现视频切片的文章就介绍到这了,更多相关PHP FFmpeg视频切片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://www.jb51.net/program/336350pok.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |