我不喜欢ffmpeg,从视频中提取jpg图片。我使用-filter_complex将输入流分成两个输出流,因为我从直接的http链接处理了我的视频(VPS上没有可用空间),并且我不想两次读取整个视频(流量配额也很稀缺) )。此外,我需要两个系列的陷阱,一个用于应用一些滤镜(更改fps,缩放,不锐化,裁剪,缩放),然后用肉眼从中选择,而另一系列则不受影响(希望更改fps并裁剪黑色边框) ),然后从第一个系列中进行选择后将其用于进一步处理。我从Ruby脚本调用ffmpeg命令,因此它以#{}的形式包含一些字符串插值/替换。我的工作命令行如下所示:
ffmpeg -y -fflags +genpts -loglevel verbose -i #{url} -filter_complex "[0:v]fps=fps=#{new_fps.round(5).to_s},split=2[in1][in2];[in1]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]},scale=#{thumb_width}:-1:flags=lanczos,unsharp,lutyuv=y=gammaval(#{gammaval})[out1];[in2]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]}[out2]" -f #{format} -c copy #{options} -map_chapters -1 - -map '[out1]' -f image2 -q 1 %06d.jpg -map '[out2]' -f image2 -q 1 big_%06d.jpg
#{options}在输出为MP4时设置,然后其值为“ -movflags frag_keyframe + empty_moov”,因此我可以将其发送到标准输出而无需寻找功能并将其上传到某处而无需制作巨大的临时视频文件。因此,我得到了两张图片,其中一张被过滤,锐化,而另一张实际上却未触及。而且,我还在标准输出上获得了视频的输出流,该视频由Open3.popen3库处理,该库连接了其他两个命令的输入的输出流。
当我想在视频中搜索到给定点并忽略STDOUT上的流式视频输出时,就会出现问题。我尝试在给定的时间码之前应用组合搜索,快速搜索,并在浮点秒数中将慢速搜索应用于确切的时间代码:
ffmpeg -report -y -fflags +genpts -loglevel verbose -ss #{(seek_to-seek_before).to_s} -i #{url} -ss #{seek_before.to_s} -t #{t_duration.to_s} -filter_complex "[0:v]fps=fps=#{pics_per_sec},split=2[in1][in2];[in1]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]},scale=#{thumb_width}:-1:flags=lanczos,unsharp,lutyuv=y=gammaval(#{gammaval})[out1];[in2]crop=iw-#{crop[0]+crop[2]}:ih-#{crop[1]+crop[3]}:#{crop[0]}:#{crop[1]}[out2]" -map '[out1]' -f image2 -q 1 %06d.jpg -map '[out2]' -f image2 -q 1 big_%06d.jpg
运行此命令,我得到了所需的两套图片,但是它们包含不同数量的图片,分别是233对484。
可以从此内插/替换命令行中读取实际值:
ffmpeg -report -y -fflags +genpts -loglevel verbose -ss 1619.0443599999999 -i fabf.avi -ss 50.0 -t 46.505879999999934 -filter_complex "[0:v]fps=fps=5,split=2[in1][in2];[in1]crop=iw-0:ih-0:0:0,scale=280:-1:flags=lanczos,unsharp,lutyuv=y=gammaval(0.526316)[out1];[in2]crop=iw-0:ih-0:0:0[out2]" -map '[out1]' -f image2 -q 1 %06d.jpg -map '[out2]' -f image2 -q 1 big_%06d.jpg
详细的日志可以在这里找到:http : //www.filefactory.com/file/1yih17k2hrmp/ffmpeg-20160610-223820.txt在最后一行之前,它显示188个重复的帧。
我也尝试传递“ -vsync 0”选项,但没有帮助。当我用两个不同的命令行在两个连续的步骤中生成两个系列的图像时,那么就没有问题了,当然在这两个系列中我得到的图像数量都是相同的。所以我的问题是,我如何才能使用后面的命令行,仅通过一次读取/解析远程视频文件来生成两个系列的图像?
您还必须复制-ss
-t
第二个输出的选项,即
...-f image2 -q 1 %06d.jpg -map '[out2]' -ss 50 -t 46.5 -f image2 -q 1 big_%06d.jpg
每个输出选项(不在之前的输出选项-i
)仅适用于紧随其后的输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句