Video(flv,mpegts)视频流解决方案

文章讨论了视频流的不同形式,如RTMP、HLS和FLV,以及它们在实时性和浏览器兼容性方面的优缺点。FLV通过flv.js实现播放,但对某些浏览器和iOS设备支持不佳。为解决这些问题,文章介绍了mpegts.js,它提供了更低延迟并扩大了浏览器支持范围。同时,文章还提到了错误处理的实现方法。
摘要由CSDN通过智能技术生成

视频流

1.直播与点播

  • 点播:从后端请求到MP4视频,前端把地址放在video的src中实现播放
  • 直播:1.获取的是流数据2.要求实时性

2.视频流形式

  1. RTSP转RTMP

底层基于 TCP,在浏览器端依赖 Flash,但是从2020底年开始,谷歌已经带头不支持flash插件了

  1. RTSP转HLS
    1. 后端将视频转成HLS流,以m3u8后缀结尾。通过浏览器用video.js可以正常播放,但是致命缺点是延迟高(10~30 秒),不符合项目的实时性需求,所以有实时视频的需求不建议用HLS流播放。
  2. RTSP转FLV
    1. flv 分为 HTTP-FLV 和 WebSocket-FLV ,两种方式都可,具体看需求

3.flv.js与mpegts.js

经过以上的分析,现阶段最适合最直播业务的为flv流,而它的缺点是前端 video 标签不能直接播放,需要经过处理才行。不过没关系,我们有flv.js!
flv.js是一个较成熟的前端处理flv格式的插件库,是B站视频的开源插件。下面为示例代码:

import flvjs from 'flv.js'
if (flvjs.isSupported()) {
  var videoPlayer = document.getElementById('video')
  var flvPlayer = flvjs.createPlayer({
    type: 'flv',
    url: 'http://test.stream.com/fetch-media.flv'
  })
  flvPlayer.attachMediaElement(videoPlayer)
  flvPlayer.load()
  flvPlayer.play()
}

但是flv依旧存在很多问题,比如浏览器兼容性问题,flv只支持包含 Chrome, FireFox, Safari 10, IE11, Edge版本的浏览器,对于Safari更高版本的浏览器是不提供支持的,且不能再ios上播放,而且对于实时性要求更高的需求,flv延迟还是显得高了些,所以flv的作者xqq在后续推出了mpegts.js,是在flv的基础上进行了优化,最佳情况下能达到 1 秒的极低延迟,且支持 Chrome、FireFox、Safari、Edge(旧版或 Chromium)或任何基于 Chromium 的浏览器,api也可以沿用flv.js的

<script src="mpegts.js"></script>
<video id="videoElement"></video>
<script>
    if (mpegts.getFeatureList().mseLivePlayback) {
        var videoElement = document.getElementById('videoElement');
        var player = mpegts.createPlayer({
            type: 'mse',  // could also be mpegts, m2ts, flv
            isLive: true,
            url: 'http://example.com/live/livestream.ts'
        });
        player.attachMediaElement(videoElement);
        player.load();
        player.play();
    }
</script>

4.异常处理

// 监听错误事件
flvPlayer.on(flvjs.Events.ERROR, (err, errdet) => {
  // 参数 err 是一级异常,errdet 是二级异常
  if (err == flvjs.ErrorTypes.MEDIA_ERROR) {
    console.log('媒体错误')
    if(errdet == flvjs.ErrorDetails.MEDIA_FORMAT_UNSUPPORTED) {
      console.log('媒体格式不支持')
    }
  }
  if (err == flvjs.ErrorTypes.NETWORK_ERROR) {
    console.log('网络错误')
    if(errdet == flvjs.ErrorDetails.NETWORK_STATUS_CODE_INVALID) {
      console.log('http状态码异常')
    }
  }
  if(err == flvjs.ErrorTypes.OTHER_ERROR) {
    console.log('其他异常:', errdet)
  }
})
FFmpeg是一个跨平台的音视频处理工具,能够对各种格式的音视频文件进行编码、解码、转码等操作。而MPEG-TS是一种常用的音视频传输格式,通常用于广播、电视等领域。 在FFmpeg中,可以通过命令行参数来实现对MPEG-TS多流的分流操作。首先,需要通过输入参数指定要处理的MPEG-TS文件,例如: ``` ffmpeg -i input.ts ``` 然后,可以通过选择要分离的流的索引号来实现分流操作。通过使用"-map"参数加上流的索引号,可以将特定的流输出为新的MPEG-TS文件。例如,下面的命令可以将输入文件中的第一个视频流和第一个音频流输出为新的MPEG-TS文件: ``` ffmpeg -i input.ts -map 0:0 -map 0:1 -c copy output.ts ``` 上述命令中的"-map 0:0"表示选择输入文件中的第一个视频流(0号输入流的第一个输出流),"-map 0:1"表示选择输入文件中的第一个音频流(0号输入流的第二个输出流)。"-c copy"表示直接复制选定的流而不进行重新编码。 除了选择特定的流,还可以将多个流合并为一个输出文件。通过使用"-map"参数加上合适的选项,可以实现多个流的合并。例如,下面的命令可以将输入文件中的第一个视频流和第二个音频流合并为一个新的MPEG-TS文件: ``` ffmpeg -i input.ts -map 0:0 -map 0:1 -c copy output.ts ``` 上述命令中的"-map 0:0"表示选择输入文件中的第一个视频流(0号输入流的第一个输出流),"-map 0:1"表示选择输入文件中的第二个音频流(0号输入流的第二个输出流)。 通过以上的命令和参数,可以很方便地使用FFmpegMPEG-TS多流进行分流操作,实现根据需要选择和合并音视频流的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值