gpt4 book ai didi

linux - FFmpeg 手动启动,但在启动时不使用 Systemd

转载 作者:行者123 更新时间:2023-12-02 09:38:44 31 4
gpt4 key购买 nike

在带有官方 Debian 10 镜像的 Raspberry Pi 4 B 4GB 上,我有/home/pi/run.sh 脚本,其中包含以下内容:

#!/bin/bash
ffmpeg -nostdin -framerate 15 -video_size 1280x720 -input_format yuyv422 -i /dev/video0 -f alsa -i hw:Device \
-af acompressor=threshold=-14dB:ratio=9:attack=10:release=1000 -c:a aac -ac 2 -ar 48000 -ab 160k \
-c:v libx264 -pix_fmt yuv420p -b:v 3M -bf 1 -g 20 -flags +ilme+ildct -preset ultrafast \
-streamid 0:0x101 -streamid 1:0x100 -mpegts_pmt_start_pid 4096 -mpegts_start_pid 0x259 -metadata:s:a:0 language="" -mpegts_service_id 131 -mpegts_transport_stream_id 9217 -metadata provider_name="Doesnt matter" -metadata service_name="Doesnt matter" \
-minrate 3500 -maxrate 3500k -bufsize 4500k -muxrate 4000k -f mpegts "udp://@239.1.67.13:1234?pkt_size=1316&bitrate=4000000&dscp=34" -loglevel debug < /dev/null > /tmp/ff3.log 2>&1
脚本从控制台开始,没有问题。它从 USB 声卡获取音频,从 USB 摄像头获取视频,并创建 UDP 流到 IPTV。然后我创建了 Systemd 服务:
[Unit]
Description=Streamer
After=multi-user.target sound.target network.target

[Service]
ExecStart=/home/pi/run.sh
KillMode=control-group
Restart=on-failure
TimeoutSec=1

[Install]
WantedBy=multi-user.target
Alias=streaming.service
重启 Raspberry 后,脚本已经启动,但是 FFmpeg 在日志中出现错误失败时挂起:
cur_dts is invalid st:0 (257) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (256) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:0 (257) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (256) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:0 (257) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (256) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:0 (257) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
cur_dts is invalid st:1 (256) [init:1 i_done:0 finish:0] (this is harmless if it occurs once at the start per stream)
并且不会开始流式传输到 UDP 目标。但是,如果我手动登录 SSH 并发出 systemctl 停止流式传输 然后 systemctl 开始流式传输 ffmpeg 启动成功。启动时服务自动启动有什么不同?
在脚本请求时设置“ sleep 超时”将无济于事。但是,从 FFmpeg 配置中删除音频流似乎可以解决开机自动启动的问题。

最佳答案

TLDR
利用

After=network-online.target
一步一步找出真正的问题。
1. 这个错误告诉我们什么。
github ffmpeg显示错误是在选择输出时。 choose_output函数选择流的输出。
2. 为什么输出没有准备好?
当您尝试通过网络流式传输时,您需要在启动 ffmpeg 之前完全配置网络。
您的 systemd 脚本中有小问题。 network.target 之间有区别和 network-online.target关注 systemd manual for network targets

network.target has very little meaning during start-up.


network-online.target is a target that actively waits until the nework is "up"


现在您会知道为什么您的脚本在启动时无法在 systemd 中运行,但在服务重新启动后它开始运行?
做评论需要更多的澄清。

关于linux - FFmpeg 手动启动,但在启动时不使用 Systemd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62879992/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com