如何通过PHP+FFmpeg将远程裁剪视频直接保存至用户本地?
嘿,这个需求其实不难实现,核心就是把FFmpeg裁剪好的视频从服务器直接推给用户下载,同时加上权限确认的环节,我给你拆解成具体步骤和代码示例:
实现步骤与代码示例
1. 先做用户权限确认的前端页面
先搞个简单的表单让用户确认是否要下载,比如:
<form method="POST" action="download_cropped_video.php"> <p>确认要下载裁剪后的视频吗?</p> <button type="submit" name="confirm_download" value="1">确认下载</button> </form>
2. PHP处理逻辑(download_cropped_video.php)
这部分是核心,要完成FFmpeg裁剪、文件输出和清理:
<?php // 检查用户是否确认下载 if (!isset($_POST['confirm_download'])) { header("Location: index.php"); // 跳转回确认页面 exit; } // 1. 配置FFmpeg参数和临时文件 $remote_video_url = "example.com/test.mp4"; $start_time = "00:00:30"; $duration = "00:00:09"; // 创建临时文件,避免文件名冲突 $temp_file = tempnam(sys_get_temp_dir(), "cropped_video_"); $output_file = $temp_file . ".mp4"; // 加上mp4后缀 // 2. 构建FFmpeg命令(用escapeshellarg避免命令注入) $ffmpeg_cmd = sprintf( 'ffmpeg -ss %s -i "%s" -t %s -acodec copy -vcodec copy -async 1 -y "%s"', escapeshellarg($start_time), escapeshellarg($remote_video_url), escapeshellarg($duration), escapeshellarg($output_file) ); // 3. 执行FFmpeg命令并检查结果 exec($ffmpeg_cmd, $output_log, $return_var); if ($return_var !== 0 || !file_exists($output_file) || filesize($output_file) === 0) { die("裁剪视频失败,请检查FFmpeg配置或远程视频链接"); } // 4. 发送下载响应给用户 header('Content-Type: video/mp4'); header('Content-Disposition: attachment; filename="cropped_video.mp4"'); header('Content-Length: ' . filesize($output_file)); // 输出文件内容到浏览器 readfile($output_file); // 5. 清理临时文件,避免服务器空间占用 unlink($output_file); unlink($temp_file); // 删除tempnam生成的空文件 exit; ?>
3. 关键注意事项
- FFmpeg环境:确保服务器已安装FFmpeg,且PHP的
exec函数未被禁用(检查php.ini的disable_functions列表,移除exec)。 - 权限问题:临时目录(
sys_get_temp_dir()返回的路径)要给PHP进程写权限,不然生成不了文件。 - 超时处理:如果视频较大、裁剪耗时久,要调整PHP的
max_execution_time(php.ini里设置)和Web服务器(Nginx/Apache)的超时时间,避免脚本中途中断。 - 远程视频访问:如果远程视频是HTTPS链接,服务器需要支持SSL,FFmpeg才能正常拉取资源;如果目标网站有防盗链,可能需要在FFmpeg命令里加
-headers参数模拟合法请求。
内容的提问来源于stack exchange,提问作者hmaxx
相关产品推荐
相关产品推荐

