为什么 gradio 前端在事件参数传 Uint8Array,后端收到的数据却是 Dictionary

122 天前
 siluplsy
JS 中传 Uint8Array:
	var blob = new Uint8Array(await videoBlob.arrayBuffer())
	handle_change_AB_time([dragStart, dragEnd, blob])
    
Python 中收到的实际是一个字典:
	def change_ABT(evt: gr.EventData):
    	    [ begintime, endtime, videoData ] = evt._data
    	    videoBytes = bytes(list(videoData.values())) 
        
这种转换应该会有性能损失吧?怎样在 Python 直接能收到 bytes 类型的数据呢?
1531 次点击
所在节点    Python
8 条回复
MossFox
122 天前
Uint8Array 转 JSON 就是这样。

Uint8Array(3) [ 114, 51, 4 ]
> {"0":114,"1":51,"2":4}

要传二进制数据的话,能序列化在 JSON 中的只有字符串类型。如果必须在某个字段给二进制数据,用 base64 吧。后端收到的时候转回去就可以。
siluplsy
122 天前
@MossFox 因为是传的视频数据,用 base64 是不是太慢了。。。
codehz
122 天前
所以是什么协议发送的呢,怎么发的,又是怎么接收的
siluplsy
122 天前
@codehz 其实就是读本地的一个 mp4, 剪一小段出来写入磁盘。没有涉及网络传输
renmu
122 天前
试试用 formdata 直接传文件呢
zhongzhaoguo
121 天前
你的 js 是怎么传输数据给 Python 的
lisxour
120 天前
Uint8Array 转成 Blob 再上传应该就是 bytes 吧
siluplsy
120 天前
好像 gradio 在设计上就是用 json 来交换前后端数据的,看来只能这样了

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

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

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

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

© 2021 V2EX