Python websocket bytes 格式问题,希望指点

303 天前
 magicZ

audio_data, sample_rate = torchaudio.load("D:\data\8k\x.wav")

我获取了 audio_data, 希望将它发送到 java 的 websocket 服务,接收格式如下

public void onMessage(byte[] bytes, Session session)

虽然都是 bytes, 但是 java 的 byte 范围[-128, 127],而 python 是[0,255] 每次数据发送就直接断开了服务。

我想知道要怎么转换,才能让 java 服务接收到音频信息。之前没写过 python, 希望高手指点一下

811 次点击
所在节点    问与答
5 条回复
sujin190
303 天前
正常的二进制 bytes 数据流是无符号的,因为它是二进制流而不是数字,不包含符号含义,也就是值范围应该是 0 到 255 ,但是都怪 java 没有无符号数,所以 java 的 byte 是有符号的也就是值范围是-128 到 127 ,但它们从二进制上看是同一个完全一样的不影响吧,你把这个 byte[]扔给音视频解码器接收 byte[]参数的是完全正常的,但是如果你要自己写算法计算处理那你就要注意符号和溢出问题了,所以也不知道你说的 java 不能正常接收是啥毛病
sujin190
303 天前
顺便说 java 因为没有无符号数据类型,你想正常处理无符号数计算那使用更高一级数据宽度的类型就好了,比如 byte 转 short ,也就是:

((short) v) & 0xff

这样一下,注意最后面这个 & 0xff ,一定要再&一下才可以,然后你再看就发现和 python 等其它语言的数字值一样了,说实话 java 因为这个问题处理二进制流简直坑死人麻烦的不行
magicZ
303 天前
@sujin190 非常感谢,我调整一下试试
magicZ
303 天前
@sujin190 “二进制上看是同一个完全一样的不影响吧” 一语惊醒梦中人,加一下我微信 emhhbmdsaWtlZmx5 ,我请哥喝杯咖啡
sujin190
303 天前
@magicZ #4 太客气了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1018828

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX