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"})
我一直在使用下面的命令从视频中获取特定帧并将其放入缓冲区。
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"})