![无需读取整个视频,即可按一定间隔从视频中创建缩略图](https://linux22.com/image/1572841/%E6%97%A0%E9%9C%80%E8%AF%BB%E5%8F%96%E6%95%B4%E4%B8%AA%E8%A7%86%E9%A2%91%EF%BC%8C%E5%8D%B3%E5%8F%AF%E6%8C%89%E4%B8%80%E5%AE%9A%E9%97%B4%E9%9A%94%E4%BB%8E%E8%A7%86%E9%A2%91%E4%B8%AD%E5%88%9B%E5%BB%BA%E7%BC%A9%E7%95%A5%E5%9B%BE%20.png)
简短问题:我想在特定时间从视频网址中截取一些截图,但不想读取整个视频。
假设我有一个视频存储在某个 URL 中(例如https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_30mb.mp4)。视频文件较大,但是我们可以在视频上进行定位。
现在我想截取视频的 4 张截图/缩略图。例如,如果视频的大小是 100 秒,我想分别在 20 秒、40 秒、60 秒和 80 秒处截取截图。
使用教程wiki:每隔 X 秒创建一个视频缩略图我可以做这个
ffmpeg -i 'https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_30mb.mp4' -vf fps=1/20 img%03d.jpg
但这种方法的问题在于,它会在返回屏幕截图之前读取整个输入。但由于输入是可搜索的,这似乎是一种浪费。更好的方法是搜索位置并获取它们。目前我们使用类似
for i in 20 to 80 step 20
ffmpeg -noaccurate_seek -ss {i} -i 'https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_30mb.mp4' -vframes 1 out-{i}.png
这似乎有效,但运行每个 ffmpeg 仍然需要一些时间,并且每个 ffmpeg 解码相同视频 url 的标头,这似乎是多余的。有没有办法在单个 ffmpeg 调用中移除这个重复的工作?
PS 没有必要只使用 ffmpeg 来回答。我们还可以使用 mpv/mplayer 或 vlc 或 Linux 中可用的任何其他播放器/转换器。