FFmpeg запускается вручную, но не с Systemd при загрузке - PullRequest
4 голосов
/ 13 июля 2020

На Raspberry Pi 4 B 4GB с официальным образом Debian 10 у меня есть скрипт /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. Но, если я вручную войду в S SH и выдам systemctl stop streaming , а затем systemctl start streaming Ffmpeg запустится успешно. Чем отличается автозапуск службы при загрузке?

Установка «тайм-аута сна» при загрузке скрипта не поможет. Однако удаление аудиопотока из конфигурации FFmpeg решает проблему автозапуска при загрузке.

1 Ответ

2 голосов
/ 16 июля 2020

TL; DR

используйте

After=network-online.target

Шаг за шагом выясняйте реальную проблему.

1. О чем говорит нам эта ошибка.

github ffmpeg показывает, что ошибка возникает при выборе вывода. choose_output функция выбирает вывод для потока.

2. Почему вывод не готов?

Поскольку вы пытаетесь передавать поток по сети, вам потребуется полностью сконфигурированная сеть перед запуском ffmpeg.

У вас небольшая проблема в вашем сценарии systemd. существует разница между network.target и network-online.target

следуйте руководству systemd для сетевых целей

network.target имеет очень мало значения во время запуска.

network-online.target - это цель, которая активно ожидает, пока nework не «заработает».

Теперь вы узнаете, почему ваш скрипт не работал в systemd при запуске, но после перезапуска службы он начал работать?

Прокомментируйте, если требуются дополнительные разъяснения.

...