音频视频的播放的进度调整(以.net为例)
Background:对于音视频在线播放,一些小应用是靠nginx处理访问视频、音频文件的请求,对外应用的一般会托管至各种云上使用相关的服务。前者存在巨大的安全隐患,后者会有一定的成本。有的时候还是需要自己造个轮子。
step 1:先实现文件下载
[HttpGet]
public IActionResult Get()
{
var filePath = @"E:\test.wav";
var name = @"tes1t.wav";
FileStream fs = new FileStream(filePath, FileMode.Open);
return File(fs, "application/octet-stream", name);
}
前面的audio标签是可以播放和正常下载的,但是并不能实现进度控件的调整
step2:请求的区别
Nginx的处理是可以实现播放进度调整的。在前端请求相同的情况下,两者用nginx代理和刚才的下载的主要区别如下:

可以看出Content-Range对应的正是请求头中的Range

关于这几个头部信息可参考这篇文章:https://blog.csdn.net/thewindkee/article/details/80189434
这3个标签同时也是文件实现断点续传的关键。
step3:断点续传
这样进度的调整就转化为了断点续传功能。
.net可参考:https://www.cnblogs.com/Leo_wl/p/8467796.html
public FileStreamResult Index(string auth,string filename)
{
if (auth != null && auth.Length >)
{
// 处理权限问题
}
else
{
return null;
} int size, end, length = ;
int start; MemoryStream Mstream;
using (FileStream reader = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
byte[] bytes = new byte[reader.Length];
//var strd = new StreamReader(reader); size = bytes.Length;
start = ;
end = size - ;
length = size;
Response.Headers["Accept-Ranges"] = "0-" + size;
if (!String.IsNullOrEmpty(Request.Headers["Range"]))
{
int anotherStart = start;
int anotherEnd = end;
var headerRange = Request.Headers["Range"];
string[] arr_split = headerRange.FirstOrDefault().Split(new char[] { Convert.ToChar("=") });
Debug.WriteLine(arr_split);
string range = arr_split[];
if (range.IndexOf(",") > -)
{
Response.Headers["Content-Range"] = "bytes " + start + "-" + end + "/" + size; Response.StatusCode = ; }
if (range.StartsWith("-"))
{
// The n-number of the last bytes is requested
anotherStart = size - Convert.ToInt32(range.Substring());
}
else
{
arr_split = range.Split(new char[] { Convert.ToChar("-") });
anotherStart = Convert.ToInt32(arr_split[]);
int temp = ;
anotherEnd = (arr_split.Length > && Int32.TryParse(arr_split[].ToString(), out temp)) ? Convert.ToInt32(arr_split[]) : size;
}
anotherEnd = (anotherEnd > end) ? end : anotherEnd;
if (anotherStart > anotherEnd || anotherStart > size - || anotherEnd >= size)
{
Response.Headers["Content-Range"] = "bytes " + start + "-" + end + "/" + size;
Response.StatusCode = ; }
start = anotherStart;
end = anotherEnd;
length = end - start + ; // Calculate new content length
reader.Read(bytes, start, length);
Response.StatusCode = ;
}
else
{
reader.Read(bytes, , bytes.Length);
}
Mstream = new MemoryStream(bytes);
}
Response.Headers["Content-Range"] = "bytes " + start + "-" + end + "/" + size;
Response.Headers["Content-Length"] = length.ToString();
Response.Headers.Add("Content-Disposition", "attachment; filename=download.wav");
return new FileStreamResult(Mstream, "applicaton/octet-stream");
}
.netcore 2.2 修改版本
音频视频的播放的进度调整(以.net为例)的更多相关文章
- iOS 微信 音频 视频自动播放
iOS 微信 音频 视频自动播放 http://www.w3ctech.com/topic/1165
- HTML中的音频 视频 的播放代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- HTML5 音频视频
HTML5 视频和音频的 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> 元素提供了方法.属性和事件. 这些方法.属性和事件允许您使用 JavaS ...
- HTML5媒体(音频/视频)
摘要: 在HTML5出现之前,web媒体大部分通过Flash来实现.这种方式造成了文件大加载慢,影响网站性能,开发难度高,维护麻烦,不易扩展等.这就导致HTML5自己开始支持媒体功能.HTML5 DO ...
- html5音频视频专题
html5音频视频专题 总结 1. 操作的就是video和audio两个对象,这两个对象有他们的属性和方法,通过对象的id就可以操作他们 <audio src="../video/琴箫 ...
- HTML-参考手册: HTML 音频/视频
ylbtech-HTML-参考手册: HTML 音频/视频 1.返回顶部 1. HTML 音频/视频 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> ...
- embed标签的使用(在网页中播放各种音频视频的插件的使用)
播放器插件使用说明: 代码:< EMBED src=“music.mid”autostart=“true”loop=“2”width=“80”height=“30”> src:音乐文件的路 ...
- 照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController
一.照相.从相册上去照片 1. 先判断是否支持照相功能 *判断当前设备是否支持照相功能,支持返回YES 否则返回NO 注意:模拟器不支持照相功能 把握一个原则只要是物理硬件相关的功能模拟器都不支持 例 ...
- 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二
今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
随机推荐
- ubuntu16.04 开启FTP服务
配置ftp 1.安装 vsftpd服务器 sudo apt install vsftpd 2.创建一个ftp文件夹 (可以跳过) sudo mkdir /home/ftp 3.新建ftp用户,并指向它 ...
- UVALive 3263: That Nice Euler Circuit (计算几何)
题目链接 lrj训练指南 P260 //==================================================================== // 此题只需要考虑线 ...
- LeetCode--079--单词搜索(python)
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...
- MySQL两个时间相减
SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01'); interval可是: SECOND 秒 SECONDS MINUTE 分钟 MINUTE ...
- Jquery $().each()与$.each(data,function(i,obj))区别
在遍历DOM时,通常用$(selector).each(function(index,element))函数: 在遍历数据时,通常用$.each(dataresource,function(index ...
- Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型
本文转自:http://www.sohu.com/a/203838233_827544 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 ht ...
- Android手机fastboot 刷机命令【转】
本文转载自:http://luke-feng.iteye.com/blog/2171090 简介:在安卓手机中fastboot是一种比recovery更底层的模式.fastboot是一种线刷,就是使用 ...
- P1439 【模板】最长公共子序列(LCS)
先来看一看普通的最长公共子序列 给定字符串A和B,求他们的最长公共子序列 DP做法: 设f[i][j]表示A[1~i]和B[1~j]的最长公共子序列的长度 那么f[i][j]=max(f[i-1][j ...
- customizable route planning 工业界地图产品的路径规划
https://www.microsoft.com/en-us/research/publication/customizable-route-planning/?from=http%3A%2F%2F ...
- C++中的集合和字典
https://blog.csdn.net/sinat_39037640/article/details/74080509