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为例)的更多相关文章

  1. iOS 微信 音频 视频自动播放

    iOS 微信 音频 视频自动播放 http://www.w3ctech.com/topic/1165

  2. HTML中的音频 视频 的播放代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. HTML5 音频视频

    HTML5 视频和音频的 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> 元素提供了方法.属性和事件. 这些方法.属性和事件允许您使用 JavaS ...

  4. HTML5媒体(音频/视频)

    摘要: 在HTML5出现之前,web媒体大部分通过Flash来实现.这种方式造成了文件大加载慢,影响网站性能,开发难度高,维护麻烦,不易扩展等.这就导致HTML5自己开始支持媒体功能.HTML5 DO ...

  5. html5音频视频专题

    html5音频视频专题 总结 1. 操作的就是video和audio两个对象,这两个对象有他们的属性和方法,通过对象的id就可以操作他们 <audio src="../video/琴箫 ...

  6. HTML-参考手册: HTML 音频/视频

    ylbtech-HTML-参考手册: HTML 音频/视频 1.返回顶部 1. HTML 音频/视频 DOM 参考手册 HTML5 DOM 为 <audio> 和 <video> ...

  7. embed标签的使用(在网页中播放各种音频视频的插件的使用)

    播放器插件使用说明: 代码:< EMBED src=“music.mid”autostart=“true”loop=“2”width=“80”height=“30”> src:音乐文件的路 ...

  8. 照相、从相册上取照片、播放音频、播放本地视频、播放网络视频、MPMoviePlayerController

    一.照相.从相册上去照片 1. 先判断是否支持照相功能 *判断当前设备是否支持照相功能,支持返回YES 否则返回NO 注意:模拟器不支持照相功能 把握一个原则只要是物理硬件相关的功能模拟器都不支持 例 ...

  9. 播放一个视频并用滚动条控制进度-OpenCV应用学习笔记二

    今天我们来做个有趣的程序实现:利用OpenCV读取本地文件夹的视频文件,并且在窗口中创建拖动控制条来显示并且控制视频文件的读取进度. 此程序调试花费了笔者近一天时间,其实大体程序都已经很快写出,结果执 ...

随机推荐

  1. php sockets扩展安装

    php sockets扩展安装   今天安装cacti发现需要php sockets扩展,而现在的lnmp没有安装,于是想到了phpzie工具安装扩展,安装方法如下: cd php-5.3.8/ext ...

  2. 软件安装——彻底卸载MySQL

    如果你的电脑里装过MySQL,想再重新安装MySQL的时候可能就会因为前一版本卸载不彻底而出现错误.最常见的就是安装好后设置参数的最后一步验证时,会在Execute configurattion步骤中 ...

  3. codevs 1098 均分纸牌 2002年NOIP全国联赛提高组 x

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必 ...

  4. Leetcode 11. Container With Most Water(逼近法)

    11. Container With Most Water Medium Given n non-negative integers a1, a2, ..., an , where each repr ...

  5. window 下 Atom 侧边栏字体大小设置

    在 File 处找到 Settings 点击 找到 Themes 点击 找到 your stylesheet 点击 在 .tree-view 处设置即可, (按照 css 样式来写即可保存生效).

  6. 微信小程序之登录用户不是该小程序的开发者

    当uniapp项目转为小程序项目的时候,预览会显示“您不是登录用户...”,所以没有办法发布,这个时候打开“project.config.json”设置一下appid,与你公众号appid一致就可以

  7. vue-router 2.0 跳转之router.push()

    router.push(location) 除了使用 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. router.push(location) 想要导航 ...

  8. Parse error: syntax error, unexpected 'class' (T_CLASS)

    电脑坏了重新下载代码. 结果报错 Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_ST ...

  9. 【初识TypeScript】 配置环境后运行Hello World编译报错.

    第一次接触TypeScript,配置好环境后, 发现连编写个最基本的Hello World都报错,代码如下: const hello:string = "Hello World!" ...

  10. vmware 虚拟 CPU 性能计数器事件与主机 CPU 不兼容。

    错误提示:虚拟 CPU 性能计数器事件与主机 CPU 不兼容. 点放弃 如果是暂时状态选关机, 丢失掉运行状态,即可保留硬盘内容重新开机