需要安装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
}
}