准确的FFmpeg捕获开始时间

时间:2014-01-21 15:46:40

标签: 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

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

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

我的下一个想法是使用ffmpegs timestamp选项。根据文档(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])
     

如果值为“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

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

  

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

     

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

     

打开输出文件时出错:出现错误编号-22

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

有人能建议一种准确确定捕获开始时间的方法吗?

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

1 个答案:

答案 0 :(得分:-1)

将您的PC操作系统时间设置为YYYYmmdd时间,如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

至少我是这样做的。