Skip to content

M3U8 代理设置

M3U8 代理主要用于过滤采集站内存在的插针广告或者提速视频播放。通过配置 M3U8 代理,可以提升视频播放体验。

什么是 M3U8?

M3U8 是一种基于 HTTP Live Streaming (HLS) 协议的视频播放列表格式。它将视频分割成多个小片段(TS 文件),通过播放列表(M3U8 文件)来组织这些片段,实现视频的流式播放。

为什么需要 M3U8 代理?

问题

  1. 广告插针:某些采集站的 M3U8 文件中可能包含广告片段
  2. 播放速度慢:原始视频服务器可能距离较远,导致播放卡顿
  3. 访问限制:某些视频服务器可能有访问限制或需要特殊处理

解决方案

M3U8 代理服务器可以:

  • 过滤广告:自动识别并过滤 M3U8 播放列表中的广告片段
  • 加速播放:通过 CDN 或缓存加速视频片段加载
  • 统一处理:统一处理 M3U8 文件,添加必要的请求头或参数

部署 M3U8 代理

推荐方案:M3U8 Proxy Filter Script

我们推荐使用 M3U8 Proxy Filter Script 项目来构建 M3U8 代理服务。

项目特点

  • 自动过滤广告片段
  • 支持多种部署方式
  • 配置简单,易于使用
  • 性能优化,支持高并发

部署步骤

  1. 克隆项目

    bash
    git clone https://github.com/eraycc/m3u8-proxy-script.git
    cd m3u8-proxy-script
  2. 安装依赖

    bash
    npm install
  3. 配置代理

    • 编辑配置文件,设置过滤规则
    • 配置 CDN 或缓存设置(可选)
  4. 启动服务

    bash
    npm start
  5. 部署到生产环境

    • 可以使用 PM2 保持服务运行
    • 或部署到 Vercel、Cloudflare Workers 等平台

其他部署方案

Deno Deploy

typescript
// deploy.ts
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";

serve(async (req) => {
  const url = new URL(req.url);
  const m3u8Url = url.searchParams.get("url");
  
  if (!m3u8Url) {
    return new Response("Missing url parameter", { status: 400 });
  }
  
  // 获取并处理 M3U8 文件
  const response = await fetch(m3u8Url);
  let content = await response.text();
  
  // 过滤广告片段(示例)
  content = content.replace(/.*ad.*\.ts/g, '');
  
  return new Response(content, {
    headers: {
      "Content-Type": "application/vnd.apple.mpegurl",
      "Access-Control-Allow-Origin": "*",
    },
  });
});

Cloudflare Workers

javascript
// worker.js
export default {
  async fetch(request) {
    const url = new URL(request.url);
    const m3u8Url = url.searchParams.get("url");
    
    if (!m3u8Url) {
      return new Response("Missing url parameter", { status: 400 });
    }
    
    // 获取并处理 M3U8 文件
    const response = await fetch(m3u8Url);
    let content = await response.text();
    
    // 过滤广告片段
    content = content.replace(/.*ad.*\.ts/g, '');
    
    return new Response(content, {
      headers: {
        "Content-Type": "application/vnd.apple.mpegurl",
        "Access-Control-Allow-Origin": "*",
      },
    });
  },
};

配置 M3U8 代理

在 OmniBox 中配置

方法一:初始化时配置

在 OmniBox 初始化界面,使用 JSON 配置:

json
{
  "PROXY_BASE_URL": "https://your-proxy-domain.com/proxy/",
  "M3U8_PROXY_URL": "https://your-m3u8-proxy.com/"
}

方法二:在设置中配置

  1. 进入 OmniBox 设置页面
  2. 找到 M3U8 代理设置
  3. 输入 M3U8 代理地址
  4. 保存配置

代理地址格式

M3U8 代理地址格式:

https://your-m3u8-proxy.com/?url={M3U8_URL}

示例

https://m3u8-proxy.example.com/?url=https://video-server.com/playlist.m3u8

工作原理

处理流程

  1. 接收请求:代理服务器接收包含 M3U8 URL 的请求
  2. 获取 M3U8 文件:从原始服务器获取 M3U8 播放列表
  3. 解析内容:解析 M3U8 文件内容,识别视频片段和广告片段
  4. 过滤处理:根据配置规则过滤广告片段
  5. 返回结果:返回处理后的 M3U8 文件

过滤规则示例

javascript
// 过滤包含 "ad" 关键字的片段
function filterAds(content) {
  const lines = content.split('\n');
  const filtered = [];
  let skipNext = false;
  
  for (let i = 0; i < lines.length; i++) {
    const line = lines[i];
    
    // 检查是否是广告片段
    if (line.includes('#EXTINF') && line.includes('ad')) {
      skipNext = true;
      continue;
    }
    
    // 跳过广告片段的 URL
    if (skipNext && line.startsWith('http')) {
      skipNext = false;
      continue;
    }
    
    filtered.push(line);
  }
  
  return filtered.join('\n');
}

高级配置

添加 CDN 加速

可以通过 CDN 加速视频片段加载:

javascript
function addCDN(content, cdnUrl) {
  return content.replace(
    /(https?:\/\/[^\s]+\.ts)/g,
    `${cdnUrl}/?url=$1`
  );
}

添加请求头

某些视频服务器可能需要特定的请求头:

javascript
const headers = {
  'User-Agent': 'Mozilla/5.0 ...',
  'Referer': 'https://example.com',
  'Cookie': 'session=xxx',
};

const response = await fetch(m3u8Url, { headers });

缓存机制

添加缓存可以提高性能:

javascript
const cache = new Map();

async function getM3u8(url) {
  if (cache.has(url)) {
    return cache.get(url);
  }
  
  const content = await fetchAndProcess(url);
  cache.set(url, content);
  
  // 设置缓存过期时间(5分钟)
  setTimeout(() => cache.delete(url), 5 * 60 * 1000);
  
  return content;
}

测试 M3U8 代理

测试方法

  1. 获取测试 M3U8 URL

    • 在 OmniBox 中找到一个 M3U8 视频
    • 复制 M3U8 地址
  2. 测试代理

    bash
    curl "https://your-m3u8-proxy.com/?url=https://example.com/playlist.m3u8"
  3. 验证结果

    • 检查返回的 M3U8 内容
    • 确认广告片段已被过滤
    • 验证视频片段 URL 是否正确

预期结果

处理后的 M3U8 文件应该:

  • ✅ 不包含广告片段
  • ✅ 视频片段 URL 可访问
  • ✅ 格式符合 HLS 标准
  • ✅ 包含必要的元数据

故障排除

问题:代理无法访问

可能原因

  • 代理服务器未启动
  • 代理地址配置错误
  • 网络连接问题

解决方案

  1. 检查代理服务器是否正常运行
  2. 确认代理地址格式正确
  3. 在浏览器中直接访问代理测试
  4. 检查防火墙设置

问题:视频无法播放

可能原因

  • M3U8 文件处理错误
  • 视频片段 URL 无法访问
  • 代理服务器过滤规则过于严格

解决方案

  1. 检查代理服务器日志
  2. 验证 M3U8 文件格式
  3. 测试视频片段 URL 是否可访问
  4. 调整过滤规则

问题:播放卡顿

可能原因

  • 代理服务器性能问题
  • 网络延迟
  • 缺少 CDN 加速

解决方案

  1. 使用性能更好的部署方案
  2. 添加 CDN 加速
  3. 优化代理服务器配置
  4. 检查网络连接

性能优化

使用 CDN

将 M3U8 代理部署到 CDN 边缘节点,可以显著提升访问速度:

  • Cloudflare Workers(全球边缘节点)
  • Vercel Edge Functions(边缘计算)
  • Deno Deploy(全球 CDN)

缓存策略

实现合理的缓存策略:

  • 缓存 M3U8 文件(短期缓存,如 1-5 分钟)
  • 缓存视频片段(长期缓存,如 1 小时)
  • 使用 ETag 或 Last-Modified 头

并发处理

优化并发处理能力:

  • 使用异步处理
  • 实现连接池
  • 限制并发请求数

相关资源

下一步

基于 MIT 许可发布