Python通过Socket+Ngrok传输MP4文件仅接收部分数据的问题求助
Python通过Socket+Ngrok传输MP4文件仅接收部分数据的问题求助
各位大佬好!我最近在做一个需求:用Python的Socket在互联网上实现视频流传输,目前用Ngrok来暴露我的内网服务器。因为单独传输每一帧视频速度实在太慢,所以我先拿传输MP4文件来做测试,写了一段简化版的代码,但遇到了头疼的问题——在公网环境下,接收端收到的文件大小只有发送端原文件的一半左右,根本没法正常播放。
先贴一下我的代码:
服务器(发送端)代码
import socket if __name__ == '__main__': with open('vid.mp4', 'rb') as f: data = f.read() server_soc = socket.socket() server_soc.bind(('localhost', 1234)) server_soc.listen() client_soc, _ = server_soc.accept() client_soc.send(str(len(data)).rjust(16, '0').encode()) client_soc.sendall(data)
客户端(接收端)代码
import socket if __name__ == '__main__': soc = socket.socket() soc.connect(('6.tcp.eu.ngrok.io', 19717)) data_len = int(soc.recv(16).decode()) with open('new.mp4', 'wb') as f: read = 0 while read < data_len: f.write(soc.recv(4096)) read += 4096
我的思路是先把整个MP4文件读进内存,先发送一个固定16位长度的字符串来告知接收端文件总大小,然后用sendall把全部数据发出去。接收端先接收这16字节的长度信息,然后循环每次收4096字节,直到收够总长度的数据。但实际运行下来,接收的文件总是不完整,大小只有原文件的一半左右,本地测试的时候好像没问题,一通过Ngrok走公网就出问题了。有没有人能帮我分析下哪里出错了?
备注:内容来源于stack exchange,提问作者NoamShabat
相关产品推荐
相关产品推荐

