使用JDK 11播放常规声音和循环声音吗?

如何解决使用JDK 11播放常规声音和循环声音吗?

我正在使用Java JDK 11.0.8(Eclipse下的“ Installed JRE”设置为jdk-11.0.8),Eclipse 2020-06和Codename One 6.0.0。

我最近已从JDK 8切换到JDK 11,并注意到我的应用程序中的播放声音选项不再起作用...

请注意,在创建应用程序时,我未选中“ Java 8”,而我只是想在模拟器中解决问题(我没有尝试将应用程序部署到实际的移动设备上)。

我想播放“常规声音”(我想从头到尾播放声音,结束时不需要从头开始播放)和“循环声音”(声音应在结束时开始播放,因此,我可以在后台连续播放它。

因此,我有两个问题:

问题1-关于“常规声音”

我只想创建一次Media对象,然后在需要播放相同常规声音时重新使用它。

为此,我将Media创建封装在一个类中,如下所示:

public class RegularSound {
    private Media m;
    public RegularSound(String fileName) {
        try{
        InputStream is = Display.getInstance().getResourceAsStream(getClass(),"/"+fileName);
        m = MediaManager.createMedia(is,"audio/wav");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    
    public void play() {
        m.setTime(0);
        m.play();
    }
}

然后我实例化RegularSound对象并按如下所示播放它:

mySound = new RegularSound("example.wav");
mySound.play();

请注意,example.wav直接复制到我项目的“ src”目录下。

该代码曾经用于JDK 8,但是与JDK 11一起使用时,出现以下构建错误:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/media/ControllerListener
    at com.codename1.impl.javase.JavaJMFSEPort$1.run(JavaJMFSEPort.java:67)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.media.ControllerListener
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.ClassLoader.findSystemClass(ClassLoader.java:1247)
    at com.codename1.impl.javase.ClassPathLoader.findClass(ClassPathLoader.java:269)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at com.codename1.impl.javase.ClassPathLoader.loadClass(ClassPathLoader.java:115)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at com.codename1.impl.javase.ClassPathLoader.loadClass(ClassPathLoader.java:107)
    ... 14 more

问题2-关于“循环播放声音”

为循环声音,我创建了另一个类,如下所示:

public class LoopingSound implements Runnable{
    private Media m;
    String fileName;
    
    public LoopingSound(String fileName){
        try{
            InputStream is = Display.getInstance().getResourceAsStream(getClass(),"/"+fileName);
            m = MediaManager.createMedia(is,"audio/wav",this);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        
    }
    public void pause()
        {
        m.pause();
        }
    public void play()
        {
        m.play();
        }
    
    public void run() {
        m.setTime(0);
        m.play();
            
    }
}

但是当我实例化LoopingSound的对象并尝试播放它时,我再次遇到构建错误。

那么您能否让我知道如何更改常规声音和循环声音的代码,以便在使用JDK 11时不会出现上述错误?

更新

感谢@ shai-almog的回复。我已经安装了CEF。但是我在运行时在控制台上收到一些消息,我听不到声音在播放...我运行以下代码:

try {
            InputStream is = Display.getInstance().getResourceAsStream(getClass(),"/example.wav");
            Media m = MediaManager.createMedia(is,"audio/wav");
            m.play();
    } catch (IOException e) {
            e.printStackTrace();
    }

,运行此代码时,我会在控制台上收到以下消息(最后会引发异常):

Adding CEF to classpath
Retina Scale: 2.0
CEF Args: [--disable-gpu,--disable-software-rasterizer,--disable-gpu-compositing,--touch-events=enabled,--enable-media-stream,--device-scale-factor=4,--force-device-scale-factor=4,--autoplay-policy=no-user-gesture-required,--enable-usermedia-screen-capturing]
Using:
JCEF Version = 83.4.0.260
CEF Version = 83.4.0
Chromium Version = 83.0.4103.106
AppHandler.stateHasChanged: INITIALIZING
initialize on Thread[AWT-EventQueue-0,6,main] with library path C:\Users\pmuyan\.codenameone\cef\lib\win64
Added scheme search://
Added scheme client://
Added scheme cn1stream://

DevTools listening on ws://127.0.0.1:8088/devtools/browser/591d3502-6fd6-4997-9131-9a2a352e47b1
AppHandler.stateHasChanged: INITIALIZED
Running ready callbacks
Exception in thread "AWT-EventQueue-0" Address changed to data:text/html,%3C!doctype%20html%3E%3Chtml%3E%3Chead%3E%3Cstyle%20type%3D'text%2Fcss'%3Edocument%2C%20body%20%7Bpadding%3A0%3Bmargin%3A0%3B%20width%3A100%25%3B%20height%3A%20100%25%7D%20video%2C%20audio%20%7Bmargin%3A0%3B%20padding%3A0%3B%20width%3A100%25%3B%20height%3A%20100%25%7D%3C%2Fstyle%3E%3C%2Fhead%3E%3Cbody%3E%3Caudio%20id%3D'cn1Media'%20width%3D'640'%20height%3D'480'%20style%3D'width%3A100%25%3Bheight%3A100%25'%20src%3D'https%3A%2F%2Fcn1app%2Fstreams%2F1'%2F%3E%3Cscript%3Ewindow.cn1Media%20%3D%20document.getElementById('cn1Media')%3Bfunction%20callback(data)%7B%20cefQuery(%7Brequest%3A'shouldNavigate%3A'%2BJSON.stringify(data)%2C%20onSuccess%3A%20function(response)%7B%7D%2C%20onFailure%3Afunction(error_code%2C%20error_message)%20%7B%20console.log(error_message)%7D%7D)%3B%7Dcn1Media.addEventListener('pause'%2C%20function()%7B%20callback(%7B'state'%3A'paused'%7D)%7D)%3Bcn1Media.addEventListener('play'%2C%20function()%7B%20callback(%7B'state'%3A'playing'%7D)%7D)%3Bcn1Media.addEventListener('ended'%2C%20function()%7B%20callback(%7B'state'%3A'ended'%7D)%7D)%3Bcn1Media.addEventListener('durationchange'%2C%20function()%7B%20callback(%7B'duration'%3A%20Math.floor(cn1Media.duration%20*%201000)%7D)%7D)%3Bcn1Media.addEventListener('timeupdate'%2C%20function()%7B%20callback(%7B'time'%3A%20Math.floor(cn1Media.currentTime%20*%201000)%7D)%7D)%3Bcn1Media.addEventListener('volumechange'%2C%20function()%7B%20callback(%7B'volume'%3A%20Math.round(cn1Media.volume%20*%20100)%7D)%7D)%3Bcn1Media.addEventListener('error'%2C%20function()%7B%20var%20msg%20%3D%20'Unknown%20Error'%3B%20try%20%7Bmsg%20%3D%20cn1Media.error.message%20%2B%20'.%20Code%3D'%2Bcn1Media.error.code%3B%7Dcatch(e)%7B%7D%20callback(%7B'error'%3A%20msg%7D)%7D)%3B%3C%2Fscript%3E%20%3C%2Fbody%3E%3C%2Fhtml%3E

更新2

我可以使用JDK 11手动将Open JavaFX 11添加到Eclipse和在Eclipse下运行的Codename One应用程序,如下所示:

Step1) Create JavaFX11 user library under Eclipse
Download JavaFX 11 from https://gluonhq.com/products/javafx/
unzip it -> creates javafx-sdk-11.0.2 folder
Create a User Library: Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New. 
Name it JavaFX11.
Hit "Add External JARs" and include all the jars under javafx-sdk-11.0.2\lib

Step 2) Add the JavaFX11 library to the project:
Right click on project.
Select Build path -> Configure Build Path 
Goto Library tab->Add Library->User Library->Check JavaFX11->Apply and Close

现在,我可以在Codename One应用程序中听到声音了。

但是,我需要从命令提示符运行我的应用程序,而常规命令行才能运行这些应用程序不再起作用(该应用程序无法从命令提示符中找到与JavaFX相关的类,并且遇到了上面列出的相同错误)。那么,能否请您告诉我如何修改命令行,以使使用JavaFX的Codename One项目可以在命令提示符下运行?

这是我使用的常规命令行:

java -cp dist\Proj.jar;JavaSE.jar com.codename1.impl.javase.Simulator com.mycompany.hi.Main

顺便说一句,我试图在命令行中将javafx-sdk-11.0.2 \ lib下的javafx.media.jar添加到类路径(-cp)中,但这没有用...

请告知,

再次感谢!

解决方法

TL; DR

按照here的说明安装CEF或为您的VM切换到ZuluFX 11。

说明:

这一直有效,直到我们集成了CEF支持,我们才为JDK 11安装动态下载JavaFX,但这引起了许多相关问题。因此,我们决定迁移到CEF,此操作仍在进行中,而JavaFX动态下载已中断。完成后,CEF将自动安装,并且将再次无缝连接。

这会影响浏览器组件和媒体,这是JavaFX实现的两个组件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-