移动端自动播放视频之TS视频

代码幽篁使
• 阅读 4947

ts简介

TS(Transport Stream,传输流)是一种封装的格式,它的全称为MPEG2-TS。是一种视频格式,一般用于实时流媒体和广播电视领域。

Ts与Mp4优势对比

Mp4IOS下可以自动播放,但是在部分安卓机下无法自动播放产生黑屏。
Ts可实现自动播放,IOS8以上和Android4.4以上都支持。
基于自动播放的优势,本妹子在本厂的618大促主会场及各个活动需求上就用了Ts技术。

生成ts视频

需要下ffmpeg来将Mp4转化成Ts视频。下面下载操作如下所示:
mac下可以运行

 brew install ffmpeg

windows下可以在https://ffmpeg.zeranoe.com/builds/中下载。

然后用ffmpeg 转化

ffmpeg -i in.mp4 -f mpegts -codec:v mpeg1video -codec:a mp2 -b 0 out.ts

还可以控制视频大小(-s),帧速率(-r),视频比特率(-b:v),音频比特率(-b:a),音频通道数(-ac),采样率(-ar ) 以及更多。 有关详细信息,请参阅ffmpeg文档
如下所示

ffmpeg -i in.mp4 -f mpegts \
    -codec:v mpeg1video -s 960x540 -b:v 1500k -r 30 -bf 0 \
    -codec:a mp2 -ar 44100 -ac 1 -b:a 128k \
    out.ts
  • 注意:尽量用高质量的MP4来转成Ts,如果在手机上显示,采用比特率1500k即可。ffmpeg -i in.mp4 -f mpegts -codec:v mpeg1video -b:v 1500k -codec:a mp2 out.ts

播放ts视频

推荐用jsmpeg-player,它是基于jsmpeg封装的npm包。
最好准备一个封面,将视频盖住,等视频播发再去掉封面,详情如下:

import React, { useEffect, useState, useRef } from 'react';
import './index.less';
import JSMpeg from '@cycjimmy/jsmpeg-player';

export default function VideoTs(props) {
  //封面
  const cover ='https://img11.360buyimg.com/imagetools/jfs/t1/105707/30/17596/32160/5e8c8ae6Ee2bfd8db/1ef4084de9ec103f.jpg'
  const tsSrc='https://storage.360buyimg.com/xingdianzhang/%E6%B5%8B%E8%AF%95ts.ts'
  const hdVideo = useRef(null);
  var [isCover, setIsCover] = useState(true);//是否用封面覆盖
  useEffect(() => {
    initTs()
  }, [])

  function initTs() {
    let canvas = hdVideo.current.querySelector('.hdVideo-ts');
    canvas.style.width = '0px'
    new JSMpeg.VideoElement(canvas, tsSrc, {
      canvas,
      autoplay: true,
      loop: true,
      progressive: false,//是否为chunk
      control: false,
      poster: cover,
      preserveDrawingBuffer: true,
      decodeFirstFrame: true,
      disableGl: true,
    }, {
      audio: false, //静音
      onPlay: () => {
        canvas.style.width = hdVideo.current.clientWidth + 'px'
        setIsCover(false)
      }
    })
  }
  
  return (
    <div ref={hdVideo} className='hdVideo'>
      {isCover ? <img className="hdVideo-image" src={cover} /> : null}
      <canvas className="hdVideo-ts"></canvas> 
    </div>
  );
}
<!--index.less-->
.hdVideo{
    width: 750px;
    height: 400px;
    .hdVideo-image{
        width: 100%;
        height: 100%;
    }
    .hdVideo-ts{
        width: 100%;
        height: 100%;
    }
}

注意的坑

兼容性问题

Ts存在兼容问题,系统版本 < android7 || 系统版本 < ios 11, Ts不兼容,可以以图片第一帧为兜底图片

Apple自动播放没有声音

Apple设备会自动播放无声音的声音,您需要引导用户单击视频图标右下角的视频以解锁声音。 (在非自动播放模式下没有类似问题)
安卓机型声音没有问题。

npm插件

根据兼容性问题,本妹子写了个自动播放视频插件jdyfe-tpl-videots,欢迎小伙伴们使用。

使用方法

cover是指兜底图片,当视频加载或不兼容TS时显示。
tsSrcTS视频路径。

import VideoTs from '@zero/jdyfe-tpl-videots';
import React, { Component } from 'react'
export default function Home(props) {
  return (
    <VideoTs className='tsClass' cover='https://img11.360buyimg.com/imagetools/jfs/t1/105707/30/17596/32160/5e8c8ae6Ee2bfd8db/1ef4084de9ec103f.jpg' 
    tsSrc='https://storage.360buyimg.com/xingdianzhang/%E6%B5%8B%E8%AF%95ts.ts'  />
  )
}

Happy coding .. :)

相关链接

博客原文

jdyfe-tpl-videots包

https://www.reneelab.com.cn/what-is-ts-file-and-how-to-play-ts-video.html

ffmpeg文档

jsmpeg-player包

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
LiveVideoStack线上分享第三季(十四):FLV封装格式介绍及解析
随着流媒体的高速发展,FLV成为了最主流的视频流传输封装格式,但是作为占市场较大份额的Web端的实际应用中,各大浏览器却没有对FLV解码做完善的支持。8月17日20:00,LiveVideoStack线上分享第三季,第十四期,高顿网校平台开发部流媒体工程师戴兵将对比FLV实际文件带大家详细了解一下它的具体格式标准。!(h
Wesley13 Wesley13
3年前
MATLAB
%PIDControllerclearall;closeall;ts0.001;%采样时间0.001s systf(5.235e005,1,87.35,1.047e004,0);%建立被控对象传递函数dsysc2d(sys,ts,'z');
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Angular技巧汇总
一、声明全局的类型定义  声明项目的全局类型,同时不需要在各个Ts文件中import{XXX}from'xxx' ,就能直接引用!方法是:     增加src/typings.d.ts文件,在文件中增加 interfaceIName{ name:string;}的类型定义。   那么
凿壁偷光 凿壁偷光
2年前
mac视频格式转换工具Thunder Video Converter Pro for Mac
ThunderVideoConverterProforMac是mac上一款非常好用的视频格式转换工具,可以将各种主流视频格式,如RM、RMVB、VOB、DAT、VCD、SVCD、DVD、ASF、WMV、MP4、3GP、MOV、QT、MPEG、DivX、XviD、AVI、3GPP2、DV等视频格式转换为MP4播放机、MP4手机、智能手机、平板电脑、苹果iPad、iPhone手机、iPod、SonyPSP、PS3机所支持的便携视频格式。
铁扇公主 铁扇公主
1年前
Mac电脑最佳的视频转换推荐 MacX Video Converter Pro 激活中文版
MacXVideoConverterPro是一款专业的视频转换软件,专为Mac用户设计。它提供全面而强大的视频处理功能,支持超过320种视频和音频格式的相互转换,如MKV、AVCHD、M2TS、MP4等。用户只需简单拖放视频文件到软件界面,选择想要的输出格