最近我的视频播放浅学总结

news2024/11/15 12:54:55

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

我的需求是找到一个尽可能简单的方案来两人播放一段视频,并且能够进度和操作同步,所以基本不能有延迟,同时能够显示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的提问。



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12.1 基于Django的服务器信息查看应用(系统信息、用户信息)

文章目录新建Django项目创建子应用并设置本地化创建数据库表创建超级用户git管理项目(requirements.txt、README.md、.ignore)主机信息监控应用的框架搭建具体功能实现系统信息展示前端界面设计视图函数设计用户信息展示视图函数设计自定义过滤器的实现前…

华为OD机试用Python实现 -【广播服务器】

华为OD机试题 最近更新的博客华为 OD 机试 300 题大纲广播服务器题目输入输出示例一输入输出示例二输入输出Python代码代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题

常见的电脑运行卡顿原因及解决方法

大家在日常使用电脑过程中,会发现多开几个文件就卡顿,其实很多时候都跟C盘长期不清理有关,C盘的内存被下载的软件安装包、页面文件、休眠文件、更新文件等一系列的文件占据。大的文件甚至能占到20-30G,驱动人生就为大家带来几种解…

App防抓包的四种绕过方法(详细)

App防抓包的四种绕过方法简介:1、ssl证书校验(https证书校验http请求ssl证书校验)方法演示:安卓5.0怎么安装证书演示:安卓7及以上怎么把证书安卓到系统目录2、代理屏蔽3、证书绑定 (SSL pinning&#xff09…

Easyrecovery数据恢复软件工作原理及使用介绍教程

Easyrecovery是一款强大的数据恢复软件,它专门解决磁盘数据恢复问题。在计算机世界里,数据丢失经常是一件令人头疼的事情,但是有了Easyrecovery,您可以放心大胆地享受数据备份和恢复的乐趣。EasyRecovery使用Ontrack公司复杂的模式…

(JUC)核心线程 和 救急线程的区别;Executors-固定大小线程池单线程线程池

核心线程 和 救急线程的区别 救急线程是有个生存时间的,它执行完任务了,过了一段时间,没有新任务了,救急线程就会销毁掉,变成结束的状态 核心线程没有生存时间,它执行完任务后,它仍然会被保存…

人机交互(软件工程视角)第一、二章部分题目答案

我认为日常生活中,我们学校的选课系统就在选课的时候就很不方便,具体是这样的,因为本来我们学校的选课的时候服务器负载能力就比较差,大家着急忙慌地选课的时候,很容易因为界面选课控件比较小,从而直接点击…

软测入门(四)Appium-APP移动测试基础

Appium 用来测试手机程序。 测试方面: 功能测试安装卸载测试升级测试兼容测试 Android系统版本不同分辨率不同网络 网络切换、中断测试使用中来电话、短信横竖屏切换 环境搭建 Java安装(查资料)Android SDK安装,配置 HOME和P…

FPGA纯verilog手写HDMI发送IP 提供源码和技术支持

目录1、前言2、设计思路和框架TMDS 编码算法OSERDESE串并转换3、顶层源码和IP封装4、源码和IP获取1、前言 本设计使用Xilinx原语和自己手写的代码实现了HDMI发送功能,纯verilog手写,有源码,也提供封装好的IP,你喜欢用例化的方式就…

WebRTC 系列之视频辅流

WebRTC 中的 SDP 支持两种方案: PlanB 方案 和 Unified Plan 方案。早期我们使用多PeerConnection的 Plan B 方案中只支持一条视频流发送,这条视频流,我们称之为”主流”。目前我们使用单 PeerConnection 的 Unified Plan 方案,新…

二叉树——把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树 链接 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xf…

春天到了,来一场 VoxEdit 创作大赛吧!

春天的气息扑面而来,这是让你尽情绽放创造力的最佳时机!我们将以「春天」为主题来一场 VoxEdit 大赛。在这里,你可以展示你的才华并赢得 $SAND 奖励! 无论你是专业的设计师,还是仅仅喜欢创造美丽的艺术,这场…

有趣的阻抗变换

阻抗变换在很多人看来很神秘,甚至不可理喻: “什么是匹配网络?” “为什么要在负载电路之前加这么多电感电容?” “如果负载是100欧姆要与源阻抗50欧匹配,直接在负载并联一个100欧负载不就行了吗”……这样的问题常…

项目管理软件中日历的作用

为什么在项目管理软件中使用日历?日历是跟踪即将举行的会议、截止日期和里程碑的有用工具。它们可以帮助您可视化您的日程安排并提醒您重要事件,例如假期和休假时间。 虽然人们经常有各种各样的日历工具可供选择,包括从办公室墙上的纸质日历…

Stochastic Approximation 随机近似方法的详解之(二)Robbins-Monro Algorithm

6.2 Robbins-Monro Algorithm RM算法是随机近似领域的先驱性工作。众所周知的随机梯度下降算法是RM算法的一种特殊情况。后面我们再介绍具体的细节。 先看一个例子: 我们想要去求下面这个等式的根, BTW,很多问题可以被转化为求根问题。比…

嵌入式学习笔记——基于Cortex-M的单片机介绍

基于Cortex-M的单片机介绍前言生产厂商及其产品线ARM单片机的产品线命名规则留个作业习单片机的资料准备STM32开发所需手册1.芯片的数据手册作业2前言 本文继续接着上一篇中关于Cortex-M的介绍,来记录一些关于ARM系单片机的知识。 生产厂商及其产品线 芯片厂商在…

论坛性能测试难点有哪些?

1 测试工具方面 用户和业务模型分析搭建合适的脚本开发(不根据用户和业务的模型来开发脚本,认为要回归成功即可)合适的需求分析转化为场景设计(不知道如何根据需求进行场景设计)大容量系统的数据生成和使用大型系统的…

金蝶国产化中间件和人大金仓数据库

金蝶Apusic分布式消息队列不需要配置用户名密码rabbitmq:enable: truehost: 192.168.1.233port: 5672<!-- Spring Boot RabbitMQ 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</ar…

webrtc音频系列——4、RTP与RTCP协议

如果让你从0开发一套实时互动直播系统&#xff0c;你首先要选择网络传输协议。UDP 还是 TCP&#xff1f;答案是&#xff1a;UDP。为什么实时传输不能用 TCP &#xff1f;TCP 的目的就是实现数据的可靠传输&#xff0c;因此他有一套 握手&#xff0c;发送 -> 确认&#xff0c…

linux下安装jenkins

1.初始化Jenkins安装环境 系统版本&#xff1a;Red Hat Enterprise Linux 8.7 将脚本文件jenkins_install_env.sh 、 jenkins_install.sh和apache-maven-3.6.2-bin.tar.gz、jdk-8u251-linux-x64.tar.gz都上传到/usr/local/src目录下执行jenkins_install_env.sh脚本初始化Jenki…