MYCSS

17 квітня 2020 р.

Керування плеєром MPV за допомогою API JSON

Є багатоплатформовий відео плеєр з відкрити кодом - MPV.
Все що він може і як цим керувати описано в офіційній документації.
Є задача - керувати цим плеєром коли він запушений на віддаленому екрані.
Один з варіантів керування це використати JSON-based IPC протокол.
У документації є приклади, тому на їх основі запускаю плеєр в ОС Ubuntu.

Початковий запуск плеера

mpv --idle --loop-playlist --fullscreen --geometry=800x600 --input-ipc-server=/tmp/mpvsocket 
В такому режимі плеєр загущений у режимі очкування команд, без активації інтерфейсу.
Інший варіант це запустити з статичним зображенням, наприклад логотипом, з нескінченим часом показу .
mpv LOGO.PNG --loop-playlist --image-display-duration=inf --alpha=no --fullscreen --geometry=800x600 --input-ipc-server=/tmp/mpvsocket

Плеєр MPV в режимі очікування

Керування плеєром

Для керування плеєром буду використовувати простий скрипт сценарію BASH, для з'єднання через SOCKET використовую програму socat.
sudo apt install socat
Простий варіант послати команду до плеєра це:
echo ${COMMAND} | socat - /tmp/mpvsocket
COMMAND='{ "command": ["get_property", "playback-time"] }' 
echo ${COMMAND} | socat - /tmp/mpvsocket
Результат буде в JSON форматі:
{"data":190.482000,"error":"success"}
Тому для обробки відповіді в форматі JSON встановлюю програму jq.
sudo apt install jq
Варіант з функцією багаторазового використання з обробкою результату:
function cmd()
{
 res=$(echo ${1} | socat - /tmp/mpvsocket)
 error=$(echo "${res}" | jq -r '.error')
 if [ "${error}" == "success" ] ;then
  data=$(echo "${res}" | jq -r '.data')
  echo "${data}"
 fi
}
Тпер запит буде виглядати так:
cmd '{ "command": ["get_property", "playback-time"] }' 
Відповідь буде:
190.482000

Встановлення playlist для початку програвання

Перелік файлів котрі потрібно програвати зазвичай формується у файл "playlist.m3u".
Для передачі команди плеєра:
PLAYLISTFILE=playlist.m3u
cmd "{ \"command\": [\"loadlist\", \"${PLAYLISTFILE}\",\"replace\"] }"

Додавання файлу до списку програвання

URLMEDIA=somemedia.mp4
cmd '{ "command": ["loadfile","'${URLMEDIA}'","append-play"] }' 

Додавання файлу до списку програвання з власними параметрами відеофільтрів

Наприклад, відео "somemedia.mp4" має довжину 40 сек. Додаю фільтр fade, де є параметр початку - IN, та  на завершенні - OUT. Так на початку відео ефект FADE-IN в позиції 0 сек, довжина 1 сек. Завершується відео ефект FADE-OUT в позиції 39 сек, довжина 1 сек.
cmd '{ "command": ["loadfile","'${URLMEDIA}'","append-play", "vf-set=\"fade=t=in:d=1\",vf-add=\"fade=out:st=39:d=1\""] }' 

Важлива примітка.  У пердачі параметрів фільтра "vf-set=\"fade=t=in:d=1\""  передавати у екранованно .

Також можна прослуховувати значення стану плеєра

while IFS= read -r line
do
 event=$(echo "$line" | jq -r '.event')
 case "${event}" in
   'end-file')
      echo "${event}"
      echo playlist-playing-pos $(cmd '{ "command": ["get_property","playlist-playing-pos"] }')
   ;;
   'file-loaded')
       echo "${event}"
       echo "FN:" $(cmd '{ "command": ["get_property", "filename"] }')
   ;;
   *)
       echo "${event}"
   ;;
 esac
done < <(( socat - /tmp/mpvsocket ))

і таким чином реагувати на стан плеєра і робити власні команди.



Немає коментарів:

Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready