我有一个时长为 200 分钟的视频。
并且还获得了将要拍摄的每个快照的时间戳。
我尝试使用 ffmpeg 通过以下命令拍摄快照。
但是,速度很慢,每个快照大约需要 10 秒。
有什么办法可以加快速度吗?谢谢。
操作系统:win10;电脑:英特尔 NUC8i5
<块引用>ffmpeg -i 1.mp4 -ss 00:00:04 -vframes 1 000004.jpg
ffmpeg -i 1.mp4 -ss 00:00:08 -vframes 1 000008.jpg
ffmpeg -i 1.mp4 -ss 00:00:12 -vframes 1 000012.jpg
ffmpeg -i 1.mp4 -ss 00:00:16 -vframes 1 000016.jpg
ffmpeg -i 1.mp4 -ss 00:00:17 -vframes 1 000017.jpg
ffmpeg -i 1.mp4 -ss 00:00:20 -vframes 1 000020.jpg
ffmpeg -i 1.mp4 -ss 00:00:24 -vframes 1 000024.jpg
ffmpeg -i 1.mp4 -ss 00:00:26 -vframes 1 000026.jpg
ffmpeg -i 1.mp4 -ss 00:00:28 -vframes 1 000028.jpg
ffmpeg -i 1.mp4 -ss 00:00:32 -vframes 1 000032.jpg
ffmpeg -i 1.mp4 -ss 00:00:36 -vframes 1 000036.jpg
ffmpeg -i 1.mp4 -ss 00:00:38 -vframes 1 000038.jpg
ffmpeg -i 1.mp4 -ss 00:00:43 -vframes 1 000043.jpg
答案 0 :(得分:1)
如果时间戳的间隔不规则(如您的示例所示),您可以使用选择过滤器:
ffmpeg -i 1.mp4 -filter:v \
"select='lt(prev_pts*TB\,4)*gte(pts*TB\,4) \
+lt(prev_pts*TB\,12)*gte(pts*TB\,12) \
+lt(prev_pts*TB\,17)*gte(pts*TB\,17) \
+lt(prev_pts*TB\,28)*gte(pts*TB\,28) \
+lt(prev_pts*TB\,43)*gte(pts*TB\,43)'" \
-vsync drop out/%03d.jpg
这将抓取指定时间戳的帧,如果在该精确时间戳上没有帧,它将抓取下一帧。
答案 1 :(得分:0)
尝试在 200 parts 中分割视频(200 分钟一首),然后一一加载。将整个视频加载到 ram 是昂贵的。用小视频试试看会如何改进
答案 2 :(得分:0)
我用 VLC 来解决这个问题。
基本思路是利用VLC的http接口来控制vlc跳转到特定的时间戳并进行快照。
RAM消耗极低,速度更快。
拍摄3800张快照大约需要16分钟。
以下代码在自动热键中。
#Include, VLC_HTTP2.ahk
Loop, read, %A_ScriptDir%\TimeStamps.txt
{
VLC_JumpTime:=A_LoopReadLine
VLCHTTP2_Jumpto(VLC_JumpTime)
Sleep, 100
VLCHTTP2_Snapshot()
}
return
VLCHTTP2_Jumpto(VLC_JumpToTime)
{
VLC_CurrentTime:=VLCHTTP2_TimeSeconds()
SeekBackwardTime:=VLC_CurrentTime-VLC_JumpToTime
if SeekBackwardTime >0
VLCHTTP2_JumpBackward(SeekBackwardTime)
else if SeekBackwardTime <0
{
SeekForwardTime:=-SeekBackwardTime
VLCHTTP2_JumpForward(SeekForwardTime)
}
}