我们正在编写一个RetroOrangePi的MPV播放器的远程控制应用程序

作为RetroOrangePi一部分的KODI媒体中心的许多用户可能注意到他们使用的是外部MPV播放器,该播放器与常规播放器不同,它具有硬件解码支持。 这使您可以无延迟地播放1080P内容,但是存在一个大问题-控制播放器的唯一方法是通过键盘。 此外,播放器甚至没有最低的GUI,因此您观看电影的持续时间以及剩余的剩余时间-las,您无法找到。

我承认我是一个非常懒惰的人,鉴于KODI本身是通过手机控制的,因此随身携带键盘非常不便。 在搜索了几分钟后,我惊讶地发现没有现成的解决方案可以通过智能手机进行远程MPV控制。 好吧,该怎么做-您必须写自己。 事实证明,在维捷布斯克市中心购买便宜的无线键盘,午休时间为1小时-这是另一项任务。

MPV支持多种脚本语言,其中一种就是Lua。 在Github上,我找到了用Lua编写的mpv-network-commands项目,该项目使您可以使用通过UDP发送的命令来控制最少的MPV功能。 确保工作正常后,在午休期间,我编写了一个简单的应用程序,该应用程序实现了最原始的功能-实际上,它允许您暂停,从暂停开始播放并关闭播放器。


它看起来像这样。

为了能够倒带视频并查看进度条,我不得不通过添加以下功能来修改原始脚本:

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在github上

我立即警告您- 可能存在某些错误。

主要缺点是,运行OrangePi的本地网络上的电话需要固定IP。 有必要使脚本知道将正在播放的文件的信息发送到哪里。 最简单的方法-在路由器的DHCP服务器的设置中,指定为电话提供与IP地址相同的IP设备。

也没有安全元素-网络上的任何用户都可以在知道媒体中心IP的情况下暂停视频或关闭播放器。 是的,要找出被复制的内容以及是否被复制的内容-不。

顺便说一句,使用未经UDP确认的UDP数据交换会产生副作用-由于从播放器接收传入数据会在单独的流中旋转,因此即使服务器脚本未指示手机的正确IP地址,您也可以暂停/关闭播放器。 最主要的是您会知道媒体中心的IP。

安装方式

转到桌面RetroOrangePi。 首先,您需要安装Lua和LuaSocket。

 sudo apt-get install lua5.1 luasocket 

然后转到/home/pi/.config/mpv/目录并在其中创建lua目录。

在lua中,复制server.lua。

使用相同的nano和行打开server.lua

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

将IP地址替换为手机的地址。

保存并重新启动OrangePi。

在手机上安装该应用程序。 组装好的apk位于Github上。 运行它,转到设置。 在此处设置媒体中心和端口755的IP。单击“保存”。

一切都可以使用。

Source: https://habr.com/ru/post/zh-CN423765/


All Articles