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
	}
}
相关推荐
nexttake1 小时前
5.go-zero集成gorm 和 go-redis
开发语言·后端·golang
QX_hao7 小时前
【Go】--闭包
开发语言·golang
脚踏实地的大梦想家12 小时前
【Go】P8 Go 语言核心数据结构:深入解析切片 (Slice)
开发语言·数据结构·golang
Tony Bai12 小时前
【Go 网络编程全解】13 从 HTTP/1.1 到 gRPC:Web API 与微服务的演进
开发语言·网络·http·微服务·golang
weixin_4209476416 小时前
golang使用泛型
golang·1024程序员节
叶羽西16 小时前
FFmpeg介绍、使用说明
ffmpeg
小画家~19 小时前
第二十七:使用 Logrus + Lumberjack 创建日志中间件
golang
aqi0021 小时前
FFmpeg开发笔记(八十五)基于PyQt和FFmpeg的开源视频剪辑器OpenShot
ffmpeg·音视频·直播·流媒体
Yeats_Liao1 天前
Go Web 编程快速入门 05 - 表单处理:urlencoded 与 multipart
前端·golang·iphone
Tony Bai1 天前
【Go 网络编程全解】12 本地高速公路:Unix 域套接字与网络设备信息
开发语言·网络·后端·golang·unix