golang 摄像头截图命令版本

需要安装ffmpeg 使用ffmpeg命令进行画面生成对应的jpg图片

Go 复制代码
package common

import (
	"context"
	"errors"
	"fmt"
	"net"
	"net/url"
	"os/exec"
	"time"
)

func GetRtspImage(rtsp string) (string, error) {
	tmpFile := fmt.Sprintf("/tmp/%d.jpg", time.Now().Unix())
	var params []string

	params = append(params, "-rtsp_transport")
	params = append(params, "tcp")
	params = append(params, "-y")
	params = append(params, "-i")
	params = append(params, rtsp)
	params = append(params, "-vframes")
	params = append(params, "1")
	params = append(params, "-f")
	params = append(params, "image2")
	params = append(params, tmpFile)

	_, err := Command(time.Second*3, "ffmpeg", params...)
	if err != nil {
		return "", fmt.Errorf("commond err:%w", err)
	}

	return tmpFile, nil
}

// 执行命令并添加超时检测
func Command(timeout time.Duration, name string, arg ...string) (string, error) {
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
	cmd := exec.CommandContext(ctx, name, arg...)

	defer func() {
		cancel()
	}()

	// 当经过Timeout时间后,程序依然没有运行完,则会杀掉进程,ctx也会有err信息
	if out, err := cmd.Output(); err != nil {
		// 检测报错是否是因为超时引起的
		if ctx.Err() != nil && ctx.Err() == context.DeadlineExceeded {
			return "", errors.New("command timeout")
		}

		return string(out), err
	} else {
		return string(out), nil
	}
}
相关推荐
moxiaoran57537 小时前
Go语言的范围range
golang
zfj3217 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446237 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
小信啊啊8 小时前
Go语言切片slice
开发语言·后端·golang
Kiri霧10 小时前
Range循环和切片
前端·后端·学习·golang
bing.shao11 小时前
Golang 高并发秒杀系统踩坑
开发语言·后端·golang
skyjilygao12 小时前
n8n整合ffmpeg
ffmpeg·视频编辑·n8n
小信啊啊14 小时前
Go语言数组与切片的区别
开发语言·后端·golang
云霄IT15 小时前
docker使用教程之部署第一个go项目
docker·容器·golang
Tony Bai16 小时前
Go 1.26 新特性前瞻:从 Green Tea GC 到语法糖 new(expr),性能与体验的双重进化
开发语言·后端·golang