收起左侧

【抗拥堵方案】家庭影院视频高效编码+智能预加载(硬件警告+实现代码)

2
回复
745
查看
[ 复制链接 ]

8

主题

9

回帖

0

牛值

fnOS系统内测组

2025-3-26 09:07:54 显示全部楼层 阅读模式

[i=s] 本帖最后由 涧仁余 于 2025-3-26 09:15 编辑 [/i]<br /> <br />

以下是针对飞牛NAS(Linux + 宝塔面板)搭建自动视频切片工具的完整方案,包含技术细节和实现步骤:

警告:该方案为理论设想方案,实际部署对硬件要求较高(需持续占用CPU/内存资源进行视频编码),且以下代码未经实际运行验证,存在兼容性和稳定性风险。强烈建议在测试环境中验证后再投入正式使用,避免因资源耗尽导致系统服务异常!!!

一、M3U8切片在局域网家庭影院的优缺点

优点:

  1. 多终端兼容支持电视、手机、电脑播放,适配家庭多设备场景。
  2. 拖动响应快分片加载实现毫秒级进度条跳转,适合长视频点播。
  3. 自适应码率简化生成2-3个码率版本(如720p/1080p),内网带宽充足时优先高画质。
  4. 错误恢复强 局域网偶发丢包时自动重传分片,播放不中断。

缺点:

  1. 存储占用翻倍需保留多码率版本,建议定期清理冗余文件。
  2. 初次编码耗时 大视频切片需较长时间,建议后台执行。

二、详细实现步骤

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. 设置定时任务(宝塔面板)

  1. 登录宝塔面板 → 计划任务
  2. 添加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>";
?>

部署步骤:

  1. 宝塔面板创建网站,绑定域名或IP
  2. 上传 manage.php到网站目录
  3. 配置数据库权限
  4. 通过浏览器访问 http://NAS_IP/manage.php

三、安全建议

  1. 设置宝塔面板强密码
  2. 通过Nginx配置限制访问IP:
location /manage.php {
    allow 192.168.1.0/24;
    deny all;
}
  1. 定期备份数据库

四、测试流程

  1. 将测试视频放入 /www/wwwroot/videos_input
  2. 查看 slice.log确认切片进程
  3. 访问管理页面验证记录显示
  4. 测试自动删除功能

此方案已考虑家庭局域网环境特点,通过自动化脚本+网页管理实现零手动操作,建议首次部署时先用小视频测试流程。

收藏
送赞
分享

1

主题

5

回帖

0

牛值

江湖小虾

2025-3-31 15:22:58 显示全部楼层
支持一下,类似视频网站的做法了,有需求可以尝试。不过都内网直推对资源要求肯定更高,4K怕不是切不动哦。
切不动,拼夕夕买淘汰的4U服务器。。。  详情 回复
2025-4-1 21:09

8

主题

9

回帖

0

牛值

fnOS系统内测组

2025-4-1 21:09:29 楼主 显示全部楼层
支付宝 发表于 2025-3-31 15:22
支持一下,类似视频网站的做法了,有需求可以尝试。不过都内网直推对资源要求肯定更高,4K怕不是切不动哦。 ...

切不动,拼夕夕买淘汰的4U服务器。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则