小编给大家分享一下使用瓶实现视频的流媒体传输的方法,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
瓶是一个Python实现的网络开发微框架。如何用它实现传送视频数据流呢?瓶应用拥有这样一种能力,以分割成小数据块的方式,高效地为大型请求提供数据。
<强>什么是流媒体? 强>
流媒体是一种技术,其中,服务器以数据块的形式响应请求。我能想到一个原因来解释为什么这个技术可能是有用的:
非常大的响应。对于非常大的响应而言,内存中收集的响应只返回给客户端,这是很低效的。另一种方法是将响应写入磁盘,然后使用flask.send_file()返回文件,但是这增加了I/O的组合。假设数据可以分块生成,以小块数据的方式给请求提供响应是一种更好的解决方案。
实时数据。对于一些应用,需要请求返回的数据来自实时数据源。
<强>使用瓶实现流式传输强>
瓶通过使用生成器函数对流式响应提供本机支持。生成器是一个特别的函数,它可以中断和恢复。考虑一下下面的函数:
def gen ():,, 1,,油品收率; ,,油品收率;2, 油品收率才能3
这是一个运行三步的函数,其中每步返回一个值。描述生成器如何实现超出了本文的范围,但如果你有点好奇,下面的壳会话将给你说明生成器是如何被使用的:
在祝辞祝辞,x =, gen () 在祝辞祝辞x & lt; generator 对象=啊?创=啊?在=?”,0 x7f06f3059c30=啊氨? 在祝辞祝辞,x.next () 1 在祝辞祝辞,x.next () 2 在祝辞祝辞,x.next () 3. 在祝辞祝辞,x.next () Traceback (most recent call 最后一个): ,File “& lt; stdin>“, line 1,拷贝& lt; module> 抛出StopIteration
在这个简单的例子中你能看的到,一个生成器函数可以顺序得返回多个结果.Flask使用生成器函数这一特性来实现流式传输。
下面的例子说明了如何使用流式传输能够产生大的数据表,而不必将整个表放入内存中:
得到flask import 响应,render_template 得到app.models import 股票 ,, def generate_stock_table (): 油品收率才能render_template (& # 39; stock_header.html& # 39;) for 才能;stock 拷贝Stock.query.all (): ,,,油品收率render_template (& # 39; stock_row.html& # 39;,,股票(股票) 油品收率才能render_template (& # 39; stock_footer.html& # 39;) ,, @app.route (& # 39;/stock-table& # 39;) def stock_table (): return 才能响应(generate_stock_table ())
在这个例子中,你能看到瓶和生成器函数是如何一起工作的。返回流式响应的路由(路线)需要返回一个由生成器函数初始化的反应对象.Flask然后采取调用生成器,并以分块的方式吧结果发送给客户端。
对于这个特殊的例子,如果你假设Stock.query.all()返回的数据库查询结果是一个迭代器,那么你能一次生成一个潜在大表的一行,因此无论查询中的字符数量有多少,Python过程中的内存消耗不会因为较大的响应字符串而越来越大。
<强>多部分响应强>
上文提到了表的例子以小块的形式生成一个传统网页,各个的部分连接成最后的结果。对于如何生成较大的响应这是一个很好的例子,但更令人激动的事情是处理实时数据。
使用流式传输的一个有趣的应用是使用每个块来替换原来页面中的地方,这能使流在浏览器窗口中形成动画。利用这种技术,你可以让流中每个数据块成为一个图像,这给你提供了一个运行在浏览器中的很酷的视频输入信号!
实现就地更新的秘密是使用多部分响应。多部分响应由一个报头(header)和很多部分(部分)组成。报头包括多部分中的一种内容类型,后面的部分由边界标记分隔,每个部分中含有自身部分中的特定内容类型。
对于不同的需求,这里有一些多部分内容类型。对于具有流式传输的,每个部分替换先前部分必须使用多部分/x-mixed-replace内容类型。为了帮助你了解它到底是什么样子的,这里有一个多部分视频流传输的响应结构:
HTTP/1.1, 200,好吧 内容类型:多部分/x-mixed-replace;边界=框架 ,, ——帧 内容类型:图像/jpeg ,, & lt; jpeg 数据=https://www.yisu.com/zixun/薄?”“> ——帧 内容类型:图像/jpeg使用瓶实现视频的流媒体传输的方法