mamoe / mirai

高效率 QQ 机器人支持库
https://mirai.mamoe.net
GNU Affero General Public License v3.0
14.48k stars 2.54k forks source link

通过 highway 通道传输语音 #577

Closed yujincheng08 closed 3 years ago

yujincheng08 commented 4 years ago

目前使用MIRAI1.2.2版本,今天测试语音时候,发现语音发送后会被二压。 原始语音数据为6.72KB,链接如下(通过coolq发送,可能会失效,失效看附件):

http://grouptalk.c2c.qq.com/?ver=0&rkey=3062020101045b305902010102010102048287ba7e042439306a335a4c686d426c4f4548336335334b23425659685966634c6f475a5f54315f676302045f54bc20041f0000000866696c6574797065000000013100000005636f64656300000001310400&filetype=1&voice_codec=1

coolq.zip

而经过mirai发送之后,变成了1.35KB,链接如下(可能会失效,失效见附件):

http://grouptalk.c2c.qq.com/?ver=0&rkey=3062020101045b305902010102010102048287ba7e042438306a33444c526d426c4f4548336335703958653048506c5f4b4e59757947674e30327902045f54bd58041f0000000866696c6574797065000000013100000005636f64656300000001300400&filetype=1&voice_codec=0

mirai.zip

原文件的URL中有voice_codec=1,但是后面变成voice_codec=0。并且在PC无法正常播放。 问题与#548 应该是一样的,但是被以编码问题而关闭。我认为这可能是上传时候某些参数不正确导致的,应该是协议问题。

sandtechnology commented 4 years ago

mirai的voice_codec参数是以文件头进行设置的,请确保文件头正确 这两个文件中,coolQ是 #!SILK_V3 而mirai是

!AMR

我相信你将酷Q的文件重新上传会得到和酷Q一样的结果

yujincheng08 commented 4 years ago

@sandtechnology 实际上我就是用coolq那个文件,通过mirai转发出去的。不知为何会被二压成amr。

Hieuzest commented 4 years ago

经测试,目前似乎并不能发出返回类型为1的语音,应是协议问题

Update: 直接改url倒是可以取到silk,不过这也就说明了发送时被当作amr然后被服务器二压了。 (顺便,如果你转发走的是httpapi的话,我发现我之前写了个bug可能导致url失效。)

yujincheng08 commented 4 years ago

@Hieuzest 我用的是CQHTTP-MIRAI所以可能关系不大。应该还是因为协议问题发送时候被当作AMR二压了

Hieuzest commented 4 years ago

@Hieuzest 我用的是CQHTTP-MIRAI所以可能关系不大。应该还是因为协议问题发送时候被当作AMR二压了

目前只有httpapi是直接转发,CQHM的实现是二次上传的,所以导致你这里的两条url id不同

yujincheng08 commented 4 years ago

@Hieuzest 是这样的。另外我尝试改codec还是一个1.35K的amr

CL-Jeremy commented 4 years ago

刚才直接发送 silkv3 格式语音,碰到了同样的问题。操作上和 https://github.com/mamoe/mirai/issues/548 相同,与转码设置无关(将转码的文件转换回去依然正常) 所以如果原因在于目前使用的 QQ for Android 协议的话,可能应该考虑合并这两个 issue(即:非直接转发消息时, silkv3 格式语音会被转码成 amr)

Hieuzest commented 4 years ago

我没有办法测试(找不到能发silk的端)但简单测试转发消息也会 Any plan on this or start a new issue about the real voice sending?

sandtechnology commented 4 years ago

已进行代码检查 传参及检测无问题 应该是协议问题 @yyuueexxiinngg

Hieuzest commented 4 years ago

我测试时是直接把客户端发出来的format=1的Msg转发出去的,结果回来就format=0了

yujincheng08 commented 4 years ago

隔壁gocqhttp好像已经解决这个问题了

golezi commented 4 years ago

我是在kotlin上直接开发的,在提 #548之前单步调试只能看懂 区分SILK和AMR 后面就不太懂了 转码方法不变,以前用iotqq发送出的语音听起来是正常的,只是在qq上会显示成2秒而不是qq会员长语音 不知道和会员长语音的实现方式是否有关

yyuueexxiinngg commented 4 years ago

此Issue @Mrs4s 或许可以提供些帮助

看了下go-cqhttp的更新, 好像把codec重新填死为0了 https://github.com/Mrs4s/MiraiGo/commit/d3b0f5f9e8392504fc194584011c9c765ba204ab

不过当时的讨论是codec填0可以发任何格式的语音, 但会导致PC端无法正常播放. 现在go-cqhttp那边的语音也有点问题 https://github.com/Mrs4s/go-cqhttp/issues/390

目前我手上没有能成功登录的帐号, 暂无法进行测试

sandtechnology commented 3 years ago

已进行代码检查 传参及检测无问题 应该是协议问题 @yyuueexxiinngg

问题已找到,确实是上传时候某些参数不正确导致的,将会发送PR修复

Him188 commented 3 years ago

备注:经过讨论确定问题是需要通过 highway 传输语音. 现在使用的 HTTP 接口总是会压缩

Him188 commented 3 years ago

Highway (BDH) 上传已经实现, 现在可以尝试版本 2.2.0-dev-bdh-1