golang中的FFmpeg I-P帧命令

FFmpeg I-P frame command in golang

我一直在使用下面的命令从视频中获取特定帧并将其放入缓冲区。

func ReadFrameAsJpeg(inFileName string, frameNum int) []byte {
    // Returns specified frame as []byte
    buf := bytes.NewBuffer(nil)
    err := ffmpeg.Input(inFileName).
        Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
        Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
        WithOutput(buf, os.Stdout).Run()
    if err != nil {
        fmt.Println(err)
        panic(err)
    }

在根据FrameNum获取特定帧的同时,我还想检查它是哪种类型的帧。就像使用“pict_type”来获取该信息一样。我尝试使用过滤器获取下面的帧类型,但它显示“错误解析参数”。它应该给出带有“pict_type = P”或“pict_type = I”的输出

Filter("select", ffmpeg.Args{fmt.Sprintf("eq(n,%d),showinfo", frameNum)}).

我正在尝试执行以下命令

$ ffmpeg -hide_banner -i INPUT.mp4 -filter:v "select=eq('n,3344'),showinfo" -frames:v 1 -map 0:v:0 -f null -

您将 showinfo 指定为 select 过滤器选项的一部分,而不是定义 2 个不同的过滤器。假设你正在使用 this library,你需要做这样的事情:

ffmpeg.Input(inFileName)
  .Filter("select", ffmpeg.Args{fmt.Sprintf("eq(n,%d)", frameNum)})
  .Filter("showinfo")
  .Output(...)...

我不熟悉 go 语言,所以可能存在语法问题,您可能需要解决。

编辑: 是的,它应该是一个不同的过滤器。 对于 golang,它可以使用,

Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
Filter("showinfo", ffmpeg.Args{"TRUE"})