我正在尝试使用.NET WebRequest/WebResponse类来访问Twitter流API "http://stream.twitter.com/spritzer.json".
我需要能够打开连接并从打开的连接中逐步读取数据.
目前,当我调用WebRequest.GetResponse方法时,它会一直阻塞,直到整个响应被下载.我知道有一种BeginGetResponse方法,但这只会在后台线程上做同样的事情.在下载仍在进行时,我需要访问响应流.对于这些类,这对我来说似乎不太可能.
Twitter文档中有关于此的具体评论:
"请注意,某些HTTP客户端库仅在服务器关闭连接后才返回响应主体.这些客户端不能用于访问Streaming API.您必须使用将以递增方式返回响应数据的HTTP客户端.最强大的HTTP客户端库将提供此功能.例如,Apache HttpClient将处理此用例."
他们指向Appache HttpClient,但这没有多大帮助,因为我需要使用.NET.
是否可以使用WebRequest/WebResponse,或者我是否必须选择较低级别的网络类?也许有其他库可以让我这样做?
艾伦
客户端请求来自服务器的网页.然后Clent要求进行额外的计算; 服务器执行一系列计算并在可用时立即发送部分结果(文本格式,每行包含单独的完整项目).客户端使用服务器提供的信息更新网页(使用JavaScript和DOM).
这似乎适合Ajaxpatterns站点的HTTP Streaming(当前版本)模式.
问题是如何以跨浏览器(浏览器不可知)的方式进行,最好不使用JavaScript框架,或使用像jQuery这样的轻量级框架.
问题始于以跨浏览器方式生成XMLHttpRequest,但我认为主要项目是并非所有浏览器都能onreadystatechange从XMLHttpRequest正确实现; 并非所有浏览器都onreadystatechange在每个服务器刷新上调用事件(顺便说一下.如何在CGI脚本中强制刷新服务器(在Perl中)?).Ajaxpatterns上的示例代码通过使用计时器处理此问题; 如果我发现部分响应,我应该丢弃定时器解决方案onreadystatechange吗?
添加11-08-2009
当前解决方案:
我使用以下函数创建XMLHttpRequest对象:
function createRequestObject() {
var ro;
if (window.XMLHttpRequest) {
ro = new XMLHttpRequest();
} else {
ro = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!ro)
debug("Couldn't start XMLHttpRequest object");
return ro;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用一些(最好是轻量级)JavaScript框架,比如jQuery,如果用户选择不安装jQuery,我希望有后备.
我使用以下代码启动AJAX; setInterval因为某些浏览器onreadystatechange仅在服务器关闭连接后调用(可能需要长达数十秒),而不是在服务器刷新数据(大约每秒或更多次)之后调用.
function startProcess(dataUrl) {
http = createRequestObject();
http.open('get', dataUrl);
http.onreadystatechange = handleResponse;
http.send(null);
pollTimer = setInterval(handleResponse, 1000);
}
Run Code Online (Sandbox Code Playgroud)
该handleResponse功能是最复杂的一个,但它的草图如下所示.可以做得更好吗?如何使用一些轻量级JavaScript框架(如jQuery)?
function handleResponse() …Run Code Online (Sandbox Code Playgroud) 我有一个Stream对象偶尔会获得一些数据,但是间隔时间不可预测.流上出现的消息是明确定义的,并提前声明其有效负载的大小(大小是每个消息的前两个字节中包含的16位整数).
我想要一个StreamWatcher类来检测Stream何时有一些数据.一旦它发生,我想要引发一个事件,以便订阅的StreamProcessor实例可以处理新消息.
这可以用C#事件完成而不直接使用Threads吗?看起来它应该是直截了当的,但我无法完全理解设计这个问题的正确方法.
您将如何使用Node创建流式API ?就像Twitter流媒体API一样.
我最终要做的是从FriendFeed api获取第一个更新,并在新的可用时流(如果id不同),然后将其作为Web服务公开,以便我可以将它与我的WebSockets一起使用网站:).
到目前为止我有这个:
var sys = require('sys'),
http = require('http');
var ff = http.createClient(80, 'friendfeed-api.com');
var request = ff.request('GET', '/v2/feed/igorgue?num=1',
{'host': 'friendfeed-api.com'});
request.addListener('response', function (response) {
response.setEncoding('utf8'); // this is *very* important!
response.addListener('data', function (chunk) {
var data = JSON.parse(chunk);
sys.puts(data.entries[0].body);
});
});
request.end();
Run Code Online (Sandbox Code Playgroud)
只从FriendFeed获取数据,用节点创建Http服务器很容易,但它不能返回流(或者我还没有发现如何).
我已经看过很多帖子在SO上提出这个问题,但似乎没有一个确定的答案(或者至少是我喜欢的答案!)
我有基本身份验证(用户名/密码)背后的内容保护 - 我可以使用各种HTTP下载条款下载它,但对于我的生活,我无法理清如何告诉媒体播放器流式传输(并提供认证).我看到一篇帖子暗示它是不可能的,因为MediaPlayer是所有本机代码而不是像Authenticator那样的东西.
有很多例子说明如何首先下载到缓存副本然后再播放但是....那种糟糕的(文件可能是100的MB).我看到至少有一个建议以小块的形式下载它,然后开始和停止播放(重定向到新文件),但那种情况也很糟糕,因为我认为这是一个口吃(我还没有尝试过) )
我现在最好的想法是开始下载到缓存文件,然后当它"足够"时启动播放,同时我继续填充文件....我希望这有效(但是,再次,没有尝试过).
我错过了一些明显的东西吗 让各种各样的作品几乎正常工作真是太痛苦了,我有点说服自己必须有一种本地传输受保护内容的方法(或者让它采用已经建立的合格的InputStream),但它似乎没有乐趣.
顺便说一下,我是Mac/iPhone的家伙和Android的新手,所以我还在努力学习Java ......如果我错过了一些明显的东西,请相信.
将视频上传,编码和流媒体功能添加到我的Rails应用程序的最佳方法是什么?
我正在考虑混合:Rails app + Video Online Encoder + Amazon S3.你怎么看 ?
对于视频在线编码器(VOE),哪一个更容易使用Rails:heywatch,panvidea,encoding.com,pandastream,...?
顺便说一下,该应用程序将允许用户在运行时添加动态文本,模式和声音来播放流式视频.有一个例子:
我真正不理解的部分是FLV视频流.我以为Cloudfront可以做到这一点.
我希望我足够清楚;-)
谢谢大家的答案 !
我正在尝试在我正在开发的应用程序中创建流媒体视频DVR功能.我有一个HTTP Live Stream,我已成功在iPad上播放.我希望用户能够按下"录制"按钮,并开始录制当前正在播放的视频.可以从应用程序或相机胶卷访问此视频文件.目前,我正在使用MPMoviePlayerController对象来播放视频流.我没有看到任何从Apple文档中的对象访问数据的方法.这里有一些关于如何解决这个问题的想法.
1)以某种方式从MPMoviePlayerController访问视频数据,并将其写入文件.或者使用其他类型的播放器对象,这将允许我播放视频并访问当前播放的数据.
2)实现某种屏幕捕获记录,获取iPad屏幕的视频捕获.这将允许我以"屏幕截图"的方式记录视频.
3)找到MPMoviePlayerController存储它们的HTTP Live Streaming视频片段.据推测,他们需要存放在iPad上的某个地方进行播放.有没有办法访问这些文件?
4)在流式传输文件时,通过http手动下载流视频片段.这似乎不太理想,因为流必须下载两次.
5)这可行.定期将视频片段下载到iPhone.在iPhone上设置本地http服务器并将视频服务器提供给MPMoviePlayerController.这样,视频片段可以被标记为用于记录并组装成视频.
6)我确实控制了流媒体服务器.我可以编写一些服务器端代码来记录服务器端的视频,然后将视频发送到iPad.我宁愿不这样做.
有没有人做过这些事情?理想情况下,iPhone只能以某种方式访问视频数据并轻松记录.如果我不需要,我宁愿不进入选项4,5或6(上面).
提前致谢.
到目前为止,我认为它们与由字节组成的字节相同,并且双方需要知道另一侧的字节大小和端点并相应地转换流.然而,维基百科说byte stream!= bit stream(https://en.wikipedia.org/wiki/Byte_stream)并且bit streams专门用于视频编码(https://en.wikipedia.org/wiki/Bitstream_format).在这个RFC https://tools.ietf.org/html/rfc107中,他们讨论了这两件事并进行了描述Two separate kinds of inefficiency arose from bit streams..我的问题是:
在不断努力有效地摆弄比特的过程中(例如,参见这个SO问题),最新的挑战是比特的有效流和消费.
作为第一个简单的任务,我选择在生成的比特流中找到最长的相同比特序列/dev/urandom.典型的咒语是head -c 1000000 </dev/urandom | my-exe.实际目标是流式比特并解码Elias伽马码,例如,不是字节块或其倍数的码.
对于可变长度的这样的代码它是好的,具有take,takeWhile,group,对于列表操作等语言.由于a BitStream.take实际上会消耗部分b声,因此一些monad可能会发挥作用.
明显的起点是来自的懒惰字节串Data.ByteString.Lazy.
A.计算字节数
正如预期的那样,这个非常简单的Haskell程序与C程序相同.
import qualified Data.ByteString.Lazy as BSL
main :: IO ()
main = do
bs <- BSL.getContents
print $ BSL.length bs
Run Code Online (Sandbox Code Playgroud)
B.添加字节
一旦我开始使用unpack东西应该变得更糟.
main = do
bs <- BSL.getContents
print $ sum $ BSL.unpack bs
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,Haskell和C表现出几乎相同的表现.
C.相同位的最长序列
作为第一个非常重要的任务,可以找到最长的相同位序列,如下所示:
module Main where
import Data.Bits (shiftR, (.&.))
import qualified Data.ByteString.Lazy as BSL
import …Run Code Online (Sandbox Code Playgroud) streaming ×10
c# ×2
http ×2
javascript ×2
ajax ×1
android ×1
api ×1
asynchronous ×1
bits ×1
bitstream ×1
byte ×1
bytestream ×1
bytestring ×1
cocoa-touch ×1
comet ×1
dlna ×1
events ×1
haskell ×1
ipad ×1
iphone ×1
media-player ×1
node.js ×1
python ×1
upnp ×1
video ×1
webrequest ×1
webresponse ×1