Многие пользователи медиацентра KODI, входящего в состав RetroOrangePi, наверняка заметили, что он использует внешний MPV-плеер, который, в отличие от стандартного, имеет поддержку аппаратного декодирования.
Это позволяет воспроизводить контент 1080P без задержек, но есть большая проблема — управлять плеером можно только с помощью клавиатуры.
Более того, у плеера нет даже минимального графического интерфейса, поэтому сколько времени вы смотрите фильм и сколько времени осталось до конца, увы, узнать невозможно.
Признаюсь, я очень ленивый человек, и таскать с собой клавиатуру очень неудобно, учитывая, что сам KODI управляется с телефона.
Погуглив пару минут, я с удивлением узнал, что готовых решений для удаленного управления минивэном со смартфона не существует. Ну, что ты можешь сделать? Вам придется написать это самостоятельно.
Кстати, как оказалось, в центре Витебска купить недорогую беспроводную клавиатуру во время часового обеденного перерыва – настоящий квест.
MPV поддерживает несколько языков написания скриптов, один из них — Lua. Я нашел проект на Github mpv-сетевые команды , написанный на Lua и позволяющий управлять минимумом функций MPV с помощью команд, передаваемых по UDP.
Убедившись, что это работает, во время обеденного перерыва я написал простое приложение, реализовавшее самый примитивный функционал — по сути, оно позволяло поставить на паузу, запустить воспроизведение с паузы и закрыть плеер.
Это выглядело примерно так.
Чтобы иметь возможность перематывать видео, а также видеть индикатор выполнения, мне пришлось изменить исходный скрипт, добавив следующую функцию:
function send_name()
local title =mp.get_property("media-title");
local length = math.floor(mp.get_property("length"));
local pos=math.floor(mp.get_property("time-pos"));
conn_up:sendto(title."$".
length."$".
pos, "192.168.100.168", 756);
end
Самое смешное, что код, обрабатывающий входящие данные с телефона, оказался гораздо более громоздким: И это без кода таймера thread {
// this thread receives incoming massages from MPV and updates views accordingly to received info
try {
chnl.socket().
bind(InetSocketAddress(756))
chnl.configureBlocking(false)
var timerStarted: Boolean = false
var timer = Timer()
while (true) {
var buf = ByteBuffer.allocate(1024)
buf.clear()
var last_pos = ""
if (!timerStarted) {
timer = Timer()
timer.schedule(myTimerTask(textView5, textView6, textView4, seekBar3), 2000, 1000)
//this timer will clear views, if no info received in last 2 seconds
timerStarted = true
}
if (chnl.isOpen) {
if (chnl.receive(buf) != null) {
if (timerStarted) {
timer.cancel()
timerStarted = false
}
var data_length = buf.position()
buf.flip()
var str = String(buf.array(), 0, data_length, UTF_8)
Log.d("received data", str)
val arr = str.split("$")
if (arr.size >= 3) {
media_length = arr[1].
toInt()
runOnUiThread {
if (textView4.text != arr[0]) textView4.text = arr[0]
if (last_pos != arr[1]) {
last_pos = arr[1]
textView6.text = convertSecsToFullTime(last_pos)
}
if (!blockview) {
textView5.text = convertSecsToFullTime(arr[2])
seekBar3.max = arr[1].
toInt()
seekBar3.progress = arr[2].
toInt()
}
}
}
}
}
}
} catch (e: Exception) {
runOnUiThread {
Toast.makeText(this, e.message, Toast.LENGTH_SHORT).
show()
}
Log.d("In MPVremote", e.message.toString())
}
}
Результат был такой:
Исходные коды, а также apk находятся по адресу Гитхаб .
Сразу предупреждаю - баги обязательно могут быть.
Основным недостатком является то, что для телефона в локальной сети, где работает OrangePi, требуется фиксированный IP-адрес.
Это необходимо для того, чтобы скрипт знал, куда отправлять информацию о воспроизводимом файле.
Самый простой способ — указать в настройках DHCP-сервера вашего роутера, чтобы устройствам с MAC-адресом телефона выдавался один и тот же IP. Элементов безопасности также нет — любой пользователь вашей сети сможет поставить видео на паузу или закрыть плеер, зная IP медиацентра.
Правда, нет возможности узнать, что воспроизводится и воспроизводится ли вообще.
Кстати, использование обмена данными по UDP без какого-либо подтверждения создает побочный эффект - поскольку получение входящих данных от плеера происходит в отдельном потоке, вы можете приостановить/снять паузу и закрыть плеер, даже если вы не указали правильный IP ваш телефон на скрипт сервера.
Главное, чтобы вы знали IP своего медиацентра.
Монтаж
Перейдите на рабочий стол RetroOrangePi. Сначала вам нужно установить Lua и LuaSocket. sudo apt-get install lua5.1 luasocket
Затем перейдите в каталог /home/pi/.
config/mpv/ и создайте там каталог lua.
В lua скопируйте server.lua.
Откройте server.lua с тем же nano и в строке conn_up:sendto(title."$".
length."$".
pos, "192.168.100.168", 756); замените IP-адрес адресом вашего телефона.
Сохраните и перезагрузите OrangePi. Установите приложение на свой телефон.
Собранный APK находится на GitHub. Запустите его, зайдите в Настройки.
Установите там IP вашего медиацентра и порт 755. Нажмите «Сохранить».
Вот и все, можете использовать.
Теги: #Разработка Android #Сделай сам или сделай сам #Разработка мобильных приложений #Kotlin #kodi #mpv #RetroOrangePi #orangepi
-
Как Работает Ваш Принтер?
19 Dec, 24 -
В Лондоне Теперь Доступен Бесплатный Wi-Fi
19 Dec, 24 -
Нексус Один. Презентация Началась
19 Dec, 24