首页 > 解决方案 > 从字节范围播放视频

问题描述

我正在制作一个小型应用程序,它将一部分视频文件发送给客户端以在<video>元素上播放。这是我的代码:

[RoutePrefix("api/video")]
public class VideoApiController : ApiController
{
    [Route("")]
    [HttpGet]
    public async Task<HttpResponseMessage> GetVideoAsync([FromUri] GetVideoViewModel model)
    {
        var path = System.Web.Hosting.HostingEnvironment.MapPath($"~/wwwroot/{model.FileName}");
        if (path == null || !File.Exists(path))
            return new HttpResponseMessage(HttpStatusCode.NotFound);

        using (var fileStream = File.OpenRead(path))
        {
            var bytes = new byte[model.To];
            fileStream.Read(bytes, 0, bytes.Length - 1);
            var memoryStream = new MemoryStream(bytes);
            memoryStream.Seek(0, SeekOrigin.Begin);
            var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.PartialContent);
            httpResponseMessage.Content = new ByteRangeStreamContent(memoryStream, new RangeHeaderValue(model.From, model.To), "video/webm");
            return httpResponseMessage;
        }
    }
}

然后,我用邮递员测试了我的端点。如果我选择从 0 到 100000 的字节范围(http://localhost:64186/api/video?fileName=elephants-dream.webm&from=0&to=100000),视频可以显示在结果面板上:

在此处输入图像描述

但是,当我在第一次选择从 100000 到 200000 的字节范围(http://localhost:64186/api/video?fileName=elephants-dream.webm&from=100000&to=200000)时,视频是空白的:

在此处输入图像描述

据我了解,video/webm使用编解码器,元数据包含在流的某些第一个字节中。 如果我想播放视频的一部分而不从头开始播放。我应该怎么办 ?

谢谢你。

标签: c#htmlasp.netasp.net-web-apihtml5-video

解决方案


这不是很容易做到。

流的第一部分不仅仅是一些元数据,它是告诉玩家我们正在播放的方式和内容,甚至是在流中使用的颜色信息所需的所有信息。

您可以做的是读取视频的标题提取关键帧(称为提示),然后在您的流中搜索并开始使用新的标题将比特流出来。基本上,您将从头开始构建一个仅适用于这种非常特定的视频格式(编解码器)的网络流媒体软件

但这里是帮助您入门以及如何在 C++ 中编写标头的信息

或者您使用ffmpeg并寻找关键帧以跳转到一个好位置,而让数百名其他开发人员沮丧地尖叫。

Microsoft 有一个僵尸项目,可让您将ffmpeg 包装到 c#中。

以下是ffmpeg的其他一些选项。以及如何寻找关键帧

另一种解决方案是安装视频流软件来处理这个问题。


推荐阅读