在写视频相关的业务逻辑,发几个代码出来备用。
包
goav
好像不维护了- 目前在使用
u2takey/ffmpeg-go
这个包。虽然star数量不高……
按FPS抽帧
ffCmd := ffmpeg.Input(inputFile)
ffCmd = ffCmd.Filter("fps", nil, ffmpeg.KwArgs{
"fps": "1", // 1 FPS
})
ffCmd = ffCmd.Output(filepath.Join(tmpFolder, "/%08d.png"),
ffmpeg.KwArgs{
"format": "image2", // https://ffmpeg.org/ffmpeg-formats.html#image2-1
"qscale:v": 2, // Fixed quality scale to assure quality
"vsync": "vfr", // https://ffmpeg.org/ffmpeg.html#Advanced-options
})
if err := ffCmd.Run(); nil != err {
return nil, err
}
大致分为三部分:输入,Filter,输出。
输出部分 vsync
和 qscale:v
好像没啥用。qscale好像会让画面变大一点。
不过我还是没研究出来如何按照帧号或时间来命名。
按场景变换抽帧
将Filter部分改成这样:
ffCmd = ffCmd.Filter("fps", nil, ffmpeg.KwArgs{"fps": "2"}).
Filter("select", ffmpeg.Args{"gt(scene,0.08)"})
大致是,先按照FPS抽,然后再在结果中过滤出来场景变换比较大的帧。
抽音频
ffCmd := ffmpeg.Input(inputFile)
ffCmd = ffCmd.Output("output/audio.pcm", ffmpeg.KwArgs{
"vn": "", // No video
// "acodec": "pcm_s16le", // Codec
"f": "u8", // Unsigned, 8 bit
"ac": "1", // Only one sound track
})
if err := ffCmd.Run(); nil != err {
return nil, err
}
这里是抽成了单声道pcm格式。如果需要其他格式,那么去看ffmpeg的文档就好
如何看文档
- 参数名称里面有写「这个参数可用于哪里」,比如可用于Input或者Input/Output都可用
- 根据例子,写代码。如果是只有key没value的情况,写到
ffmpeg.Arg
s 里,或者写到ffmpeg.KwArg
s 里,value为空字符串;如果有key有value,那么写到ffmpeg.KwArgs
里。 - 可以用
Compile()
看看生成出来的命令行和网上找的命令行是否一致。
发表回复