音频视频的播放的进度调整(以.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读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...
随机推荐
- C++ GUI Qt4学习笔记09
C++ GUI Qt4学习笔记09 qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功 ...
- MongoDB的特殊操作
相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...
- Java日期时间以及日期相互转换_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java日期时间,以及相互转化,供大家参考,具体内容如下 package com.study.string; impor ...
- Eclipse Debug模式的开启与关闭问题简析_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 默认情况下,eclipse中右键debug,当运行到设置的断点时会自动跳到debug模式下.但由于我的eclipse环境 ...
- 【leetcode】560. Subarray Sum Equals K
题目如下:解题思路:本题的关键在于题目限定了是连续的数组,我们用一个dp数组保存第i位到数组末位的和.例如nums = [1,1,1],那么dp = [3,2,1], dp[i]表示nums[i]+n ...
- 6398. 【NOIP2018模拟10.30】Generator(树状数组区间修改)
题目描述 Description Input Output 输出 q 行,第 i 行表示数据 Di 的答案. Sample Input 4 3 2 1 1 2 4 2 1 2 1 1 3 5 2 2 ...
- ARC模式下delloc()注意事项
1.ARC模式下delloc()调用触发时机是对象被销毁,如self.属性=nil 2.ARC模式下delloc()里面不需要手动调用[super dealloc]; 因为系统已经自动调用,多此一举的 ...
- SQL把a表字段数据存到b表字段 update,,insert
update SYS_Navigation set SYS_Navigation.PARENT_XH = SYS_Power_menu.parent_id,SYS_Navigation.web_tit ...
- Dijkstra算法求最短路模板
Dijkstra算法适合求不包含负权路的最短路径,通过点增广.在稠密图中使用优化过的版本速度非常可观.本篇不介绍算法原理.只给出模板,这里给出三种模板,其中最实用的是加上了堆优化的版本 算法原理 or ...
- [CSP-S模拟测试]:木叶下(图论)
题目传送门(内部题77) 输入格式 第一行一个整数$n$,表示原先的树的点数接下来$n-1$行每行两个整数$a,b$,表示原先的树上的$n-1$条边,保证这$n-1$条边形成一棵树. 接下来一行一个整 ...