C# WebAPI PushStreamContent远程主机已关闭连接

C# WebAPI PushStreamContent远程主机已关闭连接,c#,asp.net,asp.net-web-api,video-streaming,pushstreamcontent,C#,Asp.net,Asp.net Web Api,Video Streaming,Pushstreamcontent,我正在尝试在MVC站点中使用WebAPI来流式传输带有PushStreamContent对象的视频。我已经读了一些关于这个(包括)的指南,但似乎仍然无法让它工作 当前,视频无法在浏览器中播放。一旦用户将鼠标移到视频控件上,这些控件就会被禁用。服务器上出现两个奇怪的问题/症状: 首先,在页面加载时,即使用户还没有尝试实际播放视频,服务器似乎会立即流式返回整个文件(他们只是看到标准的HTML5视频占位符-他们应该单击“播放”来查看视频).Autoplay未在视频标记中指定。我可以通过流循环中的deb

我正在尝试在MVC站点中使用WebAPI来流式传输带有PushStreamContent对象的视频。我已经读了一些关于这个(包括)的指南,但似乎仍然无法让它工作

当前,视频无法在浏览器中播放。一旦用户将鼠标移到视频控件上,这些控件就会被禁用。服务器上出现两个奇怪的问题/症状:

首先,在页面加载时,即使用户还没有尝试实际播放视频,服务器似乎会立即流式返回整个文件(他们只是看到标准的HTML5视频占位符-他们应该单击“播放”来查看视频).Autoplay未在视频标记中指定。我可以通过流循环中的debug.writeline调用看到这种情况

其次,当用户实际单击“播放”时,会出现以下错误: 远程主机已关闭连接。错误代码为0x800704CD

这是我的密码:

    public class VideoController : ApiController
{
    [ActionName("Get")]
    public System.Net.Http.HttpResponseMessage Get(string fsoId)
    {
        var videoFullPath = GetPathToVideo(fsoId);
        var response = Request.CreateResponse();

        response.Content = new System.Net.Http.PushStreamContent( async (outputStream, context, transport) =>
                    {
                        try
                        {
                            var buffer = new byte[65536];

                            using (var videoFile = System.IO.File.Open(videoFullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                            {
                                var length = (int)videoFile.Length;
                                var bytesRead = 1;

                                while (length > 0 && bytesRead > 0)
                                {
                                    bytesRead = videoFile.Read(buffer, 0, Math.Min(length, buffer.Length));
                                    System.Diagnostics.Debug.WriteLine(string.Format("Length at Start: {0}; bytesread: {1}", length, bytesRead));

                                    await
                                        outputStream.WriteAsync(buffer, 0, bytesRead);

                                    length -= bytesRead;
                                }
                            }
                        }
                        catch (System.Web.HttpException httpEx)
                        {
                            System.Diagnostics.Debug.WriteLine(httpEx.GetBaseException().Message);
                            if (httpEx.ErrorCode == -2147023667) // The remote host closed the connection. 
                                return;
                        }
                        catch (Exception ex)
                        {
                            System.Diagnostics.Debug.WriteLine(ex.GetBaseException().Message);
                            return;
                        }
                        finally
                        {
                            outputStream.Close();
                        }
                    },
            new System.Net.Http.Headers.MediaTypeHeaderValue("video/mp4"));            

        return response;
    }
}
这是我的视频标签:

        <video width="320" height="240" controls>
          <source src="api/video/12345" type="video/mp4">
            Your browser does not support the video tag.
        </video>

您的浏览器不支持视频标记。

我发现了问题所在:这是视频。视频没有格式化为快速启动(文件开头有元数据)。因此,使用此ffmpeg命令重新生成视频实现了以下目的:

ffmpeg -1 MyVideo.mp4 -movflags faststart MyNewVideo.mp4
本质上,浏览器是在请求/下载整个视频文件,以便读取最后嵌入的元数据

一旦我解决了这个问题,就不再下载整个文件,也不再出现“远程主机关闭连接”错误。这不是最直观的错误消息

如果有人知道如何在一开始就确定一个现有的视频是否有元数据,我很想听听怎么做


我希望这对某人有所帮助。

嗨,Ryan。你找到关于这方面的消息了吗?我正在努力解决这个错误。另一方面,你在哪里找到这个“ffmpeg”command?Thank.ffmpeg可以在这里找到:。我还没有找到任何关于如何判断现有视频的元数据是否位于文件的前端或末尾的信息。祝您好运!您可以使用GPAC的MP4Box()和
-info
参数来确定元数据的排列是否允许渐进下载。(道具:)