我一直在为我的 Raspberry Pi 编写一个简单的 Clojure 框架,用于播放音乐(以及稍后的其他东西)。该程序会解析给定音乐目录中的歌曲,然后通过 TCP 接口开始等待控制命令(例如开始、停止、下一首歌曲)。
该代码可通过 GitHub 获取: https://github.com/jvnn/raspi-framework 当前版本在我的笔记本电脑上运行良好,当指示时可以开始播放音乐(使用 JLayer 库),更换歌曲,并像预期那样停止。超级jar文件在笔记本电脑上需要几秒钟才能启动,但是当我尝试在 Raspberry Pi 上运行它时,速度变得非常慢。
只是启动程序以加载所有类并开始执行实际程序代码就需要超过一分钟。我尝试使用 -verbose:class 开关运行它,似乎 jvm 花费了整个时间来加载大量类(针对 Clojure 和其他所有内容)。
当程序最终启动时,确实会对给定的命令做出反应,但回放非常卡顿。有短暂的次秒声音,然后暂停了几乎一秒钟,再播放另一个声音,再暂停等等......因此,该程序正在尝试播放某些内容,但它只是无法快速做到。CPU 使用率接近 98%。
现在,拥有 Android 手机等一切,我相信可以在这种硬件上很好地执行 Java 来播放一些 mp3 文件而没有任何问题。我知道 JLayer(或其中的一部分)用于 gdx 游戏开发框架(也在 Android 上运行),因此这不应该是问题。
所以一切都指向我是问题所在。是否有什么我可以通过 leiningen(对所有文件已启用 aot)、Raspberry Pi 或我的代码来使事情更快的方法?
感谢您的时间!
更新: 我制作了一个小测试用例来排除一些可能性,但以下 Clojure 代码仍存在问题:
项目.clj文件:
该代码可通过 GitHub 获取: https://github.com/jvnn/raspi-framework 当前版本在我的笔记本电脑上运行良好,当指示时可以开始播放音乐(使用 JLayer 库),更换歌曲,并像预期那样停止。超级jar文件在笔记本电脑上需要几秒钟才能启动,但是当我尝试在 Raspberry Pi 上运行它时,速度变得非常慢。
只是启动程序以加载所有类并开始执行实际程序代码就需要超过一分钟。我尝试使用 -verbose:class 开关运行它,似乎 jvm 花费了整个时间来加载大量类(针对 Clojure 和其他所有内容)。
当程序最终启动时,确实会对给定的命令做出反应,但回放非常卡顿。有短暂的次秒声音,然后暂停了几乎一秒钟,再播放另一个声音,再暂停等等......因此,该程序正在尝试播放某些内容,但它只是无法快速做到。CPU 使用率接近 98%。
现在,拥有 Android 手机等一切,我相信可以在这种硬件上很好地执行 Java 来播放一些 mp3 文件而没有任何问题。我知道 JLayer(或其中的一部分)用于 gdx 游戏开发框架(也在 Android 上运行),因此这不应该是问题。
所以一切都指向我是问题所在。是否有什么我可以通过 leiningen(对所有文件已启用 aot)、Raspberry Pi 或我的代码来使事情更快的方法?
感谢您的时间!
更新: 我制作了一个小测试用例来排除一些可能性,但以下 Clojure 代码仍存在问题:
(ns test.core
(:import [javazoom.jl.player.advanced AdvancedPlayer])
(:gen-class))
(defn -main
[]
(let [filename "/path/to/a/music/file.mp3"
fis (java.io.FileInputStream. filename)
bis (java.io.BufferedInputStream. fis)
player (AdvancedPlayer. bis)]
(doto player (.play) (.close))))
项目.clj文件:
(defproject test "0.0.1-SNAPSHOT"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.5.1"]
[javazoom/jlayer "1.0.1"]]
:javac-options ["-target" "1.6" "-source" "1.6" "-Xlint:-options"]
:aot :all
:main test.core)
所以,没有核心异步和线程。播放流畅了一些,但音乐和暂停之间仍有大约200毫秒的间隔。