关于视频播放的断点续传实现(.NET)

来源:互联网 发布:黎明杀机刷血点软件 编辑:程序博客网 时间:2024/05/16 14:04

在实现视频播放功能时,如果不是采用了CDN服务器,而是将视频播放文件直接放在了站点下,这时考虑采用断点续传,有利于优化播放速度。而且,大多数播放器支持缓冲播放。

闲话不多说,直接上代码:

using System;using System.IO;using System.Web;using System.Web.Mvc;using System.Web.Routing;namespace Video3dApp.Controllers{public class Video3dController : Controller{public ActionResult BrandUSA() {return View();}public ActionResult Detail() {return View();}[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post | HttpVerbs.Options)]public void ReadVideo() {var reqRange = Request.Headers["Range"];string[] reqBlockRange = null;if ( !string.IsNullOrEmpty(reqRange) ) {reqBlockRange = reqRange.Replace("bytes=", "").Split('-');Response.StatusCode = 206;Response.AddHeader("status", "206");}Response.AddHeader("accept-ranges", "bytes");Response.AddHeader("access-control-allow-methods", "HEAD, GET, OPTIONS");Response.AddHeader("access-control-allow-origin", "*");Response.AddHeader("cache-control", "public, max-age=30726563");Response.AddHeader("content-disposition", $"attachment;  filename=test.mp4");Response.ContentType = "video/mp4";string fileName = Server.MapPath("/UploadFiles/test.mp4");using ( var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) )using (var reader=new BinaryReader(stream)) {long fileSize = stream.Length;long startPosition = 0;long partialSize = fileSize;if ( reqBlockRange != null ) {startPosition = Convert.ToInt32(reqBlockRange[0]);partialSize = fileSize - startPosition;}//Read partial content into the buffer with a specified sizebyte[] buffer = new byte[(int)partialSize];// go to offset address reader.BaseStream.Seek(startPosition, SeekOrigin.Begin);// fill buffer from starting at address to address + BlockSisereader.Read(buffer, 0, (int)partialSize);Response.AddHeader("content-range", $"bytes {startPosition}-{startPosition + partialSize - 1}/{fileSize}");Response.AddHeader("Content-Length", $"{partialSize}");Response.BinaryWrite(buffer);}}}}

原创粉丝点击