mpv ведет себя по-разному, когда используется системной службой systemd.

Вопрос или проблема

Я использую 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), инициализации и доступе к ресурсам, которые могут влиять на работу приложений. В частности:

  1. Окружение пользователя: Запуск от имени пользователя отличается от запуска от имени root или других системных пользователей, что может повлиять на доступность ресурсов или использовать разные конфигурации.

  2. Переменные окружения: При запуске через systemd важно убедиться, что все необходимые переменные окружения установлены. Важной является переменная XDG_RUNTIME_DIR, которая влияет на работу музыкальных и видеоплееров, использующих pipewire или другие мультимедийные системы.

  3. Синтаксические особенности: Службы systemd заключают параметры в кавычки и могут обрабатывать специальные символы вроде & по-другому, что может изменить результат выполнения команды.

Пример

Ваш пример включает rtsp-адрес с символом &. В командной строке без использования кавычек этот символ может интерпретироваться как оператор, передающий выполнение следующей команды, тогда как в systemd, если не использовать кавычки или экранирование для &, команда может быть интерпретирована неправильно. Как было выяснено, различие в работе связано именно с этой особенностью.

Применение

Для успешного разрешения данной проблемы нам необходимо:

  1. Проверить кавычки: Правильно заключите весь путь RTSP в кавычки в конфигурации systemd-сервиса. Ваша финальная конфигурация может включать этот кусок: Environment='MYSTREAM="rtsp://admin:[email protected]:554/channel=1&stream=1.sdp"' или экранирование символа &.

  2. Убедиться в корректности других настроек: Убедитесь, что XDG_RUNTIME_DIR и другие переменные, касающиеся мультимедиа окружения, доступны в нужном формате, чтобы избежать рассинхронизации пулов и кэшей.

  3. Проверить логирование: Обратите внимание на логи MPV и systemd, чтобы отследить другие возможные ошибки или предупреждения.

  4. Рассмотреть запуск от имени пользователя: Если вы можете избежать выполнения от имени root, например, запустить MPV от имени конкретного пользователя, которому доступны все необходимые мультимедийные системы и устройства, это улучшит безопасность и, возможно, стабилизирует работу.

Дополнительные рекомендации

Поскольку работа с видео часто требует доступа к определенным ресурсам, таким как GPU и аудиовыводы, убедитесь в следующем:

  • Права доступа: Проверьте, что пользователь, от имени которого запускается сервис, имеет необходимые права доступа к мультимедийным устройствам.
  • Настройки GPU: При использовании аппаратного декодирования убедитесь, что GPU доступен и корректно настроен.
  • Конфигурация Pipewire или PulseAudio: Убедитесь, что системы для аудио и видео корректно настроены и включают правильные модули и устройства.

Используя системный журнал и, возможно, утилиты для отладки, такие как strace или gdb, можно глубже проанализировать причины возможных аномалий.

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

Оцените материал
Добавить комментарий

Капча загружается...