我正在尝试在 Debian 系统上运行(迪特皮在树莓派):
v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0
但尽管添加了,它仍在命令控制台中运行& 否认
我也尝试过& 工作但好像什么都没发生一样,它一直在命令控制台中运行,而不是在后台运行。
我注意到的是v4l2rtsp服务器运行多个进程,我想这可能是那里的问题。
[1]+ Running v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0 &
dietpi@DietPi:~$ log level:500
[NOTICE] /home/dietpi/v4l2rtspserver/main.cpp:297
Version: 0.3.3-8-gb007df2 live555 version:2022.04.26
[NOTICE] /home/dietpi/v4l2rtspserver/src/V4l2RTSPServer.cpp:37
Create V4L2 Source.../dev/video0
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:133
driver:bm2835 mmal capabilities:85200005 mandatory:4000001
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:136
/dev/video0 support capture
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:138
/dev/video0 support read/write
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:139
/dev/video0 support streaming
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:225
/dev/video0:H264 size:1920x1080 bufferSize:2088960
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:246
fps:1/30
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2Device.cpp:247
nbBuffer:1
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2MmapDevice.cpp:49
Device /dev/video0
[NOTICE] /home/dietpi/v4l2rtspserver/v4l2wrapper/src/V4l2MmapDevice.cpp:73
Device /dev/video0 nb buffer:10
[NOTICE] /home/dietpi/v4l2rtspserver/src/V4l2RTSPServer.cpp:62
Create Source .../dev/video0
[NOTICE] /home/dietpi/v4l2rtspserver/src/V4L2DeviceSource.cpp:96
begin thread
[NOTICE] /home/dietpi/v4l2rtspserver/inc/BaseServerMediaSubsession.h:49
format:video/H264
[NOTICE] /home/dietpi/v4l2rtspserver/inc/V4l2RTSPServer.h:80
我只用过Linux很短的一段时间,我没能找出问题所在。发生了什么事?谢谢。
编辑:
谢谢用户1686的解决方案现在它在后台运行没有问题,但我试图让它在系统启动时运行脚本,但我做不到。我已经添加了/etc/systemd/system/v4l2rtsp.service:
[Unit]
Description=prueba
After=dev-video0.device
[Service]
Type=exec
User=dietpi
ExecStart=/home/dietpi/script_v4l2rtsp.sh
[Install]
WantedBy=multi-user.target
然后我保存了文件,并且输入了此命令,但是流没有启动:
sudo systemctl start v4l2rtsp
我也尝试过让它像这样在启动时运行,但是也没有结果:
sudo systemctl enable v4l2rtsp
尽管如果我独立运行该文件,它也能完美运行:
dietpi@DietPi:~$ sudo bash script_v4l2rtsp.sh
[1]+ Running v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0 &> /dev/null &
dietpi@DietPi:~$
那可能发生吗?
答案1
它是在后台运行 – 您可以看到您立即返回到 shell 提示符 ( dietpi@DietPi:~$
)。使用运算符时肯定会发生这种&
情况,程序无法绕过这一点。
然而,&
这只会让 shell 不再等待进程运行完毕,但实际上并没有分离程序的输出从它运行的终端。 (也没有disown
,它只是告诉 shell 不要在注销时终止后台作业。)因此,您仍然可以与前台的 shell 进行交互,但是 shell 的输出与后台进程输出交错。
要丢弃输出,请使用以下命令重定向它>/dev/null 2>&1
:
$ v4l2rtspserver ..... >&/dev/null &
$ disown
但实际上你不应该首先做这些——你应该将 v4l2rtspserver 配置为服务。大多数 Linux 发行版都带有某种服务管理器(例如 systemd 或 Upstart),用于启动和管理后台任务,定义一个可以通过这种方式控制的新服务只需几行代码即可。
例如,Debian 使用 systemd,其中基本服务(/etc/systemd/system/v4l2rtsp.service
)定义如下:
[Unit]
Description=Webcam RTSP server
After=dev-video0.device
[Service]
Type=exec
User=dietpi
ExecStart=v4l2rtspserver -H 1080 -W 1920 -F 30 -P 8555 /dev/video0
[Install]
WantedBy=multi-user.target
这将允许您使用 控制服务systemctl start v4l2rtsp
,甚至使其在启动时自动启动systemctl enable
。