Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 51|回复: 1

将test.py改写成java程序

[复制链接]

401

主题

568

帖子

3340

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3340
发表于 4 天前 | 显示全部楼层 |阅读模式
把这个Python WebSocket音频流处理程序转换为Java程序。以下是转换后的Java版本:

  1. import java.net.URI;
  2. import java.nio.ByteBuffer;
  3. import java.nio.file.Files;
  4. import java.nio.file.Paths;
  5. import javax.sound.sampled.AudioFormat;
  6. import javax.sound.sampled.AudioInputStream;
  7. import javax.sound.sampled.AudioSystem;
  8. import org.java_websocket.client.WebSocketClient;
  9. import org.java_websocket.handshake.ServerHandshake;
  10. import org.json.JSONObject;

  11. public class AudioStreamClient extends WebSocketClient {
  12.    
  13.     private String audioFilePath;
  14.     private AudioInputStream audioStream;
  15.     private AudioFormat format;
  16.     private boolean finished = false;
  17.    
  18.     public AudioStreamClient(URI serverUri, String audioFilePath) {
  19.         super(serverUri);
  20.         this.audioFilePath = audioFilePath;
  21.     }
  22.    
  23.     @Override
  24.     public void onOpen(ServerHandshake handshake) {
  25.         System.out.println("Connected to server");
  26.         try {
  27.             // 打开音频文件
  28.             audioStream = AudioSystem.getAudioInputStream(Files.newInputStream(Paths.get(audioFilePath)));
  29.             format = audioStream.getFormat();
  30.             
  31.             // 发送配置信息
  32.             JSONObject config = new JSONObject();
  33.             JSONObject configObj = new JSONObject();
  34.             configObj.put("sample_rate", (int) format.getSampleRate());
  35.             config.put("config", configObj);
  36.             
  37.             send(config.toString());
  38.             System.out.println("@@@@@@");
  39.             
  40.         } catch (Exception e) {
  41.             e.printStackTrace();
  42.         }
  43.     }
  44.    
  45.     @Override
  46.     public void onMessage(String message) {
  47.         System.out.println(message);
  48.         if (!finished) {
  49.             sendAudioData();
  50.         }
  51.     }
  52.    
  53.     @Override
  54.     public void onClose(int code, String reason, boolean remote) {
  55.         System.out.println("Connection closed: " + reason);
  56.         try {
  57.             if (audioStream != null) {
  58.                 audioStream.close();
  59.             }
  60.         } catch (Exception e) {
  61.             e.printStackTrace();
  62.         }
  63.     }
  64.    
  65.     @Override
  66.     public void onError(Exception ex) {
  67.         ex.printStackTrace();
  68.     }
  69.    
  70.     private void sendAudioData() {
  71.         try {
  72.             // 计算0.2秒的音频数据大小
  73.             int frameSize = format.getFrameSize();
  74.             int bufferSize = (int) (format.getSampleRate() * 0.2) * frameSize;
  75.             byte[] buffer = new byte[bufferSize];
  76.             
  77.             int bytesRead = audioStream.read(buffer);
  78.             if (bytesRead == -1) {
  79.                 // 文件读取完毕,发送结束标志
  80.                 JSONObject eof = new JSONObject();
  81.                 eof.put("eof", 1);
  82.                 send(eof.toString());
  83.                 finished = true;
  84.                 System.out.println("******");
  85.             } else {
  86.                 // 发送音频数据
  87.                 // 如果读取的字节数少于缓冲区大小,需要调整数组大小
  88.                 if (bytesRead < bufferSize) {
  89.                     byte[] smallerBuffer = new byte[bytesRead];
  90.                     System.arraycopy(buffer, 0, smallerBuffer, 0, bytesRead);
  91.                     send(ByteBuffer.wrap(smallerBuffer));
  92.                 } else {
  93.                     send(ByteBuffer.wrap(buffer));
  94.                 }
  95.             }
  96.         } catch (Exception e) {
  97.             e.printStackTrace();
  98.         }
  99.     }
  100.    
  101.     public static void main(String[] args) {
  102.         if (args.length < 1) {
  103.             System.err.println("Usage: java AudioStreamClient <audio_file>");
  104.             System.exit(1);
  105.         }
  106.         
  107.         try {
  108.             URI uri = new URI("ws://10.10.5.56:2700");
  109.             AudioStreamClient client = new AudioStreamClient(uri, args[0]);
  110.             client.connectBlocking();
  111.         } catch (Exception e) {
  112.             e.printStackTrace();
  113.         }
  114.     }
  115. }
复制代码
主要改动说明:
  1、WebSocket库:使用了java-websocket库替代Python的websockets库
  2、音频处理:使用Java的javax.sound.sampled包替代Python的wave模块
  3、异步处理:Java WebSocket客户端采用事件驱动模型,通过回调方法处理消息
  4、JSON处理:使用org.json库处理JSON数据
  5、命令行参数:通过args[0]获取音频文件路径
  6、音频数据读取:按0.2秒的帧数读取音频数据并发送到服务器
  7、结束标志:文件读取完毕后发送{"eof": 1}结束标志
需要添加的依赖(Maven)

  1. <dependency>
  2.     <groupId>org.java-websocket</groupId>
  3.     <artifactId>Java-WebSocket</artifactId>
  4.     <version>1.5.3</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.json</groupId>
  8.     <artifactId>json</artifactId>
  9.     <version>20230227</version>
  10. </dependency>
复制代码
这个Java版本实现了与原始Python程序相同的功能:连接到WebSocket服务器,发送音频配置,按块读取音频文件并发送数据,最后发送结束标志。

回复

使用道具 举报

401

主题

568

帖子

3340

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3340
 楼主| 发表于 前天 02:42 | 显示全部楼层
请介绍这个库:import java.nio.file.Files:

`java.nio.file.Files` 是Java NIO.2 (New I/O 2) 包中的一个工具类,提供了丰富的文件操作功能。

## 主要特性

- **文件操作工具类**:`Files` 类包含了大量的静态方法,用于执行各种文件相关的操作
- **现代化API**:相比传统的 `java.io.File` 类,提供了更强大和灵活的文件处理能力
- **异常处理**:方法通常会抛出具体的异常类型,便于错误处理

## 常用功能

1. **文件读写**:
   - `readAllBytes()` - 读取文件所有字节
   - `readAllLines()` - 读取文件所有行
   - `write()` - 写入数据到文件

2. **文件操作**:
   - `copy()` - 复制文件
   - `move()` - 移动文件
   - `delete()` - 删除文件
   - `createDirectory()` - 创建目录

3. **文件属性查询**:
   - `exists()` - 检查文件是否存在
   - `isDirectory()` - 检查是否为目录
   - `size()` - 获取文件大小
   - `getLastModifiedTime()` - 获取最后修改时间

## 注意事项

在当前的 [AudioSocketClient](file://C:\s_c\MyApplication\app\src\main\java\cn\unicoder\myapplication\AudioSocketClient.java#L13-L48) 类中虽然导入了 `java.nio.file.Files`,但实际上并未使用该类的功能。如果不需要相关功能,可以安全地移除这个导入语句。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-11-3 06:41 , Processed in 0.010695 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表