准确的FFmpeg捕获开始时间

7 ffmpeg

我从命令行使用 ffmpeg 使用以下命令从网络摄像头捕获到文件:

ffmpeg -y -rtbufsize 702000k -f dshow -s 320x240 -r 25 -i video="<device name>" -t 10 -vcodec mjpeg -q:v 2 out.mp4
Run Code Online (Sandbox Code Playgroud)

执行命令和开始捕获之间有轻微的延迟(~0.5 秒)。我试图找到一种方法来准确确定捕获的开始时间 (UTC/GMT)。

我最初的想法是使用文件创建时间,因为这可能会准确反映第一帧的编码时间(而不是执行命令的时间)。不幸的是,文件创建时间只精确到秒,这不够精确(而且我不确定这是否会给出准确的结果)。

我的下一个想法是使用 ffmpegs 时间戳选项。根据文档(http://www.ffmpeg.org/ffmpeg.html):

'-时间戳时间(输出)'

Set the recording timestamp in the container. The syntax for time is:

now|([(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...])|(HHMMSS[.m...]))[Z|z])
Run Code Online (Sandbox Code Playgroud)

如果值为“now”,则表示当前时间。时间是本地时间,除非附加了“Z”或“z”,在这种情况下,它被解释为 UTC。如果未指定年月日部分,则采用当前年月日。

所以我添加了选项:

ffmpeg -y -rtbufsize 702000k -f dshow -s 320x240 -r 25 -i video="<device name>" -t 10 -vcodec mjpeg -q:v 2 -timestamp now out.mp4
Run Code Online (Sandbox Code Playgroud)

不幸的是 ffmpeg 似乎不喜欢这样:

选项时间戳(设置录制时间戳(“现在”以设置当前时间))不能应用于输出文件 out.mp4 - 您正在尝试将输入选项应用于输出文件,反之亦然。将此选项移动到它所属的文件之前。

解析输出文件 out.mp4 的选项时出错。

打开输出文件时出错:发生错误号 -22

文档说 -timestamp 是一个输出选项,它似乎应用于输出文件,所以我对这个错误感到困惑。

任何人都可以提出一种准确确定捕获开始时间的方法吗?

有谁知道为什么 -timestamp 选项会出错?

小智 -1

YYYYmmdd将您的 PC 操作系统时间设置为像时间一样显示,hhmmss这样可以更轻松地获取批处理文件中的时间并将其分配给第一帧,然后使用帧编号除以帧速率将每个帧添加到原始时间戳。这是我能够获得流水帐户以在视频中显示时间的唯一方法。

 REM ## GETTIME ##
 SET DTG1=Reserved
 SET DT1=%DATE%%TIME%
 IF "%DT1:~8,1%" EQU " " (SET DTG1=%DT1:~0,8%_0%DT1:~9,5%UTC) ELSE (SET DTG1=%DT1:~0,8%_%DT1:~8,6%UTC)
 REM ## END GETTIME ##

 @START /I /MIN /REALTIME c:\ff\FFmpeg.exe -y -loglevel error -rtbufsize 2.0e+009 -f dshow -r:v 10.000 -s 1920x1080 -vcodec mjpeg -i "video=Logitech HD Pro Webcam C920" -vf "fps=10.000,drawtext=fontfile=ocra.ttf:text=%DTG1%+%%{n}/10sec:fontsize=24:fontcolor=orange:x=999:y=19:box=0:boxcolor=black" -q 0 -f image2 B:\(%%d).jpg 1> nul 2> nul
 @TIMEOUT /T 3 /NOBREAK 1> nul 2> nul
 @START /I /MIN /REALTIME /W FFmpeg.exe -y -loglevel error -f dshow -ac 2 -r:a 44100 -i "audio=Line In (VIA HD Audio)" -f s16le -fs 63504000 B:\a.raw 1> nul 2> nul
 @TASKKILL /F /IM FFmpeg.exe /T 1> nul 2> nul
 @TASKKILL /F /IM FFmpeg.exe /T 1> nul 2> nul
Run Code Online (Sandbox Code Playgroud)

至少我是这样做的。