我使用Twisted创建了一个简单的http服务器,它发送Content-Type:multipart/x-mixed-replace标头.我正在使用它来测试我想要设置为接受长期流的http客户端.
出现的问题是我的客户端请求挂起,直到http.Request调用self.finish(),然后它立即接收所有多部分文档.
有没有办法手动将输出缓冲区刷新到客户端?我假设这就是为什么我没有收到单独的多部分文件.
#!/usr/bin/env python
import time
from twisted.web import http
from twisted.internet import protocol
class StreamHandler(http.Request):
BOUNDARY = 'BOUNDARY'
def writeBoundary(self):
self.write("--%s\n" % (self.BOUNDARY))
def writeStop(self):
self.write("--%s--\n" % (self.BOUNDARY))
def process(self):
self.setHeader('Connection', 'Keep-Alive')
self.setHeader('Content-Type', "multipart/x-mixed-replace;boundary=%s" % (self.BOUNDARY))
self.writeBoundary()
self.write("Content-Type: text/html\n")
s = "<html>foo</html>\n"
self.write("Content-Length: %s\n\n" % (len(s)))
self.write(s)
self.writeBoundary()
time.sleep(2)
self.write("Content-Type: text/html\n")
s = "<html>bar</html>\n"
self.write("Content-Length: %s\n\n" % (len(s)))
self.write(s)
self.writeBoundary()
time.sleep(2)
self.write("Content-Type: text/html\n")
s = "<html>baz</html>\n"
self.write("Content-Length: %s\n\n" % (len(s)))
self.write(s)
self.writeStop()
self.finish()
class StreamProtocol(http.HTTPChannel):
requestFactory …Run Code Online (Sandbox Code Playgroud) 我通过http获取mjpeg流并使用<img>标签查看它.非常标准,没有问题,一切都正确流.
但是,与编码的jpg数据一起,http响应中有一个我想要访问的UTC时间戳.基本上,我希望能够显示每帧的匹配时间.以下是我正在使用的每个框架的响应:
Content-Type: image/jpeg
Content-Length: 60189
Time-Stamp: 51961243969
UTC-Time: 1349439599864
Flags: 2097153
PlayID: 1
Camera-Type: Halocam IP
Connection: Close
[encoded jpg data]
--myboundary
Run Code Online (Sandbox Code Playgroud)
目前,<img>标签正在获取该流并直接解释jpgs.无论如何通过javascript拦截,解释或分离UTC时间值,以便我可以在页面上显示它?我不控制http响应,但如果通过某些更改可以获得解决方案,我可以与控制它的人交谈.
我有一个摄像头,通过连续的多部分http流将JPEG图像发送到网络服务器.当我访问流的IP地址时,浏览器将此流读取为一系列模仿视频的图像.我想将此流中的文件下载到远程服务器.
我不知道如何解析流并将文件直接保存到我的ubuntu服务器,或者通过我的ruby on rails应用程序文件系统.
以下是浏览器查看流的方式:
Response Headers:
HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=frame
Request Headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
DNT: 1
Host: my-ip-address
Run Code Online (Sandbox Code Playgroud)
请帮我找到解决这个问题的正确方法.
http keep-alive multipart-mixed-replace ruby-on-rails-4 ubuntu-16.04
我需要向外部服务器发出 HTTP GET 请求才能开始接收事件。请求后我立即得到multipart/x-mixed-replace回复。当事件发生时,它会作为 XML 消息与指示该部分结束的边界一起发送。
现在我必须在 Node.js 中实现它。对于正常请求,我使用node-rest-client,调用其get()方法并将我的逻辑放入方法的回调中。问题是回调仅在响应完成时执行,并且multipart/x-mixed-replace直到连接关闭时才会执行。
还有其他 NPM 模块可以做到这一点吗?我搜索了 NPM 注册表,但发现结果似乎不适合该任务。还是在纯 Node 中完成更好?我就是这样,请举个例子。
美好的一天,我使用 esp8266 模块作为服务器,带有摄像头模块通过 wifi 连续传输 jpeg 图像。我想同时在同一个浏览器窗口中播放流视频、文本和按钮。所以我用 HTML 创建了网页,我使用“multipart/x-mixed-replace”内容类型作为流窗口、文本和按钮,因为我读到这种类型接受各种子类型,如 html 和图像。流媒体窗口有效,但...
总而言之,我想要做的是在同一个浏览器窗口中同时拥有流式视频窗口、文本和按钮。
下面是我编写的 HTML 代码和流窗口的图像,我相信我在内容类型上做错了或者我没有以正确的方式使用它。
HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=frame
--frame //this part shows the jpeg image captured
Content-Type: image/jpeg
..
fetch jpeg image part
..
--frame //this part hopefully adds text and buttons
Content-Type: text/html // along with the streaming video window
<!DOCTYPE HTML> //This is the idea at least...
<html>
<body>
<h1 style="position:relative; left:25px;"> ⚓ Observation Panel ⚓</h1> …Run Code Online (Sandbox Code Playgroud) 在制作了一个通过multipart/x-mixed-replace Content-Type标头将 PNG 图像流式传输到浏览器的程序后,我注意到标签中只显示最后一帧<img>,而不是最近发送的帧。
这种行为非常烦人,因为我只在图像更改时发送更新以节省带宽,这意味着当我等待更新时,屏幕上将显示错误的帧。
具体来说,我使用的是 Brave 浏览器(基于 chromium),但由于我尝试了上下“屏蔽”,我认为这个问题至少也出现在其他基于 chromium 的浏览器中。
搜索问题只会产生一个相关结果(以及许多不相关的结果),即HowToForge线程,没有回复。同样,我也认为问题与缓冲有关,但我确保刷新缓冲区无济于事,这与线程中的用户非常相似。用户确实报告说它可以在他们的一台服务器上运行,但不能在另一台服务器上运行,这让我相信它可能与特定的 HTTP 标头或类似的东西有关。我的第一个猜测是Content-Length因为浏览器可以判断图像何时完整,但它似乎没有任何效果。
所以本质上,我的问题是:有没有办法告诉浏览器显示最新的multipart/x-mixed-replace而不是之前的?而且,如果这不是标准行为,原因可能是什么?
当然,这是相关的源代码,尽管我认为这更多的是一个一般的 HTTP 问题,而不是与代码有关的问题:
package routes
import (
"crypto/md5"
"fmt"
"image/color"
"net/http"
"time"
brain "path/to/image/generator/module"
)
func init() {
RouteHandler{
function: func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "multipart/x-mixed-replace; boundary=frame")
w.Header().Set("Cache-Control", "no-cache") // <- Just in case
w.WriteHeader(200)
// If the request contains a token and the token maps to a valid "brain", start consuming …Run Code Online (Sandbox Code Playgroud) http ×3
javascript ×2
content-type ×1
go ×1
html ×1
image ×1
keep-alive ×1
mime-types ×1
mjpeg ×1
node.js ×1
python ×1
stream ×1
twisted ×1
ubuntu-16.04 ×1
video ×1