Estamos escribiendo una aplicación para el control remoto del reproductor MPV de RetroOrangePi

Muchos usuarios del centro de medios KODI, que es parte de RetroOrangePi, probablemente notaron que usan un reproductor MPV externo, que, a diferencia del habitual, tiene soporte de decodificación de hardware. Esto le permite reproducir contenido 1080P sin retrasos, pero hay un gran problema: la única forma de controlar el reproductor es a través del teclado. Además, el reproductor ni siquiera tiene una GUI mínima, por lo tanto, qué duración de la película ves y cuánto queda hasta el final, por desgracia, no puedes averiguarlo.

Admito que soy una persona muy perezosa, y es muy inconveniente llevar el teclado conmigo, dado que KODI se controla desde el teléfono. Después de buscar en Google un par de minutos, me sorprendió saber que no hay soluciones listas para el control remoto de MPV desde un teléfono inteligente. Bueno, qué hacer: tienes que escribir tú mismo. Por cierto, resultó que, en el centro de Vitebsk, comprar un teclado inalámbrico de bajo costo para una hora de almuerzo - esa es otra búsqueda.

MPV admite varios lenguajes de secuencias de comandos, uno de ellos es Lua. En Github, encontré el proyecto mpv-network-command , escrito en Lua y que le permite controlar un mínimo de funciones MPV utilizando comandos enviados a través de UDP. Después de asegurarme de que funciona, durante la pausa para el almuerzo escribí una aplicación simple que implementaba la funcionalidad más primitiva; de hecho, le permitía pausar, iniciar la reproducción desde la pausa y cerrar el reproductor.


Se veía algo así.

Para poder rebobinar el video, así como ver la barra de progreso, tuve que modificar el script original agregando la siguiente función:

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 

Lo curioso es que el código que procesa los datos entrantes desde el costado del teléfono resultó ser mucho más engorroso:

Y esto todavía no tiene un código de temporizador
  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()) } } 


El resultado es este:


Los códigos fuente, así como apk, están en el github .

Te advierto de inmediato: puede haber ciertos errores.

La principal desventaja es que necesita una IP fija para el teléfono en su red local en la que se ejecuta OrangePi. Es necesario para que el script sepa dónde enviarle información sobre el archivo que se está reproduciendo. La forma más fácil: en la configuración del servidor DHCP de su enrutador, especifique dar los mismos dispositivos IP con la dirección MAC del teléfono.

Tampoco hay elementos de seguridad: cualquier usuario en su red puede pausar el video o cerrar el reproductor, conociendo la IP del centro de medios. Es cierto, para averiguar qué se reproduce y si se reproduce, no.

Por cierto, el uso del intercambio de datos a través de UDP sin ninguna confirmación da lugar a un efecto secundario: dado que recibir datos entrantes del reproductor gira en una secuencia separada, puede pausar / cerrar el reproductor incluso si el script del servidor no indica la dirección IP correcta de su teléfono. Lo principal es que conozca la IP de su centro de medios.

Instalación

Vaya a Escritorio RetroOrangePi. Primero necesitas instalar Lua y LuaSocket.

 sudo apt-get install lua5.1 luasocket 

Luego vaya al directorio /home/pi/.config/mpv/ y cree el directorio lua allí.

En lua, copie server.lua.

Abra server.lua con el mismo nano y en línea

 conn_up:sendto(title.."$"..length.."$"..pos, "192.168.100.168", 756); 

reemplace la dirección IP con la dirección de su teléfono.

Guarde y reinicie OrangePi.

Instala la aplicación en tu teléfono. El apk ensamblado se encuentra en Github. Ejecútelo, vaya a Configuración. Configure allí la IP de su centro de medios y el puerto 755. Haga clic en Guardar.

Todo se puede usar.

Source: https://habr.com/ru/post/es423765/


All Articles