常见方案
在网上查找的大部分解决方案都是用诸如videojs等网页播放器,接收 .m3u8索引文件的方式来播放ts切片。这种方案的缺点是需要后端对原始ts切片做处理,生成 .m3u8索引文件

ffmpeg -i source.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts

项目中已存储的 .ts 切片数量众多,已经占用了NAS服务器绝大部分的资源,生成的 .m3u8 索引虽然非常小,但会生成一堆切片后的新 .ts 视频,例如上述指令将会生成一堆 10s 长度的 ts新切片。出于各种考虑后端的同学拒绝了这种重新生成新切片加索引的方案。

优雅方案
在中文互联网搜索无果后,果断转向了Google,然而也未果,正当我绝望地准备调整心态,接受下载后VLC播放的保底方案时,终于发现了一丝线索,在vediojs的Github页面中,Issue1441 和 Issue4297 中,面对videojs能否直接播放 .ts 的疑问,开发团队都表示虽然库本身没有直接的相关实现,但可以利用相关的逻辑自行实现。最重要的是都指出了mux.js这一工具。根据实测,只用这一个库即可在web端直接播放 .ts 视频.

代码示例
示例中是以 ajax 的方式接收 .ts 二进制数据,mux.js引入方式可以直接标签引入,也可以npm install mux.js后 import进页面。

var $ = document.querySelector.bind(document);var vjsParsed,video, mediaSource;// 定义通用的事件回调处理函数,只做打印事件类型function logevent (event) {console.log(event);}// ajaxlet xhr = new XMLHttpRequest();xhr.open('GET', "./test.ts");// 接收的是 video/mp2t 二进制数据,并且arraybuffer类型方便后续直接处理 xhr.responseType = "arraybuffer";xhr.send();xhr.onreadystatechange = function () {if (xhr.readyState ==4) {if (xhr.status == 200) {transferFormat(xhr.response);} else {console.log('error');}}}function transferFormat (data) {// 将源数据从ArrayBuffer格式保存为可操作的Uint8Array格式// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffervar segment = new Uint8Array(data); var combined = false;// 接收无音频ts文件,OutputType设置为'video',带音频ts设置为'combined'var outputType = 'video';var remuxedSegments = [];var remuxedBytesLength = 0;var remuxedInitSegment = null;// remux选项默认为true,将源数据的音频视频混合为mp4,设为false则不混合var transmuxer = new muxjs.mp4.Transmuxer({remux: false});// 监听data事件,开始转换流transmuxer.on('data', function(event) {console.log(event);if (event.type === outputType) {remuxedSegments.push(event);remuxedBytesLength += event.data.byteLength;remuxedInitSegment = event.initSegment;}});// 监听转换完成事件,拼接最后结果并传入MediaSourcetransmuxer.on('done', function () {var offset = 0;var bytes = new Uint8Array(remuxedInitSegment.byteLength + remuxedBytesLength)bytes.set(remuxedInitSegment, offset);offset += remuxedInitSegment.byteLength;for (var j = 0, i = offset; j < remuxedSegments.length; j++) {bytes.set(remuxedSegments[j].data, i);i += remuxedSegments[j].byteLength;}remuxedSegments = [];remuxedBytesLength = 0;// 解析出转换后的mp4相关信息,与最终转换结果无关vjsParsed = muxjs.mp4.tools.inspect(bytes);console.log('transmuxed', vjsParsed);prepareSourceBuffer(combined, outputType, bytes);});// push方法可能会触发'data'事件,因此要在事件注册完成后调用transmuxer.push(segment); // 传入源二进制数据,分割为m2ts包,依次调用上图中的流程// flush的调用会直接触发'done'事件,因此要事件注册完成后调用transmuxer.flush(); // 将所有数据从缓存区清出来}function prepareSourceBuffer (combined, outputType, bytes) {var buffer;video = document.createElement('video');video.controls = true;// MediaSource Web API: https://developer.mozilla.org/zh-CN/docs/Web/API/MediaSourcemediaSource = new MediaSource(); video.src = URL.createObjectURL(mediaSource);$('#video-wrapper').appendChild(video); // 将H5 video元素添加到对应DOM节点下// 转换后mp4的音频格式 视频格式var codecsArray = ["avc1.64001f", "mp4a.40.5"];mediaSource.addEventListener('sourceopen', function () {// MediaSource 实例默认的duration属性为NaNmediaSource.duration = 0;// 转换为带音频、视频的mp4if (combined) {buffer = mediaSource.addSourceBuffer('video/mp4;codecs="' + 'avc1.64001f,mp4a.40.5' + '"');} else if (outputType === 'video') {// 转换为只含视频的mp4buffer = mediaSource.addSourceBuffer('video/mp4;codecs="' + codecsArray[0] + '"');} else if (outputType === 'audio') {// 转换为只含音频的mp4buffer = mediaSource.addSourceBuffer('audio/mp4;codecs="' + (codecsArray[1] ||codecsArray[0]) + '"');}buffer.addEventListener('updatestart', logevent);buffer.addEventListener('updateend', logevent);buffer.addEventListener('error', logevent);video.addEventListener('error', logevent);// mp4 buffer 准备完毕,传入转换后的数据// 将 bytes 放入 MediaSource 创建的sourceBuffer中// https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer/appendBufferbuffer.appendBuffer(bytes);// 自动播放// video.play();});};

IE8及以上 、 IE Edge 、Chrome 、 Firefox 浏览器下均能正常播放。

转载至:https://www.jianshu.com/p/4d90f81b01bc

Web端 Html5 直接播放 .ts 视频相关推荐

  1. Web端直接播放 .ts 视频及mux.js播放ts视频没有声音

    最近项目中需要前端播放 .ts 格式视频,捣鼓了几天学习到很多知识,也发掘了一种优秀的解决方案,分享给有同样需求的同学. 常见方案 在网上查找的大部分解决方案都是用诸如videojs等网页播放器,接收 ...

  2. 如何在HTML5页面播放加密视频

    如何在HTML5页面播放加密视频 - Polyv blog 如何在HTML5页面播放加密视频 Polyv移动端加密默认是可以直接支持HTML5浏览器播放的,如果担心视频在移动端被下载, 需要在Poly ...

  3. Web端H.265播放器研发解密

    音视频编解码对于前端工程师是一个比较少涉足的领域,涉及到流媒体技术中的文本.图形.图像.音频和视频多种理论知识的学习,才能够应用到具体实践中,本团队在多媒体领域深耕两年多,才算是有一定产出,我们自研w ...

  4. Web端H.265播放器研发解密 1

    音视频编解码对于前端工程师是一个比较少涉足的领域,涉及到流媒体技术中的文本.图形.图像.音频和视频多种理论知识的学习,才能够应用到具体实践中,本团队在多媒体领域深耕两年多,才算是有一定产出,我们自研w ...

  5. [html] HTML5如何播放ts视频流?

    [html] HTML5如何播放ts视频流? 引入mux.js转化,然后video展示 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣 ...

  6. Webassembly 学习3 -- 打造web端的aac 播放器

    1.引言 aac 是很常见的音频格式,压缩率比mp3 还高,H5 支持从audio 标签文件读取aac 文件并播放,但不支持从网络流中直接读取.这里借助webassembly 技术,将aac 转码成p ...

  7. 开源html5在线音乐,10 个基于 Web 的 HTML5 音乐播放器

    HTML5 是一种用于创建和呈现的网页内容的语言.这是一个革命性的语言,它拥有一些真正棒的功能和一个新的HTML5规范允许本地音频流的播放.本文向你推荐 10 个最棒的 HTML5 音频播放器,看看你 ...

  8. webview加载本地html_安卓webview html5 自动播放本地视频,网上视频,可以循环播放...

    我们做安卓开发时,webview中发现html5 视频的autoplay根本没实现,查看了下android 源码HTMLVideoElement.cpp也未见相应处理,网上有资料显示,这可能关乎UI线 ...

  9. 几款支持国标GB28181的平台以及视频监控设备接入的配置方法(Web端无插件播放)

    1. GB/T28181规范概述 GB/T28181<安全防范视频监控联网系统信息传输.交换.控制技术要求>是由公安部科技信息化局提出,由全国安全防范报警系统标准化技术委员会(SAC/TC ...

最新文章

  1. 依赖注入?依赖注入是如何实现解耦的?
  2. 史上最强!机器学习领域最全综述列表来啦!
  3. 十种创业病 你得了几个?
  4. C语言对strtok(),与strdup()介绍
  5. C++成员变量初始化顺序问题
  6. 【客户下单】后台系统匹配分区关键字实现自动分单
  7. 让 .NET 程序 Autorun
  8. 从无到有写一个运维APP(三)完结篇
  9. Google Chrome保存插件方法
  10. 最低什么样的学历,才可以选择转行web前端?
  11. PPT,要你好看(全彩)pdf
  12. Struts2中4个核心组件_笔记
  13. 移动开发作业五 近场通信技术分析与未来应用场景预测
  14. 《Python金融大数据风控建模实战》 第8章 Logistic回归模型
  15. 【CAD】CAD插件
  16. AAC的ADTS头解析
  17. android老人机桌面,孝敬父母哪家强?老人桌面大横评
  18. 【Java获取国家法定节假日三种工具类其三】
  19. YOLO中对IOU、GIOU、DIOU、CIOU的理解
  20. windows下php连接Oracle配置

热门文章

  1. 1微型计算机应用的例子,第一章 微型计算机概论.doc
  2. 头歌实训项目【学生信息转换】
  3. ac ap方案 华为_华为AC+AP无线的配置方法
  4. 2008网络盛典年度网络流行语候选:囧(jiǒng)
  5. 链路追踪:初探分布式跟踪工具Pinpoint
  6. sublime3可用激活码
  7. web 端h265播放器
  8. 硬件工程师的真实发展前途是怎么样的?
  9. 设置电脑眼睛保护色_百度经验
  10. iOS资料-插件第三方文章