因为想做一个类似苹果的同播共享功能,这一段时间对音视频做了一些浅浅的学习,现简单总结记录。

我的需求是找到一个尽可能简单的方案来两人播放一段视频,并且能够进度和操作同步,所以基本不能有延迟,同时能够显示WebVTT字幕,最好不需要额外的服务器。

视频流方案

前端视频流主要是用的是hls.jsflv.jsdash.js,我最后使用了hls.js

hls.js

hls.js多用于做在线视频播放,原理就是将大视频切片,分成几秒一个的小片段,这样只需要不停加载小片段就可以完整播放视频了。

使用ffmpeg来生成视频

ffmpeg -i video.mkv -b:v:0 12M -c:v h264_videotoolbox -c:s webvtt -c:a mp3 -map 0:v -map 0:a:0 -map 0:s:34 -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle,language:zh" -master_pl_name master.m3u8 -hls_time 6 -hls_playlist_type vod -muxdelay 0 video.m3u8
  • -b:v:0 12M 12M码率
  • h264_videotoolbox是mac的硬解码,目前浏览器h264还是主流,虽然最近也支持hevc了
  • -map 0:s:34取第34个字幕转成webvtt格式
  • -var_stream_map "v:0,a:0,s:0,sgroup:subtitle,language:zh"分组
  • -hls_time 6切片6秒
  • -muxdelay 0解决字幕不同步问题。

最后加载master.m3u8就可以播放了。

flv.js

flv.js是bilibili开源的,可以用来做视频直播,使用RTMP推流,但是bilibili不用这个。

使用ffmpeg推流

ffmpeg -re -i video.mkv -c:v h264_videotoolbox -f flv rtmp://localhost/live/livestream

先将视频推到流媒体服务器,在从流媒体服务器读取视频。

rtmp://localhost/live/livestream是对应的流媒体服务器,简单可用Node-Media-Server,复杂一点用srs,这个可以将RTMP流转成WebRTC流。

dash.js

dash.js也是将视频切片,可以直播也可以点播,很多大厂都用这个,比如bilibili。

WebRTC

WebRTC同样可以做视频播放,但是清晰度是由浏览器控制的,WebRTC是点对点的,虽说不需要服务器,但是需要一个信令服务器来交换信息,相当于是创建了房间号,另一个人加入房间,那这个房间号还是需要一个服务器来传递的。

我找到免费的方案就是用peer.js

我的思考

最初我考虑的是浏览器直接加载本地视频,通过WebRTC传输给对方,字幕也可以通过WebRTC传输,这样没有任何额外操作,而且WebRTC延迟够低。

但是我没有考虑到的一点问题是我下的视频基本都是HEVC HDR,所以需要转码,字幕也要转WebVTT。但是转码需要时间,浏览器可以跑Wasm,并且有个项目叫ffmpeg.wasm,如果用浏览器解码hevc的话也行,结果几百Mb的视频就在报错了,根本解不了。

既然浏览器不能解码,那我就本地解码推流RTMP浏览器用flv.js来播放,再把视频流从浏览器通过WebRTC传输,但是flv.jsvideo标签居然没有captureStream方法,不能把视频流传递给WebRTC,好家伙,再想办法,用canvas来播放视频,再调用canvascaptureStream,问题又来了,不支持HDR是一方面,主要糊的很。

WebRTC的最佳方案就是用SRS把RTMP转成WebRTC,然后浏览器上用WebRTC播放。

经过一番思考,我还是选择了hls.js的方案,我的M2转码1080p的话1个小时的视频大概是6分钟,还能接受,主要是我的电脑是动态公网IP,直接叫小伙伴访问我的本机,用hls.js播放,流畅不卡,然后再用WebRTC传输播放的操作来做同步。

所以总是在瞎折腾里学习和成长。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

最近我的视频播放浅学总结相关推荐

  1. 浅学 WebAssembly(实现视频实时滤镜效果)

    前言 WebAssembly 出来已经很久了,但是一直都没有实践过,实在是不应该,所以就趁这次国庆假期浅学一下吧.毛主席说过,"实践是检验真理的唯一标准",所以我们今天就实现一个& ...

  2. [大数据之Yarn]——资源调度浅学

    在hadoop生态越来越完善的背景下,集群多用户租用的场景变得越来越普遍,多用户任务下的资源调度就显得十分关键了.比如,一个公司拥有一个几十个节点的hadoop集群,a项目组要进行一个计算任务,b项目 ...

  3. 浅学JavaScript

    JavaScript是互联网上最流行的脚本语言,可广泛用于服务器.PC.笔记本电脑智能手机等设备: 对事件的反应: <!DOCTYPE html> <html> <hea ...

  4. TencentOS浅学过程记录

    TencentOS浅学过程记录 前言 一.RTOS 二.学习资料来源 三.初步学习过程中的疑难问题解决 任务调度以及轮询时间片 消息队列与邮箱队列 互斥锁 任务中为什么一定要加while(1)循环 内 ...

  5. 【科研】浅学Cross-attention?

    Cross-Attention in Transformer Architecture 最近,CrossViT让我所有思考,这种能过够跨膜态的模型构建?浅学一下吧! 目录 1.Cross attent ...

  6. python爬虫笔记——Scrapy框架(浅学)

    一.创建Scrapy爬虫项目 步骤: 安装scrapy:在pycharm项目(自己新建的爬虫项目)的终端输入 pip install scrapy 创建爬虫项目:同样在终端输入 scrapy star ...

  7. DO、DTO、BO、VO、POJO等各种O浅学(总结)

    DO.DTO.BO.VO.POJO等各种O浅学(总结) 有哪些 O 关键的 O :DO.DTO.VO.BO 整个数据流程传递 区别用处 VO与DTO的区别 VO与DTO的应用 DTO与DO的区别 DT ...

  8. 浅学Matlab:确定比赛的胜负问题

    女朋友突然找我帮她做线代的期末大作业,说是要用 matlab 写篇论文.我倒也一下懵了,虽说我的专业和打代码能沾点边,但我目前也只不熟练地了解 C++一门语言(各位大佬原谅我这个小白大一新生吧),完全 ...

  9. 浅学一下PPT吧 —— 真的很浅

    浅学一下PPT吧 -- 真的很浅 背景内容 详情摘要 工具介绍 工具使用 常见设置 Office背景 Office主题 无限撤回 自动保存 图片压缩 字体嵌入 多格式导出 PPT界面 大小背景 文字段 ...

最新文章

  1. SAP PI 适配器引擎
  2. 删除一个数的K位使原数变得最小
  3. CentOS-6.4-i386硬盘安装
  4. HEVC与3D-HEVC简介
  5. spring19:AspectJ的初步介绍
  6. Ubuntu18.04安装常用软件
  7. graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris
  8. 参数嗅探_SQL Server 2016参数嗅探
  9. idea java 快捷键_图示Javahtml5开发中IDEA的一些常用默认快捷键
  10. Office版本差别引发的语法问题
  11. 还在被网络上各种关于单片机行业的收入搞的眼花缭乱而烦恼吗
  12. win10电脑便签怎么换行 电脑便签记事本换行的两种方法
  13. centOS安装yasm
  14. Java之while循环基本使用
  15. 计算机软件工程专业大学排名专科,2020软件工程专业大学排名一览表
  16. 街道字符识别赛题理解
  17. CODESYS领导到访创龙科技,共同助力工业控制软硬件技术发展
  18. 《数字图像处理》冈萨雷斯,Matlab函数汇总 .
  19. 让你的桌面腾飞吧(OpenSolaris2008.05 + VirtualBox + WinXP)
  20. docker-compose安装nginx配置hppts 报错

热门文章

  1. mysql rr解决幻读吗_mysql rr隔离级别解决幻读了吗
  2. Java核心技术卷1扫盲笔记
  3. COCO数据集标注格式详解----object instances
  4. UPS FedEx DHL TNT
  5. ubuntu下最好用的截图 截屏 工具flameshot
  6. C语言模拟密码输入(显示星号)
  7. android仿抽屉动画效果,Android之仿哔哩哔哩客户端首页+抽屉式导航
  8. 为光伏发电效率保驾护航丨极海APM32F407功率优化器应用方案
  9. 校企联合学院告诉你:ERP软件排行榜
  10. C和C++的字符串有什么区别