m3u8merge
Version:
A powerful and lightweight SDK for merging M3U8 playlist streams into complete video files. Supports HLS stream parsing, segment downloading, and seamless video concatenation with progress tracking.
280 lines (227 loc) • 6.19 kB
Markdown
一个高性能的 M3U8 视频流下载和合并工具,支持加密解密、并发下载和自动重试功能。
- 🚀 高性能并发下载
- 🔐 支持 AES-128 加密视频解密
- 🛡️ 智能重试机制
- 📊 实时下载进度监控
- 🔄 自动选择最优下载方法
- 💾 支持本地文件和网络 URL
```bash
yarn add m3u8merge
npm install m3u8merge
```
```bash
npx m3u8merge -f your_file.m3u8 -o output.mp4
```
确保系统已安装 FFmpeg:
**macOS:**
```bash
brew install ffmpeg
```
**Windows:**
下载 FFmpeg 并添加到系统 PATH
**Linux:**
```bash
sudo apt update && sudo apt install ffmpeg
sudo yum install ffmpeg
```
```bash
npx m3u8merge -f <输入文件> -o <输出文件>
```
```bash
npx m3u8merge -f ./video.m3u8 -o merged_video.mp4
```
```bash
npx m3u8merge -f "https://example.com/video.m3u8" -o output.mp4
```
- `-f, --file`: 输入的 M3U8 文件路径或 URL(必需)
- `-o, --output`: 输出视频文件路径(可选,默认使用输入文件名)
```javascript
import M3U8Parser from 'm3u8merge';
// 创建解析器实例
const parser = new M3U8Parser();
```
```javascript
// 从本地文件解析
const links = parser.parseFromFile('./video.m3u8');
// 从字符串内容解析
const m3u8Content = `
segment1.ts
segment2.ts`;
const links = parser.parseFromString(m3u8Content);
```
```javascript
const success = await parser.processFileToVideo(
'./video.m3u8', // M3U8 文件路径
'./output.mp4', // 输出视频路径
'./temp_segments', // 临时目录(可选)
{ // 配置选项(可选)
keepTempFiles: false,
videoCodec: 'copy',
audioCodec: 'copy',
maxConcurrent: 20,
retryCount: 3
}
);
```
```javascript
const success = await parser.processUrlToVideo(
'https://example.com/video.m3u8', // M3U8 URL
'./output.mp4', // 输出视频路径
'./temp_segments', // 临时目录(可选)
{ // 配置选项(可选)
maxConcurrent: 15,
retryCount: 5,
downloadMethod: 'auto'
}
);
```
```typescript
interface MergeOptions {
outputPath: string; // 输出文件路径
tempDir: string; // 临时目录
keepTempFiles: boolean; // 是否保留临时文件
videoCodec?: string; // 视频编码器 ('copy', 'libx264', 等)
audioCodec?: string; // 音频编码器 ('copy', 'aac', 等)
quality?: string; // 视频质量 (CRF值,如 '23')
maxConcurrent?: number; // 最大并发数 (5-30)
retryCount?: number; // 重试次数 (1-10)
downloadMethod?: 'undici' | 'curl' | 'auto'; // 下载方法
}
```
```javascript
parser.showStatistics();
// 输出:
// 📊 解析统计信息
// ================
// 总片段数量: 100
// 总时长: 16:40
// 平均片段时长: 10.00 秒
```
```javascript
parser.exportLinks('./links.txt');
```
```javascript
// 简单列表
parser.printAllLinks();
// 详细信息
parser.printAllLinks(true);
```
```javascript
const parser = new M3U8Parser();
// 高质量转码配置
const success = await parser.processFileToVideo(
'./video.m3u8',
'./output_hq.mp4',
'./temp',
{
keepTempFiles: false,
videoCodec: 'libx264', // 重新编码
audioCodec: 'aac', // 音频转码
quality: '18', // 高质量 (CRF)
maxConcurrent: 10, // 保守的并发数
retryCount: 5
}
);
```
```javascript
// SDK 会自动检测和处理 AES-128 加密
const success = await parser.processUrlToVideo(
'https://encrypted-stream.com/video.m3u8',
'./decrypted_video.mp4'
);
// 自动下载密钥并解密片段
```
```javascript
// 高速网络配置
const highSpeedConfig = {
maxConcurrent: 30, // 高并发
retryCount: 3,
downloadMethod: 'undici' // 高性能方法
};
// 稳定性优先配置
const stableConfig = {
maxConcurrent: 8, // 低并发
retryCount: 10,
downloadMethod: 'curl' // 稳定方法
};
```
```javascript
try {
const success = await parser.processUrlToVideo(
'https://example.com/video.m3u8',
'./output.mp4'
);
if (success) {
console.log('✅ 视频处理成功');
} else {
console.log('❌ 视频处理失败');
}
} catch (error) {
console.error('处理过程中发生错误:', error.message);
}
```
- **高速网络**: `maxConcurrent: 20-30`
- **普通网络**: `maxConcurrent: 10-15`
- **不稳定网络**: `maxConcurrent: 5-10`
- **`auto`**: 自动选择最优方法(推荐)
- **`undici`**: Node.js 原生,高性能
- **`curl`**: 系统工具,稳定性好
- **快速合并**: `videoCodec: 'copy'`, `audioCodec: 'copy'`
- **质量优化**: `videoCodec: 'libx264'`, `quality: '18-23'`
- **文件大小优化**: `quality: '28-32'`
A: 尝试降低并发数或更换下载方法:
```javascript
{
maxConcurrent: 5,
retryCount: 10,
downloadMethod: 'curl'
}
```
A: 目前 SDK 内置了常用的请求头,如需自定义,请提交 Issue。
A: 支持所有 FFmpeg 支持的格式,输出推荐使用 `.mp4`。
MIT License
---
**注意**: 请确保遵守相关版权法律,仅下载和使用您有权访问的内容。