我用装有 Raspbian、FFmpeg/FFplay 和 v4l2 的 Raspberry Pi 制作了一个网络摄像头查看器。我有一个 udev 规则,当网络摄像头插入时,会自动启动 FFmpeg 流并调出 FFplay 进行查看,我还有另一个 udev 规则,当网络摄像头拔出时,会关闭 FFplay。
这在大多数情况下都有效,但唯一的问题是,有时 FFplay 不会关闭,而是会进入可中断的睡眠状态几分钟后再关闭。我需要它立即关闭。我运行的strace
时候发生了这种情况,它似乎在等待 IO 操作。即使发送信号,kill
它仍然会在几分钟内不会关闭。
以下是输出内容的片段strace
:
clock_gettime(CLOCK_MONOTONIC, {tv_sec=7465, tv_nsec=164876860}) = 0
poll([{fd=4, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
poll([{fd=4, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
nanosleep({tv_sec=0, tv_nsec=10000000}, 0xbeb96948) = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=7465, tv_nsec=179573716}) = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=7465, tv_nsec=180091711}) = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=7465, tv_nsec=180544707}) = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=7465, tv_nsec=182013692}) = 0
write(2, "7465.10 M-V: 0.024 fd= 3 aq= "..., 69) = 69
poll([{fd=4, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
poll([{fd=4, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
nanosleep({tv_sec=0, tv_nsec=10000000}, 0xbeb96948) = 0
有什么办法可以让 FFplay 在每次拔掉网络摄像头时立即关闭?
答案1
不知道具体是哪个部分修复了这个问题,但我删除了 FFmpeg,而是用 FFplay 播放网络摄像头。当网络摄像头拔掉时,我还运行了以下脚本:
#!/bin/bash
sudo pkill -15 ffplay
sudo pkill -9 ffplay
现在拔下网络摄像头时它似乎不会冻结那么长时间。