我正在使用命令行中的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选项会出错?
答案 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
至少我是这样做的。