c# - 从字节范围播放视频
问题描述
我正在制作一个小型应用程序,它将一部分视频文件发送给客户端以在<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++ 中编写标头的信息
或者您使用ffmpeg并寻找关键帧以跳转到一个好位置,而让数百名其他开发人员沮丧地尖叫。
Microsoft 有一个僵尸项目,可让您将ffmpeg 包装到 c#中。
另一种解决方案是安装视频流软件来处理这个问题。
推荐阅读
- sql - SQL:选择一系列日期范围内的所有观察?
- java - JoiningTables 使用 jpa 和休眠问题是多映射失败
- python - Python:与格式 '%Y-%m-%d %H:%M:%S' 不匹配
- kubernetes - 将 K8S 审计日志保存在 s3 存储桶中
- ios - 使用旧版构建系统时不支持包,但当前工作区已启用它
- c# - 视图模型和列表的 C# 和 ASP.NET MVC 问题
- rust - 锈溢出检查连续更多的整数操作
- javascript - 更改复选框中标签颜色的问题
- php - 将 PHP 中生成的 SHA1 密码迁移到 JavaScript 中的 Bcrypt
- android - 如何同时使用 AppCompatActivity 和 RecyclerView?