[i=s] 本帖最后由 涧仁余 于 2025-3-26 09:15 编辑 [/i]<br />
<br />
以下是针对飞牛NAS(Linux + 宝塔面板)搭建自动视频切片工具的完整方案,包含技术细节和实现步骤:
警告:该方案为理论设想方案,实际部署对硬件要求较高(需持续占用CPU/内存资源进行视频编码),且以下代码未经实际运行验证,存在兼容性和稳定性风险。强烈建议在测试环境中验证后再投入正式使用,避免因资源耗尽导致系统服务异常!!!
一、M3U8切片在局域网家庭影院的优缺点
优点:
- 多终端兼容支持电视、手机、电脑播放,适配家庭多设备场景。
- 拖动响应快分片加载实现毫秒级进度条跳转,适合长视频点播。
- 自适应码率简化生成2-3个码率版本(如720p/1080p),内网带宽充足时优先高画质。
- 错误恢复强
局域网偶发丢包时自动重传分片,播放不中断。
缺点:
- 存储占用翻倍需保留多码率版本,建议定期清理冗余文件。
- 初次编码耗时
大视频切片需较长时间,建议后台执行。
二、详细实现步骤
1. 安装FFmpeg
通过宝塔SSH终端执行:
# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg -y
# CentOS
sudo yum install epel-release -y
sudo yum install ffmpeg ffmpeg-devel -y
2. Python监控切片脚本
脚本功能:
- 监控指定文件夹(如
/www/wwwroot/videos_input
)
- 发现新视频时自动切片到
/www/wwwroot/videos_output
- 生成记录文件
slice_records.txt
脚本代码(auto_slice.py
):
import os
import time
import subprocess
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class VideoHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory and event.src_path.lower().endswith(('.mp4', '.mkv', '.avi')):
slice_video(event.src_path)
def slice_video(input_path):
output_dir = "/www/wwwroot/videos_output"
output_m3u8 = os.path.join(output_dir, os.path.basename(input_path).replace('.','_') + ".m3u8")
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 执行FFmpeg命令
cmd = [
'ffmpeg',
'-i', input_path,
'-c:v', 'h264',
'-c:a', 'aac',
'-f', 'hls',
'-hls_time', '10',
'-hls_list_size', '0',
'-hls_segment_filename', os.path.join(output_dir, 'segment_%03d.ts'),
output_m3u8
]
process = subprocess.Popen(cmd, stderr=subprocess.PIPE)
while True:
output = process.stderr.readline()
if output == b'' and process.poll() is not None:
break
if output:
print(output.decode().strip())
# 写入记录文件
record_path = "/www/wwwroot/slice_records.txt"
with open(record_path, 'a') as f:
f.write(f"{time.ctime()} | {input_path} | 切片完成 | 输出路径: {output_m3u8}\n")
if __name__ == "__main__":
event_handler = VideoHandler()
observer = Observer()
observer.schedule(event_handler, '/www/wwwroot/videos_input', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
3. 设置定时任务(宝塔面板)
- 登录宝塔面板 → 计划任务
- 添加Shell脚本任务:
# 每5分钟检查一次
*/5 * * * * /usr/bin/python3 /www/wwwroot/auto_slice.py >> /www/wwwroot/slice.log 2>&1
4. 自动删除原视频脚本(可选)
创建 clean_original.sh
:
#!/bin/bash
find /www/wwwroot/videos_input -name "*.mp4" -mtime +7 -exec rm {} \;
通过宝塔计划任务设置每天执行。
5. PHP管理网页(可选)
数据库设计(MySQL):
CREATE TABLE slice_records (
id INT AUTO_INCREMENT PRIMARY KEY,
original_path VARCHAR(255),
output_path VARCHAR(255),
slice_time DATETIME,
is_deleted TINYINT(1) DEFAULT 0
);
PHP页面(manage.php
):
<?php
// 连接数据库
$conn = new mysqli("localhost", "root", "密码", "数据库名");
// 显示记录
$sql = "SELECT * FROM slice_records ORDER BY slice_time DESC";
$result = $conn->query($sql);
echo "<h2>视频切片管理</h2>";
echo "<table border='1'>
<tr>
<th>原始文件</th>
<th>输出路径</th>
<th>切片时间</th>
<th>操作</th>
</tr>";
while($row = $result->fetch_assoc()) {
echo "<tr>
<td>".$row['original_path']."</td>
<td>".$row['output_path']."</td>
<td>".$row['slice_time']."</td>
<td>
<a href='delete.php?id=".$row['id']."'>删除记录</a> |
<a href='delete_original.php?path=".$row['original_path']."'>删除原文件</a>
</td>
</tr>";
}
echo "</table>";
?>
部署步骤:
- 宝塔面板创建网站,绑定域名或IP
- 上传
manage.php
到网站目录
- 配置数据库权限
- 通过浏览器访问
http://NAS_IP/manage.php
三、安全建议
- 设置宝塔面板强密码
- 通过Nginx配置限制访问IP:
location /manage.php {
allow 192.168.1.0/24;
deny all;
}
- 定期备份数据库
四、测试流程
- 将测试视频放入
/www/wwwroot/videos_input
- 查看
slice.log
确认切片进程
- 访问管理页面验证记录显示
- 测试自动删除功能
此方案已考虑家庭局域网环境特点,通过自动化脚本+网页管理实现零手动操作,建议首次部署时先用小视频测试流程。