【问题标题】:Accurate FFmpeg capture start time准确的 FFmpeg 捕获开始时间
【发布时间】:2014-02-11 07:43:36
【问题描述】:

我正在使用命令行中的 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 时间戳选项。根据文档(http://www.ffmpeg.org/ffmpeg.html):

'-timestamp时间(输出)'

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])

如果值为“现在”,则需要当前时间。时间为当地时间,除非“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 似乎不是这样的:

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

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

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

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

谁能提出一种准确确定捕获开始时间的方法?

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

【问题讨论】:

  • 所以你想计算出第一帧的挂钟时间?我想您可以将时间戳添加到帧中作为叠加层...stackoverflow.com/q/12293853/32453 可能是相关的
  • @rogerdpack '所以你想弄清楚第一帧的挂钟时间?' - 是的,准确的 - 精确到几帧。该命令是从一个脚本调用的,该脚本需要知道这个时间以进行后续处理。在图像上覆盖时间并没有帮助,因为脚本无法使用它。
  • 没有太多的想法,尽管您可以添加“showinfo”过滤器,然后轮询以查看何时将第一帧添加到其输出文件中...我可能建议重新询问在 FFmpeg 邮件列表中...
  • 当 FFmpeg 首次启动时,它会吐出诸如“开始时间”之类的流信息,可能会使用它...
  • 嗨@Adam。我正在尝试实现类似的目标:我录制音频并希望有时间戳,至少在开始时。你成功了吗?

标签: ffmpeg


【解决方案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

至少我是这样做的。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多