Вопрос или проблема
Я использую mpv для просмотра моей IP-камеры следующим образом:
mpv --cache=no --fs --fs-screen=current --profile=fast rtsp://admin:[email protected]:554/channel=1&stream=1.sdp?
это работает хорошо и сообщается:
(+) Video --vid=1 (hevc 3840x2160 7.000fps)
(+) Audio --aid=1 (pcm_alaw 1ch 8000Hz)
File tags:
Title: RTSP Session
Используется аппаратное декодирование (vaapi).
Нет видео PTS! Создаём что-то. Используется 7.000000 FPS.
AO: [pipewire] 8000Hz mono 1ch s16
VO: [gpu] 3840x2160 vaapi[nv12]
я вижу видео хорошо
но когда я использую ТОЖЕ самую команду с системой systemd, я получаю:
(+) Video --vid=1 (hevc 704x576 7.000fps)
(+) Audio --aid=1 (pcm_alaw 1ch 8000Hz)
File tags:
Title: RTSP Session
Используется аппаратное декодирование (vaapi).
Нет видео PTS! Создаём что-то. Используется 7.000000 FPS.
AO: [pipewire] 8000Hz mono 1ch s16
VO: [gpu] 704x576 vaapi[nv12]
я вижу видео поток, но размер видео маленький…
я не понимаю, зависит ли это от службы systemd или от mpv…
Моя ОС – Ubuntu 24.04.2
моя служба определена так:
[Unit]
Description=Видеослужба для моей домашней камеры
After=network.target
StartLimitInterval=0
[Service]
Environment=MYSTREAM="rtsp://admin:[email protected]:554/channel=1&stream=1.sdp"
Environment="XDG_RUNTIME_DIR=/run/user/1000"
Type=simple
KillMode=process
User=root
ExecStart=/usr/bin/mpv --cache=no --fs --fs-screen=current --profile=fast $MYSTREAM
TimeoutSec=0
StandardOutput=file:/home/guido/myvideo.log
RemainAfterExit=yes
Restart=no
[Install]
WantedBy=default.target
Что я могу сделать?
Решил сам!
разница между двумя режимами тривиальна и зависит исключительно от использования символа ‘&’ в строке адреса rtsp. в одном случае строка заключена в кавычки, в другом случае – нет!
Ответ или решение
Для решения вопроса о различном поведении MPV при запуске через систему systemd и напрямую в командной строке, начнем с теоретического анализа проблемы. Мы видим, что MPV используется для потокового вещания с IP-камеры через протокол RTSP. При прямом запуске команды в терминале наблюдается корректное отображение видео в разрешении 3840×2160, тогда как при использовании этой же команды внутри systemd-сервиса видео отображается в более низком разрешении 704×576.
Теория
При работе с systemd и запуске приложений через сервисы systemd существуют определенные отличия в окружающем окружении (environment), инициализации и доступе к ресурсам, которые могут влиять на работу приложений. В частности:
-
Окружение пользователя: Запуск от имени пользователя отличается от запуска от имени root или других системных пользователей, что может повлиять на доступность ресурсов или использовать разные конфигурации.
-
Переменные окружения: При запуске через systemd важно убедиться, что все необходимые переменные окружения установлены. Важной является переменная
XDG_RUNTIME_DIR
, которая влияет на работу музыкальных и видеоплееров, использующих pipewire или другие мультимедийные системы. -
Синтаксические особенности: Службы systemd заключают параметры в кавычки и могут обрабатывать специальные символы вроде
&
по-другому, что может изменить результат выполнения команды.
Пример
Ваш пример включает rtsp-адрес с символом &
. В командной строке без использования кавычек этот символ может интерпретироваться как оператор, передающий выполнение следующей команды, тогда как в systemd, если не использовать кавычки или экранирование для &
, команда может быть интерпретирована неправильно. Как было выяснено, различие в работе связано именно с этой особенностью.
Применение
Для успешного разрешения данной проблемы нам необходимо:
-
Проверить кавычки: Правильно заключите весь путь RTSP в кавычки в конфигурации systemd-сервиса. Ваша финальная конфигурация может включать этот кусок:
Environment='MYSTREAM="rtsp://admin:[email protected]:554/channel=1&stream=1.sdp"'
или экранирование символа&
. -
Убедиться в корректности других настроек: Убедитесь, что
XDG_RUNTIME_DIR
и другие переменные, касающиеся мультимедиа окружения, доступны в нужном формате, чтобы избежать рассинхронизации пулов и кэшей. -
Проверить логирование: Обратите внимание на логи MPV и systemd, чтобы отследить другие возможные ошибки или предупреждения.
-
Рассмотреть запуск от имени пользователя: Если вы можете избежать выполнения от имени root, например, запустить MPV от имени конкретного пользователя, которому доступны все необходимые мультимедийные системы и устройства, это улучшит безопасность и, возможно, стабилизирует работу.
Дополнительные рекомендации
Поскольку работа с видео часто требует доступа к определенным ресурсам, таким как GPU и аудиовыводы, убедитесь в следующем:
- Права доступа: Проверьте, что пользователь, от имени которого запускается сервис, имеет необходимые права доступа к мультимедийным устройствам.
- Настройки GPU: При использовании аппаратного декодирования убедитесь, что GPU доступен и корректно настроен.
- Конфигурация Pipewire или PulseAudio: Убедитесь, что системы для аудио и видео корректно настроены и включают правильные модули и устройства.
Используя системный журнал и, возможно, утилиты для отладки, такие как strace
или gdb
, можно глубже проанализировать причины возможных аномалий.
Подводя итог, важно учитывать все факторы взаимодействия между сервисами systemd и окружением пользователя, чтобы приемлемо настраивать мультимедийные приложения для надежной и корректной работы.