You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨API管理多OS命令:如何按需启停指定ffmpeg RTSP流

基于os/exec控制FFmpeg指定RTSP流的启停方案

核心思路

要实现指定流的精准启停,关键是将用户指定的流标识(如摄像头ID、自定义流编号)与对应的FFmpeg进程实例/PID绑定,通过维护一个映射关系追踪每个流的进程状态,进而实现针对性操作。

具体实现方案

1. 维护并发安全的进程映射表

使用并发安全的存储结构(如Go中的sync.Map),键为流的唯一标识(比如camera_001),值为启动该流时创建的*exec.Cmd实例。这样可以快速根据用户请求的流ID定位到对应的进程。

2. 启动流的代码示例

import (
    "context"
    "os/exec"
    "sync"
)

var streamProcesses sync.Map

// startStream 启动单个RTSP流,返回错误或nil
func startStream(streamID string, rtspURL string, outputParams []string) error {
    // 构造FFmpeg命令,示例为拉取RTSP流并转码为本地HLS流
    cmdArgs := append([]string{"-i", rtspURL}, outputParams...)
    cmd := exec.CommandContext(context.Background(), "ffmpeg", cmdArgs...)
    
    if err := cmd.Start(); err != nil {
        return err
    }
    
    // 将流ID与进程实例绑定存储
    streamProcesses.Store(streamID, cmd)
    
    // 启动goroutine监听进程退出,自动清理映射表
    go func() {
        cmd.Wait()
        streamProcesses.Delete(streamID)
    }()
    
    return nil
}

注:outputParams可按需传入,比如["-c:v", "libx264", "-f", "hls", "./streams/"+streamID+".m3u8"]生成可用于拼接的HLS流。

3. 终止指定流的代码示例

根据用户传入的流ID,从映射表中取出进程实例,优先尝试优雅终止(发送SIGTERM信号),失败则强制杀死进程:

import (
    "fmt"
    "syscall"
)

// stopStream 终止指定ID的流进程
func stopStream(streamID string) error {
    val, exists := streamProcesses.Load(streamID)
    if !exists {
        return fmt.Errorf("流 %s 不存在或已终止", streamID)
    }
    
    cmd, ok := val.(*exec.Cmd)
    if !ok {
        return fmt.Errorf("流 %s 的进程记录无效", streamID)
    }
    
    // 先尝试优雅终止,让FFmpeg完成收尾工作
    if err := cmd.Process.Signal(syscall.SIGTERM); err != nil {
        // 优雅失败,强制杀死进程
        if killErr := cmd.Process.Kill(); killErr != nil {
            return killErr
        }
    }
    
    // 从映射表中删除已终止的流记录
    streamProcesses.Delete(streamID)
    return nil
}

4. 多画面拼接的适配建议

如果需要实现多画面预览,推荐采用**“分进程拉流+独立进程拼接”**的架构:

  • 每个RTSP流用单独的FFmpeg进程拉取并转码为本地可访问的临时流(如HLS、RTMP)
  • 再启动一个FFmpeg进程,通过-filter_complex将多个临时流拼接成网格画面输出
    这种架构下,终止某一路流只需停止对应的拉流进程,拼接进程可通过动态修改输入重新生成画面(或重启拼接进程)。

关键注意事项

  • 并发安全:必须使用并发安全的存储结构,避免多请求下的竞态问题
  • 进程清理:进程正常退出或被终止后,务必从映射表中删除对应条目,避免无效数据堆积
  • 权限控制:确保程序拥有杀死进程的系统权限(Linux下需对应用户权限,Windows下需管理员权限)

内容的提问来源于stack exchange,提问作者Nitin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 12:47:52