AlexxIT / YandexStation

Управление Яндекс.Станцией и другими устройствами умного дома с Алисой из Home Assistant
https://t.me/AlexxIT_SmartHome
MIT License
1.32k stars 122 forks source link

MPD падает через несколько секунд воспроизведения, инициированного станцией #376

Open WiseLord opened 1 year ago

WiseLord commented 1 year ago

При переключении с воспроизведения со станции на "стриминг" на MPD, воспроизведение длится несколько (10..15) секунд, после чего MPD "умирает". В течение этих нескольких секунд другие клиенты MPD тоже уже не имеют с ним связи, даже пока ещё сам сервер ещё играет.

configuration.yaml:

media_player:
  - platform: mpd
    host: 192.168.100.100
    name: Home MPD

Вывод самого MPD:

wiselord@home / $ mpd -v --no-daemon /home/wiselord/.local/share/cantata/mpd/mpd.conf
config_file: loading file /home/wiselord/.local/share/cantata/mpd/mpd.conf
Jun 22 00:15 : path: SetFSCharset: fs charset is
Jun 22 00:15 : vorbis: Xiph.Org libVorbis 1.3.7
Jun 22 00:15 : opus: libopus 1.3.1
Jun 22 00:15 : hybrid_dsd: The Hybrid DSD decoder is disabled because it was not explicitly enabled
Jun 22 00:15 : simple_db: reading DB
Jun 22 00:15 : curl: version 8.0.1
Jun 22 00:15 : curl: with OpenSSL/1.1.1u
Killed

Конфиг MPD (/home/wiselord/.local/share/cantata/mpd/mpd.conf):

music_directory     "/home/wiselord/.local/share/cantata/mpd/music/"
playlist_directory  "/home/wiselord/.local/share/cantata/mpd/playlists"
sticker_file        "/home/wiselord/.local/share/cantata/mpd/sticker.sql"
db_file             "/home/wiselord/.cache/cantata/mpd/tag_cache"
pid_file            "/home/wiselord/.cache/cantata/mpd/pid"
state_file          "/home/wiselord/.cache/cantata/mpd/state"
log_file            "/home/wiselord/.cache/cantata/mpd/log_file"

zeroconf_enabled    "yes"

bind_to_address     "0.0.0.0"
bind_to_address     "/home/wiselord/.local/share/cantata/mpd/socket"

metadata_to_use     "artist,album,title,track,name,genre,date"

input {
    plugin "curl"
}

audio_output { 
  type "pulse"
  name "Output"
}

#mixer_type         "software"
audio_buffer_size   "8192"
filesystem_charset  "UTF-8"

Лог /home/wiselord/.cache/cantata/mpd/log_file MPD на хосте (192.168.100.100), с момента переключения выхода со "Станция" на "Home MPD" в карточке mini-media-player:

Jun 22 00:16 : client: [3] process command "status"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [3] process command "status"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [2] process command "status"
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [2] process command "currentsong"
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [2] process command "idle "database""
Jun 22 00:16 : client: [2] command returned 1
Jun 22 00:16 : client: [2] process command "clear"
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [0] process command "status"
Jun 22 00:16 : client: [0] command returned 0
Jun 22 00:16 : client: [3] process command "status"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [0] process command "plchanges "40""
Jun 22 00:16 : client: [0] command returned 0
Jun 22 00:16 : client: [3] process command "plchangesposid "40""
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [3] process command "playlistinfo"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [3] process command "status"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [0] process command "idle"
Jun 22 00:16 : client: [0] command returned 1
Jun 22 00:16 : client: [2] process command "add "http://192.168.100.110:8123/api/yandex_station/lb000000000000168684000092be684d/d75f68a5d4b5dfd5b79daf297baa47ad.mp3""
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [4] process command "idle"
Jun 22 00:16 : client: [4] command returned 1
Jun 22 00:16 : client: [0] process command "status"
Jun 22 00:16 : client: [0] command returned 0
Jun 22 00:16 : client: [3] process command "playlistinfo"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [0] process command "plchanges "41""
Jun 22 00:16 : client: [0] command returned 0
Jun 22 00:16 : client: [3] process command "status"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [0] process command "idle"
Jun 22 00:16 : client: [0] command returned 1
Jun 22 00:16 : client: [4] process command "idle"
Jun 22 00:16 : client: [4] command returned 1
Jun 22 00:16 : client: [2] process command "play"
Jun 22 00:16 : playlist: play 0:"http://192.168.100.110:8123/api/yandex_station/lb000000000000168684000092be684d/d75f68a5d4b5dfd5b79daf297baa47ad.mp3"
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [3] process command "currentsong"
Jun 22 00:16 : client: [3] command returned 0
Jun 22 00:16 : client: [2] process command "status"
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [2] process command "currentsong"
Jun 22 00:16 : client: [2] command returned 0
Jun 22 00:16 : client: [2] process command "readpicture "http://192.168.100.110:8123/api/yandex_station/lb000000000000168684000092be684d/d75f68a5d4b5dfd5b79daf297baa47ad.mp3" "0""
Jun 22 00:16 : decoder_thread: probing plugin mad
Jun 22 00:16 : decoder: audio_format=44100:24:2, seekable=true
Jun 22 00:16 : output: opened "Output" (pulse) audio_format=44100:24:2

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

Такое ощущение, что передача в MPD ссылки с mp3 каким-то образом блокирует основной цикл приложения MPD, так что он теряет связь со всеми клиентами и через некоторое время самоубивается.

P.S. Версии всех интеграций и самого HomeAssistant последние на сегодняшний день.

P.P.S. Такое поведение наблюдаю как у MPD на ПК (Gentoo Linux), так и у MPD на OrangePi One (Buildchroot сборка с MPD на борту, в корпусе музыкального центра).

P.P.P.S. Поэкспериментировал ещё немного.

Добавляю в mpd в плейлист два URL-а:

Быстро переключаюсь между этими файлами в MPD - и оно зависает на первом URL-е.

WiseLord commented 1 year ago

Ещё вдогонку несколько экспериментов, показывающих, что проблема, скорее всего в <HASS_URL>/api/yandex_station/.

Если взять те же ссылки на один и тот же аудиофал: [1] - сгенерированный api/yandex_station и [2] - тот же файл на своём веб-сервере:

  1. VLC

    • ссылку [2] открывает всегда, без сбоев
    • ссылку [1] открывает через раз.
  2. ffplay / mpv

    • ссылку[2] открывают всегда
    • ссылку [1] не могут открыть вообще
  3. wget

    • ссылку [2] скачивает без проблем в любых ситуациях
    • ссылку [1], если прерывать закачку, скачивает через раз. Если давать предыдущей закачке закончиться, то следующая идёт нормально:
wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:19--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.1'

cbc088d2123269e24537ddd7e25e8191.m 100%[=============================================================>]  10.50M  5.84MB/s    in 1.8s    

2023-06-22 18:16:21 (5.84 MB/s) - 'cbc088d2123269e24537ddd7e25e8191.mp3.1' saved [11015314/11015314]

wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:21--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.2'

cbc088d2123269e24537ddd7e25e8191.m 100%[=============================================================>]  10.50M  5.14MB/s    in 2.0s    

2023-06-22 18:16:23 (5.14 MB/s) - 'cbc088d2123269e24537ddd7e25e8191.mp3.2' saved [11015314/11015314]

wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:24--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.3'

cbc088d2123269e24537ddd7e25e8191.m 100%[=============================================================>]  10.50M  4.66MB/s    in 2.3s    

2023-06-22 18:16:26 (4.66 MB/s) - 'cbc088d2123269e24537ddd7e25e8191.mp3.3' saved [11015314/11015314]

wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:27--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.4'

cbc088d2123269e24537ddd7e25e8191.m 100%[=============================================================>]  10.50M  5.49MB/s    in 1.9s    

2023-06-22 18:16:29 (5.49 MB/s) - 'cbc088d2123269e24537ddd7e25e8191.mp3.4' saved [11015314/11015314]

wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:32--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.5'

cbc088d2123269e24537ddd7e25e8191.m  32%[===================>                                          ]   3.46M  5.76MB/s               ^C
wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:34--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... ^C
wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:36--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.6'

cbc088d2123269e24537ddd7e25e8191.m  50%[==============================>                               ]   5.25M  5.24MB/s               ^C
wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:38--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... ^C
wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:40--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11015314 (11M) [audio/mpeg]
Saving to: 'cbc088d2123269e24537ddd7e25e8191.mp3.7'

cbc088d2123269e24537ddd7e25e8191.m  84%[===================================================>          ]   8.88M  5.54MB/s               ^C
wiselord@hp15 /tmp $ wget http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
--2023-06-22 18:16:43--  http://192.168.100.110:8123/api/yandex_station/ff98f029ba8cd32b997308b0/cbc088d2123269e24537ddd7e25e8191.mp3
Connecting to 192.168.100.110:8123... connected.
HTTP request sent, awaiting response... ^C

В примере выше я первым нескольким закачкам даю завершиться нормально. Всё идёт хорошо. Но если (чуть дальше) я прерываю процесс загрузки, то следующая уже завершиться не может.

Такое чувство, что через API yandex_station один и тот же файл одновременно раздаваться двум клиентам (первый - прерванный, второй - новый) не может. Отсюда и работа "через раз", и зависание mpd (хотя это уже и частично его проблема.

Видимо, при переключении источника со "Станция" на "MPD" как раз такая ситуация и происходит - поток одновременно запрашивается двумя клиентами.

WiseLord commented 1 year ago

Ещё попробовал воспроизвести проблему на x86 варианте HomeAssistant - и здесь всё нормально. Падений нет, файл по ссылке доступен одновременно разным клиентам..

Похоже, просто производительности не хватает на Banana PI (сервер с HomeAssistant Core).

WiseLord commented 1 year ago

Проапгрейдил железо сервера (Banana Pi M2 Zero 512MB RAM => Orange Pi 3 LTS 2GB RAM) - проблема не воспроизводится.

В целом всё работает, кроме (частично) синхронизации воспроизведения между станцией и MPD.

Если поставить воспроизведение колонки на паузу или стоп (в том числе голосом) - MPD делает то же самое синхронно (с некоторой задержкой). Но если же сказать колонке "Следущий трек" или нажать кнопку в интерфейсе - она переключается, но MPD продолжает играть старый.

AlexxIT commented 10 months ago

Больше склоняюсь к глюкам самого MPD