Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用http范围请求流式传输视频文件_Python_Sockets_Http_Video_Video Streaming - Fatal编程技术网

Python 使用http范围请求流式传输视频文件

Python 使用http范围请求流式传输视频文件,python,sockets,http,video,video-streaming,Python,Sockets,Http,Video,Video Streaming,我正在尝试制作一个服务器,它使用http字节服务(范围请求)向客户端提供视频文件, 考虑下面的代码 从http.server导入BaseHTTPRequestHandler,HTTPStatus 导入socketserver 从操作系统导入路径 端口=8000 类MyServer(BaseHTTPRequestHandler): file=R“C:\Users\Prince\Downloads\video.mkv” file_size=path.getsize(文件) 定义初始化(self,*a

我正在尝试制作一个服务器,它使用http字节服务(范围请求)向客户端提供视频文件, 考虑下面的代码

从http.server导入BaseHTTPRequestHandler,HTTPStatus
导入socketserver
从操作系统导入路径
端口=8000
类MyServer(BaseHTTPRequestHandler):
file=R“C:\Users\Prince\Downloads\video.mkv”
file_size=path.getsize(文件)
定义初始化(self,*args,**kwargs):
super()
def do_获得(自我):
headers=self.headers
打印(标题)
[开始,结束]=self.get\u范围(标题)
打印(开始、结束)
body=bytes()
将open(self.file,'rb')作为f:
f、 搜索(开始)
正文=f.read(结束-开始)
结束=开始+镜头(主体)-1
self.send\u响应(HTTPStatus.PARTIAL\u内容)
self.send_头(“接受范围”、“字节”)
self.send_标题(“内容类型”、“视频/x-matroska”)
self.send_头(“内容长度”,len(正文))
self.send_头(“内容范围”,“字节%d-%d/%d”%”(开始、结束,self.file_大小))
self.end_头()
self.wfile.write(正文)
def get_范围(自身、标题):
开始,大小=0,1024*1024
尝试:
rkey=标题['Range']
如果不是rkey:
升起“无范围收割台”
[单位,范围]=rkey.split('='))
如果单位!='字节':
提出“未知单位”
[s,e]=范围。拆分('-')
开始=整数(s)
e=int(e)
end=e如果不是e==0,则开始+大小
返回[开始,结束]
除:
返回[开始,开始+大小]
handler=MyServer
使用socketserver.TCPServer((”“,端口),处理程序)作为httpd:
打印(“服务器在本地主机上启动:+str(端口))
httpd.永远为你服务()
但这不起作用,客户端(vlc)只发出一个请求,然后结束播放,而不播放整个文件。f、 e
下面是vlc和脚本之间的交互

http debug: outgoing request: GET / HTTP/1.1 Host: localhost:8000 Accept: */* Accept-Language: en_US User-Agent: VLC/3.0.8 LibVLC/3.0.8 Range: bytes=0- 
http debug: incoming response: HTTP/1.0 206 Partial Content Server: BaseHTTP/0.6 Python/3.7.5 Date: Mon, 27 Apr 2020 16:07:43 GMT Accept-Range: bytes Content-Type: video/x-matroska Content-Length: 1048576 Content-Range: bytes 0-1048575/285618825 
vlc不发出任何其他请求,仅为该区块播放视频

奇怪的是,如果我用文件大小替换
内容长度
,即

self.send_头(“内容长度”,str(self.file_大小))
然后VLC发出进一步的请求并播放整个文件,也支持随机搜索,但我认为这是不正确的,因为它清楚地说内容长度应该是范围请求中的“真实内容长度”,而不是请求资源的完整大小


因此,我的问题是,在发送正确的
内容长度时,是否有其他方法来实际修复上述代码,我正在使用VLC播放流。

“…客户端(VLC)只发出一个请求…”-什么请求发出VLC?理想情况下,提供完整的请求标头,但至少提供请求方法和请求范围(如果有)。@SteffenUllrich我已经添加了标头,请查看VLC请求完整文档(
字节:0-
表示直到结尾),但您只提供了一部分,即您的响应与请求的内容不匹配。vlc希望
内容长度和正文与请求的内容相匹配,即完整文件。“…客户端(vlc)只发出一个请求…”-什么请求发出vlc?理想情况下,提供完整的请求标头,但至少提供请求方法和请求范围(如果有)。@SteffenUllrich我已经添加了标头,请查看VLC请求完整文档(
字节:0-
表示直到结尾),但您只提供了一部分,即您的响应与请求的内容不匹配。vlc希望
内容长度和正文与请求的内容相匹配,即完整文件。