java另外启动线程播放wav声音

news/2024/12/2 13:44:36/

搜了一个mp3文件,首先转成wav 用mp3Towav.sh脚本

#!/bin/bashfolder=/home/qzc/workspace/
for file in $(find "$folder" -type f -iname "*.mp3")
doname=$(basename "$file" .mp3)dir=$(dirname "$file")echo ffmpeg -i "$file" -acodec pcm_s16le -ac 1 -ar 16000 "$dir"/"$name".wavffmpeg -i "$file" -acodec pcm_s16le -ac 1 -ar 16000 "$dir"/"$name".wav
done

然后是示例代码

package com.ewivt.redline.dms.jc5000;import javax.sound.sampled.*;
import java.io.File;
import java.io.IOException;public class AudioPlay {//private String path; //带路径的音频文件public static AudioInputStream audioStream;public static AudioFormat audioFormat;public static SourceDataLine sourceDataLine;public static boolean playing = false; //当前播放状态public static boolean replay = false; //是否继续播放public AudioPlay(String path, int times) {for (int i = 0; i < 2; i++) {System.out.println("i" + i);playMusicStopLast(path);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {final String path = "/home/qzc/workspace/11.wav";System.out.println("i 0");new Thread() {public void run() {playMusicStopLast(path);}}.start();System.out.println("i 1");try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("i 2");final String path1 = "/home/qzc/workspace/22.wav";new Thread() {public void run() {playMusicStopLast(path1);}}.start();}//停止上一个播放的新播放public static void playMusicStopLast(String path) {replay = false;while (playing) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}playMusic(path);}public static void playMusic(String path) {try {replay = true;playing = true;int count;byte buf[] = new byte[1024];//获取音频输入流audioStream = AudioSystem.getAudioInputStream(new File(path));//获取音频的编码格式audioFormat = audioStream.getFormat();DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat, AudioSystem.NOT_SPECIFIED);sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);sourceDataLine.open(audioFormat);sourceDataLine.start();//播放音频while (replay && (count = audioStream.read(buf, 0, buf.length)) != -1) {sourceDataLine.write(buf, 0, count);}//播放结束,释放资源sourceDataLine.drain();sourceDataLine.close();audioStream.close();playing = false;} catch (UnsupportedAudioFileException ex) {ex.printStackTrace();} catch (LineUnavailableException ex) {ex.printStackTrace();} catch (IOException ex) {ex.printStackTrace();}}
}

另外线程播放好处是后一个播放能停止前面一个播放,否则只能等前面播放完成才能播放后面一个


http://www.ppmy.cn/news/997137.html

相关文章

华为OD机试真题 JavaScript 实现【输入整型数组和排序标识,对其元素按照升序或降序进行排序】【牛客练习题】

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试&#xff0c;发现新题目&#x…

Jenkins工具系列 —— 启动 Jenkins 服务报错

错误显示 apt-get 安装 Jenkins 后&#xff0c;自动启动 Jenkins 服务报错。 排查原因 直接运行jenkins命令 发现具体报错log&#xff1a;Failed to start Jetty或Failed to bind to 0.0.0.0/0.0.0.0:8080或Address already in use 说明&#xff1a;这里提示的是8080端口号…

【图论】无向图连通性(tarjan算法)

割边&#xff1a;dfn[u]<low[v] 割点&#xff1a;dfn[u]<low[v] (若为根节点&#xff0c;要有两个v这样的点) 一.知识点&#xff1a; 1.连通&#xff1a; 在图论中&#xff0c;连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v&…

2023年精选出来的几道sql语句优化面试题

问&#xff1a;慢 SQL 语句的几种常见诱因? 在这个时候&#xff0c;就可以说&#xff0c;面试官&#xff0c;您好&#xff0c;我觉得SQL慢出现的原因可以分为以下几种&#xff0c;切记&#xff0c;不要回答自己模糊不清的&#xff0c;没法自圆其说的即使知道你也别回答&#x…

宝塔安装nginx重启提示缺少libjemalloc.so.2

错误内容&#xff1a; Nginx配置规则错误: /www/server/nginx/sbin/nginx: error while loading shared libraries: libjemalloc.so.2: cannot open shared object file: No such file or directory 1.查看nginx启动命令需要哪些依赖: ldd /www/server/nginx/sbin/nginx 2.缺…

【MFC】01.MFC框架-笔记

基本概念 MFC Microsoft Fundation class 微软基础类库 框架 基于Win32 SDK进行的封装 属性&#xff1a;缓解库关闭 属性->C/C/代码生成/运行库/MTD 属性->常规->MFC的使用&#xff1a;在静态库中使用MFC&#xff0c;默认是使用的共享DLL&#xff0c;运行时库 SD…

PyCharm安装使用2023年教程,PyCharm与现流行所有编辑器对比。

与PyCharm类似的功能和特性的集成开发环境&#xff08;IDE&#xff09;和代码编辑器有以下几种&#xff1a; Visual Studio Code&#xff08;VS Code&#xff09;&#xff1a;由Microsoft开发&#xff0c;VS Code是一个高度可定制和可扩展的代码编辑器。它支持多种编程语言&am…

Redis - 缓存持久化

Redis 的缓存持久化有两种技术 &#xff1a; RDB 和 AOF RDB Redis 的数据快照 简单说就是将缓存中的所有数据都记录到磁盘中&#xff0c;当Redis发生故障的时候&#xff0c;只需读取快照文件&#xff0c;就可恢复数据 相应的命令是 save 和 bgsave &#xff0c;这两个命名…