Estamos escrevendo um pedido de controle remoto do MPV player da RetroOrangePi

Muitos usuários do centro de mídia KODI, que faz parte do RetroOrangePi, provavelmente notaram que usam um MPV player externo, que, diferentemente do normal, possui suporte para decodificação de hardware. Isso permite que você reproduza conteúdo 1080p sem atrasos, mas há um grande problema - a única maneira de controlar o player é através do teclado. Além disso - o player nem sequer tem uma GUI mínima, então qual duração do filme você assiste e quanto resta até o fim - infelizmente, você não pode descobrir.

Admito que sou uma pessoa muito preguiçosa e é muito inconveniente carregar o teclado comigo, já que o próprio KODI é controlado pelo telefone. Depois de pesquisar no Google alguns minutos, fiquei surpreso ao saber que não existem soluções prontas para o controle remoto de MPV em um smartphone. Bem, o que fazer - você precisa se escrever. Aliás, no centro de Vitebsk, compre um teclado sem fio barato por 1 hora de intervalo para o almoço - essa é outra busca.

O MPV suporta várias linguagens de script, uma delas é Lua. No Github, encontrei o projeto mpv-network-command , escrito em Lua e que permite controlar um mínimo de funções MPV usando comandos enviados via UDP. Depois de me certificar de que funcionava, durante o intervalo do almoço, escrevi um aplicativo simples que implementava a funcionalidade mais primitiva - na verdade, permitia fazer uma pausa, iniciar a reprodução a partir da pausa e fechar o player.


Parecia algo assim.

Para poder retroceder o vídeo, bem como ver a barra de progresso, tive que modificar o script original adicionando a seguinte função:

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 

O engraçado é que o código que processa os dados recebidos do lado do telefone acabou sendo muito mais complicado:

E isso ainda está sem um 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()) } } 


O resultado é este:


Os códigos-fonte e o apk estão no github .

Eu te aviso imediatamente - pode haver alguns erros.

A principal desvantagem é que você precisa de um IP fixo para o telefone na rede local em que o OrangePi é executado. É necessário que o script saiba para onde enviar informações sobre o arquivo que está sendo reproduzido. A maneira mais fácil - nas configurações do servidor DHCP do seu roteador, especifique para fornecer os mesmos dispositivos IP com o endereço MAC do telefone.

Também não há elementos de segurança - qualquer usuário da sua rede pode pausar o vídeo ou fechar o player, sabendo o IP do media center. É verdade que descobrir o que é reproduzido e se é ou não reproduzido - não.

A propósito, o uso de troca de dados via UDP sem qualquer confirmação causa um efeito colateral - como o recebimento de dados do player gira em um fluxo separado, você pode pausar / fechar o player, mesmo que o script do servidor não indique o endereço IP correto do seu telefone. O principal é que você saberia o IP do seu media center.

Instalação

Vá para a área de trabalho RetroOrangePi. Primeiro você precisa instalar o Lua e o LuaSocket.

 sudo apt-get install lua5.1 luasocket 

Então vá para o diretório /home/pi/.config/mpv/ e crie o diretório lua lá.

Em lua, copie server.lua.

Abra server.lua com o mesmo nano e alinhado

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

substitua o endereço IP pelo endereço do seu telefone.

Salve e reinicie o OrangePi.

Instale o aplicativo no seu telefone. O apk montado encontra-se no Github. Execute-o, vá para Configurações. Defina lá o IP do seu media center e porta 755. Clique em Salvar.

Tudo pode ser usado.

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


All Articles