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
	}
}
相关推荐
lingggggaaaa1 小时前
安全工具篇&Go魔改二开&Fscan扫描&FRP代理&特征消除&新增扩展&打乱HASH
学习·安全·web安全·网络安全·golang·哈希算法
£漫步 云端彡2 小时前
Golang学习历程【第十篇 方法(method)与接收者】
开发语言·学习·golang
小二·4 小时前
Go 语言系统编程与云原生开发实战(第10篇)性能调优实战:Profiling × 内存优化 × 高并发压测(万级 QPS 实录)
开发语言·云原生·golang
小高Baby@4 小时前
Golang中面向对象的三大特性之多态的理解
数据结构·golang
£漫步 云端彡6 小时前
Golang学习历程【第十三篇 并发入门:goroutine + channel 基础】
开发语言·学习·golang
£漫步 云端彡8 小时前
Golang学习历程【第十二篇 错误处理(error)】
开发语言·学习·golang
£漫步 云端彡8 小时前
Golang学习历程【第九篇 结构体(struct)】
学习·golang·xcode
来鸟 鸣间8 小时前
linux下ffmpeg源码编译
linux·运维·ffmpeg
云霄IT8 小时前
go语言post请求遭遇403反爬解决tls/ja3指纹或Cloudflare防护
开发语言·后端·golang
Echo_NGC22378 小时前
【FFmpeg使用指南】Part 2:滤镜图架构与信号处理
架构·ffmpeg·音视频·信号处理