我正在尝试用树莓派录制视频,并在断电的情况下尽可能多地保存视频(亚秒级分辨率)。
我习惯-f segment
以 100ms 为单位保存编码流,希望除了被中断(断电)的片段之外的所有片段都能保存在内存中。不幸的是,断电时,所有目标文件(output_0001.mp4、output_0002.mp4 等)都已创建,但为空。
为了立即将文件保存到磁盘,我添加了-strftime 1
允许将输出文件名格式化为时间的选项。这似乎是触发立即保存文件的(唯一?)方法,这似乎很奇怪,但它确实有效 - 直到我尝试使用小于 1 秒的片段。问题似乎是格式字符串%d
,以前在我的输出文件名中添加了序列号,现在表示“天”(即日期),最小分辨率时间格式字符串是%S
秒。我看到%f
有人建议在某个地方使用更小的分辨率,但它只打印“%f”。
结果是,segment
ffmpeg 的 ation 部分确实会创建 100ms 段并立即将它们保存到磁盘,但该strftime
功能为输出文件提供了每秒仅更改一次的名称,因此所有中间文件都会被覆盖。
下面是失败命令的示例。如果没有该-strftime
选项,这将创建不错的段,但不会立即将它们保存到磁盘。
libcamera-vid --flush \
--framerate ${FRAMERATE} \
--width ${WIDTH} \
--height ${HEIGHT} \
-n \
-t ${TIMEOUT} \
--codec yuv420 \
-o - |
ffmpeg \
-fflags nobuffer \
-strict experimental \
-loglevel debug \
-flags low_delay \
-f rawvideo \
-pix_fmt yuv420p \
-s:v ${WIDTH}x${HEIGHT} \
-r ${FRAMERATE} \
-i - \
-c:v h264_v4l2m2m \
-f segment \
-segment_time 0.1 \
-segment_format mp4 \
-reset_timestamps 1 \
-strftime 1 \
-b:v ${ENCODING_BITRATE} \
-g 1 \
"output_%04d.mp4"
问题:
除了触发立即保存之外,还有其他方法吗-strftime
?或者是否有一种机制可以将更精细的分辨率格式字符串提供给输出文件名?
答案1
我在 ffmpeg 之外找到了一个解决方案 - 并行运行一个不断调用的 bash 脚本sync
在while
循环中。据我所知,这会将最近的“文件系统内容”刷新到实际磁盘。