目前我有一个使用webapi的工作实况流。直接从ffmpeg接收flv流,并使用PushStreamContent将其直接发送到客户端。如果网页在流启动时已经打开,则可以很好地工作。问题是,当我打开另一个页面或刷新此页面时,您不能再查看流(流仍被发送到客户端,没有问题)。我认为这是由于流开始时遗漏了一些东西,但我不确定该怎么办。如果有任何建议,我们将非常感谢。
客户端读取流的代码
public class VideosController : ApiController
{
public HttpResponseMessage Get()
{
var response = Request.CreateResponse();
response.Content = new PushStreamContent(WriteToStream, new MediaTypeHeaderValue("video/x-flv"));
return response;
}
private async Task WriteToStream( Stream arg1, HttpContent arg2, TransportContext arg3 )
{
//I think metadata needs to be written here but not sure how
Startup.AddSubscriber( arg1 );
await Task.Yield();
}
}
接收流然后发送到客户端的代码
while (true)
{
bytes = new byte[8024000];
int bytesRec = handler.Receive(bytes);
foreach (var subscriber in Startup.Subscribers.ToList())
{
var theSubscriber = subscriber;
try
{
await theSubscriber.WriteAsync( bytes, 0, bytesRec );
}
catch
{
Startup.Subscribers.Remove(theSubscriber);
}
}
}
发布于 2016-01-20 03:03:12
我不是一个流专家,但看起来你应该关闭流,然后所有的数据将被写入
await theSubscriber.WriteAsync( bytes, 0, bytesRec );
就像在WebAPI StreamContent vs PushStreamContent中提到的那样
{
// After save we close the stream to signal that we are done writing.
xDoc.Save(stream);
stream.Close();
}
https://stackoverflow.com/questions/34726257
复制相似问题