首页
/ ZLMediaKit录制功能:FLV/HLS/MP4多格式录制与点播完整解决方案

ZLMediaKit录制功能:FLV/HLS/MP4多格式录制与点播完整解决方案

2026-02-04 05:10:48作者:殷蕙予

概述

在流媒体服务中,录制功能是至关重要的核心能力。ZLMediaKit作为一款高性能的流媒体服务器框架,提供了完善的录制解决方案,支持FLV、HLS、MP4等多种格式的实时录制和点播功能。本文将深入解析ZLMediaKit的录制架构、配置方法、API使用以及最佳实践。

录制功能架构

核心组件

ZLMediaKit的录制功能基于模块化设计,主要包含以下核心组件:

classDiagram
    class Recorder {
        +type_hls
        +type_mp4
        +type_hls_fmp4
        +type_fmp4
        +type_ts
        +getRecordPath()
        +createRecorder()
    }
    
    class MediaSinkInterface {
        <<interface>>
        +resetTracks()
        +inputFrame()
        +flush()
        +addTrack()
    }
    
    class MP4Recorder {
        -MP4Muxer _muxer
        -RecordInfo _info
        +createFile()
        +closeFile()
    }
    
    class HlsRecorderBase {
        -HlsMakerImp _hls
        -ProtocolOption _option
        +onReaderChanged()
        +inputFrame()
    }
    
    class HlsRecorder {
        +onWrite()
    }
    
    class HlsFMP4Recorder {
        +addTrackCompleted()
        +onSegmentData()
    }
    
    Recorder --> MediaSinkInterface
    MP4Recorder --|> MediaSinkInterface
    HlsRecorderBase --|> MediaSinkInterface
    HlsRecorder --|> HlsRecorderBase
    HlsFMP4Recorder --|> HlsRecorderBase

录制流程

sequenceDiagram
    participant Client as 客户端
    participant Server as ZLMediaKit服务器
    participant Recorder as 录制模块
    participant Storage as 存储系统
    
    Client->>Server: 推流/拉流请求
    Server->>Recorder: 创建录制器实例
    Recorder->>Recorder: 初始化文件路径和配置
    Server->>Recorder: 传输媒体帧数据
    Recorder->>Recorder: 处理媒体帧
    Recorder->>Storage: 写入文件系统
    Recorder->>Server: 返回录制状态
    Server->>Client: 响应请求

配置详解

基础配置选项

config.ini配置文件中,录制相关的关键配置项如下:

配置项 默认值 说明
enable_mp4 0 是否启用MP4录制功能
enable_hls 1 是否启用HLS(mpegts)录制
enable_hls_fmp4 0 是否启用HLS(fmp4)录制
mp4_max_second 3600 MP4切片最大时长(秒)
mp4_save_path ./www MP4录制保存路径
hls_save_path ./www HLS录制保存路径
mp4_as_player 0 是否将MP4录制当做观看者

HLS录制配置

[hls]
fileBufSize=65536        # HLS写文件缓冲区大小
segDur=2                 # HLS切片时长(秒)
segNum=3                 # m3u8索引中保留的切片个数
segRetain=5              # 切片从m3u8移除后保留在磁盘的个数
segKeep=0                # 是否保留所有切片用于点播
deleteDelaySec=10        # 直播HLS文件删除延时(秒)

MP4录制配置

[record]
appName=record           # MP4录制/点播的应用名
fileBufSize=65536        # MP4写文件缓冲区大小
sampleMS=500             # MP4点播每次流化数据量(毫秒)
fastStart=0              # 是否进行二次关键帧索引写入头部
fileRepeat=0             # 是否循环播放文件
enableFmp4=0             # 是否采用fmp4格式录制

API接口使用

录制控制API

ZLMediaKit提供了完善的HTTP API来控制录制功能:

开始录制

# 开始录制流
curl "http://127.0.0.1/index/api/startRecord?\
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&\
type=0&\
vhost=__defaultVhost__&\
app=live&\
stream=test"

# 响应示例
{
    "code": 0,
    "result": true,
    "msg": "success"
}

停止录制

# 停止录制流
curl "http://127.0.0.1/index/api/stopRecord?\
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&\
type=0&\
vhost=__defaultVhost__&\
app=live&\
stream=test"

获取录制状态

# 查询录制状态
curl "http://127.0.0.1/index/api/isRecording?\
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc&\
type=0&\
vhost=__defaultVhost__&\
app=live&\
stream=test"

录制类型参数

类型值 说明
0 HLS录制(mpegts格式)
1 MP4录制
2 HLS录制(fmp4格式)
3 fmp4直播
4 ts直播

文件存储结构

MP4录制文件结构

www/
├── record/
│   └── live/
│       └── test/
│           ├── 2024-01-01/
│           │   ├── 10-00-00.mp4
│           │   ├── 10-30-00.mp4
│           │   └── 11-00-00.mp4
│           └── 2024-01-02/
│               └── ...

HLS录制文件结构

www/
├── live/
│   └── test/
│       ├── 2024-01-01/
│       │   ├── 10-00-00.m3u8
│       │   ├── 10-00-00-0.ts
│       │   ├── 10-00-02-0.ts
│       │   └── ...
│       └── 2024-01-02/
│           └── ...

高级功能特性

1. 按需录制

ZLMediaKit支持智能的按需录制机制,可以根据实际观看情况动态启停录制,节省存储空间和系统资源。

// 按需录制实现逻辑
void onReaderChanged(MediaSource &sender, int size) override {
    _enabled = _option.hls_demand ? (_hls->isLive() ? size : true) : true;
    if (!size && _hls->isLive() && _option.hls_demand) {
        _clear_cache = true;
    }
}

2. 断电保护

通过fmp4格式支持,即使录制过程中发生断电等异常情况,已录制的文件仍然可以正常播放。

[record]
enableFmp4=1    # 启用fmp4格式录制,提供断电保护

3. 智能切片管理

支持自动化的切片管理和清理机制,防止磁盘空间被无限占用。

graph TD
    A[新切片生成] --> B{切片数量检查}
    B -->|超过segNum| C[从m3u8移除旧切片]
    B -->|未超过| D[保留所有切片]
    C --> E{segRetain检查}
    E -->|超过segRetain| F[删除磁盘文件]
    E -->|未超过| G[保留磁盘文件]

4. 多协议兼容

录制功能与所有支持的流协议完全兼容:

输入协议 录制支持 特点
RTSP 支持H264/H265/AAC/G711
RTMP 支持FLV格式录制
HLS 支持mpegts和fmp4格式
WebRTC 支持实时录制
GB28181 支持国标设备录制

性能优化建议

1. 存储优化

# 使用高速存储设备
mp4_save_path=/opt/fast_disk/record
hls_save_path=/opt/fast_disk/hls

# 优化文件IO性能
fileBufSize=131072    # 增大文件缓冲区

2. 切片策略优化

# 根据业务需求调整切片大小
mp4_max_second=1800   # 30分钟切片适合长时录制
segDur=4              # 4秒HLS切片平衡延迟和性能

3. 内存管理

# 控制内存使用
unready_frame_cache=50    # 减少未就绪帧缓存
segNum=5                  # 合理控制切片保留数量

故障排查与监控

常见问题解决

  1. 录制文件无法播放

    • 检查编码格式兼容性
    • 验证文件完整性
    • 检查关键帧间隔
  2. 磁盘空间不足

    • 调整切片保留策略
    • 启用自动清理机制
    • 监控磁盘使用情况
  3. 录制性能问题

    • 优化存储IO配置
    • 调整缓冲区大小
    • 检查系统资源使用

监控指标

指标 说明 正常范围
录制成功率 录制任务成功比例 >99.9%
文件生成延迟 从接收到首帧到文件生成的时间 <100ms
磁盘使用率 录制文件占用磁盘比例 <80%
IO吞吐量 文件写入速度 根据磁盘性能

实际应用场景

1. 直播录制回放

flowchart TD
    A[直播流输入] --> B[实时转码]
    B --> C[多协议输出]
    C --> D[录制模块]
    D --> E[MP4文件存储]
    D --> F[HLS切片存储]
    E --> G[点播服务]
    F --> G
    G --> H[用户回放]

2. 监控视频存储

# GB28181设备录制示例
curl "http://127.0.0.1/index/api/startRecord?\
secret=YOUR_SECRET&\
type=1&\
vhost=__defaultVhost__&\
app=gb28181&\
stream=device_001"

3. 教育录播系统

# 教育场景配置优化
mp4_max_second=3600     # 1小时课程切片
segDur=6                # 6秒HLS切片适合课件
enable_mp4=1            # 启用MP4录制
enable_hls=1            # 启用HLS录制

总结

ZLMediaKit的录制功能提供了完整的企业级解决方案,具有以下核心优势:

  1. 多格式支持:全面支持MP4、HLS(mpegts)、HLS(fmp4)等多种格式
  2. 高可靠性:断电保护、异常恢复等机制确保数据安全
  3. 高性能:优化的IO处理和内存管理,支持大规模并发录制
  4. 灵活配置:丰富的配置选项满足各种业务场景需求
  5. 完善API:完整的HTTP API接口便于集成和管理

通过合理的配置和优化,ZLMediaKit可以满足从小型应用到大型企业级系统的各种录制需求,为流媒体服务提供稳定可靠的录制能力。

登录后查看全文
热门项目推荐
相关项目推荐