H5直播之从推流服务搭建到视频直播

最近视频直播比较火,发现目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前以 HLS 为主,PC端则以 RTMP 为主实时性较好,接下来将围绕这两种视频流协议来展开H5直播主题分享,下面通过本文给大家分享HTML5视频直播思路详解,一起看看吧

前言

前不久抽空对目前比较火的视频直播,做了下研究与探索,了解其整体实现流程,以及探讨移动端HTML5直播可行性方案。

发现目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前以 HLS 为主(HLS存在延迟性问题,也可以借助 video.js 采用RTMP),PC端则以 RTMP 为主实时性较好,接下来将围绕这两种视频流协议来展开H5直播主题分享。

一、视频流协议HLS与RTMP

1. HTTP Live Streaming

HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议,由 Apple 公司实现,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持。一些常见的客户端如:MPlayerX、VLC 也都支持 HLS 协议。

HLS 协议基于 HTTP,而一个提供 HLS 的服务器需要做两件事:

编码:以 H.263 格式对图像进行编码,以 MP3 或者 HE-AAC 对声音进行编码,最终打包到 MPEG-2 TS(Transport Stream)容器之中;分割:把编码好的 TS 文件等长切分成后缀为 ts 的小文件,并生成一个 .m3u8 的纯文本索引文件;浏览器使用的是 m3u8 文件。m3u8 跟音频列表格式 m3u 很像,可以简单的认为 m3u8 就是包含多个 ts 文件的播放列表。播放器按顺序逐个播放,全部放完再请求一下 m3u8 文件,获得包含最新 ts 文件的播放列表继续播,周而复始。整个直播过程就是依靠一个不断更新的 m3u8 和一堆小的 ts 文件组成,m3u8 必须动态更新,ts 可以走 CDN。一个典型的 m3u8 文件格式如下:

1

2

3

4

5

6

7

8

9

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000

gear1/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111

gear2/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444

gear3/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777

gear4/prog_index.m3u8

可以看到 HLS 协议本质还是一个个的 HTTP 请求 / 响应,所以适应性很好,不会受到防火墙影响。但它也有一个致命的弱点:延迟现象非常明显。如果每个 ts 按照 5 秒来切分,一个 m3u8 放 6 个 ts 索引,那么至少就会带来 30 秒的延迟。如果减少每个 ts 的长度,减少 m3u8 中的索引数,延时确实会减少,但会带来更频繁的缓冲,对服务端的请求压力也会成倍增加。所以只能根据实际情况找到一个折中的点。

对于支持 HLS 的浏览器来说,直接这样写就能播放了:

1

<video src=”./bipbopall.m3u8″ height=”300″ width=”400″  preload=”auto” autoplay=”autoplay” loop=”loop” webkit-playsinline=”true”></video>

注意:HLS 在 PC 端仅支持safari浏览器,类似chrome浏览器使用HTML5 video

标签无法播放 m3u8 格式,可直接采用网上一些比较成熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

2. Real Time Messaging Protocol

Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。这套方案需要搭建专门的 RTMP 流媒体服务如 Adobe Media Server,并且在浏览器中只能使用 Flash 实现播放器。它的实时性非常好,延迟很小,但无法支持移动端 WEB 播放是它的硬伤。

虽然无法在iOS的H5页面播放,但是对于iOS原生应用是可以自己写解码去解析的, RTMP 延迟低、实时性较好。浏览器端,HTML5 video

标签无法播放 RTMP 协议的视频,可以通过 video.js 来实现。

1

2

3

4

5

6

7

8

9

10

11

<link href=“http://vjs.zencdn.net/5.8.8/video-js.css” rel=“stylesheet”>

<video id=“example_video_1″ class=“video-js vjs-default-skin” controls preload=“auto” width=“640” height=“264” loop=“loop” webkit-playsinline>

<source src=“rtmp://10.14.221.17:1935/rtmplive/home” type=‘rtmp/flv’>

</video>

<script src=“http://vjs.zencdn.net/5.8.8/video.js”></script>

<script>

videojs.options.flash.swf = ‘video.swf’;

videojs(‘example_video_1′).ready(function() {

this.play();

});

</script>

3. 视频流协议HLS与RTMP对比

 

二、直播形式

 

目前直播展示形式,通常以YY直播、映客直播这种页面居多,可以看到其结构可以分成三层:

① 背景视频层

② 关注、评论模块

③ 点赞动画

而现行H5类似直播页面,实现技术难点不大,其可以通过实现方式分为:

① 底部视频背景使用video视频标签实现播放

② 关注、评论模块利用 WebScoket 来实时发送和接收新的消息通过DOM 和 CSS3 实现

③ 点赞利用 CSS3 动画

了解完直播形式之后,接下来整体了解直播流程。

三、直播整体流程

直播整体流程大致可分为:

视频采集端:可以是电脑上的音视频输入设备、或手机端的摄像头、或麦克风,目前以移动端手机视频为主。

 

直播流视频服务端:一台Nginx服务器,采集视频录制端传输的视频流(H264/ACC编码),由服务器端进行解析编码,推送RTMP/HLS格式视频流至视频播放端。

视频播放端:可以是电脑上的播放器(QuickTime Player、VLC),手机端的native播放器,还有就是 H5 的video标签等,目前还是以手机端的native播放器为主。

(web前端学习交流群:328058344 禁止闲聊,非喜勿进!)

四、H5 录制视频

对于H5视频录制,可以使用强大的 webRTC (Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的技术,缺点是只在 PC 的 Chrome 上支持较好,移动端支持不太理想。

使用 webRTC 录制视频基本流程

① 调用 window.navigator.webkitGetUserMedia()

获取用户的PC摄像头视频数据。

② 将获取到视频流数据转换成 window.webkitRTCPeerConnection

(一种视频流数据格式)。

③ 利用 WebScoket

将视频流数据传输到服务端。

注意:

虽然Google一直在推WebRTC,目前已有不少成型的产品出现,但是大部分移动端的浏览器还不支持 webRTC(最新iOS 10.0也不支持),所以真正的视频录制还是要靠客户端(iOS,Android)来实现,效果会好一些。

 

WebRTC支持度

WebRTC支持度

iOS原生应用调用摄像头录制视频流程

① 音视频的采集,利用AVCaptureSession和AVCaptureDevice可以采集到原始的音视频数据流。

② 对视频进行H264编码,对音频进行AAC编码,在iOS中分别有已经封装好的编码库(x264编码、faac编码、ffmpeg编码)来实现对音视频的编码。

③ 对编码后的音、视频数据进行组装封包。

④ 建立RTMP连接并上推到服务端。

五、搭建Ng

 

五、搭建Nginx+Rtmp直播流服务

安装nginx、nginx-rtmp-module

① 先clone nginx项目到本地:

brew tap homebrew/nginx

② 执行安装nginx-rtmp-module

brew install nginx-full –with-rtmp-module

2. nginx.conf配置文件,配置RTMP、HLS

查找到nginx.conf配置文件(路径/usr/local/etc/nginx/nginx.conf),配置RTMP、HLS。

① 在http节点之前添加 rtmp 的配置内容:

 

② 在http中添加 hls 的配置

 

3. 重启nginx服务

重启nginx服务,浏览器中输入 http://localhost:8080,是否出现欢迎界面确定nginx重启成功。

nginx -s reload

六、直播流转换格式、编码推流

当服务器端接收到采集视频录制端传输过来的视频流时,需要对其进行解析编码,推送RTMP/HLS格式视频流至视频播放端。通常使用的常见编码库方案,如x264编码、faac编码、ffmpeg编码等。鉴于 FFmpeg 工具集合了多种音频、视频格式编码,我们可以优先选用FFmpeg进行转换格式、编码推流。

1.安装 FFmpeg 工具

brew install ffmpeg

2.推流MP4文件

视频文件地址:/Users/gao/Desktop/video/test.mp4

推流拉流地址:rtmp://localhost:1935/rtmplive/home,rtmp://localhost:1935/rtmplive/home

1

2

3

4

//RTMP 协议流

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://10.14.221.17:1935/rtmplive/home

//HLS 协议流

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://10.14.221.17:1935/hls/test

注意:

当我们进行推流之后,可以安装VLC、ffplay(支持rtmp协议的视频播放器)本地拉流进行演示

3.FFmpeg推流命令

① 视频文件进行直播

1

2

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://192.168.1.101:1935/hls/test

ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://10.14.221.17:1935/hls/test

② 推流摄像头+桌面+麦克风录制进行直播

1

ffmpeg -f avfoundation -framerate 30 -i “1:0″ \-f avfoundation -framerate 30 -video_size 640x480 -i “0” \-c:v libx264 -preset ultrafast \-filter_complex ‘overlay=main_w-overlay_w-10:main_h-overlay_h-10′ -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://192.168.1.101:1935/hls/test

更多命令,请参考:

FFmpeg处理RTMP流媒体的命令大全

FFmpeg常用推流命令

七、H5 直播视频播放

移动端iOS和 Android 都天然支持HLS协议,做好视频采集端、视频流推流服务之后,便可以直接在H5页面配置 video 标签播放直播视频。

1

2

3

4

<video controls preload=“auto” autoplay=“autoplay” loop=“loop” webkit-playsinline>

<source src=“http://10.14.221.8/hls/test.m3u8″ type=“application/vnd.apple.mpegurl” />

<p class=“warning”>Your browser does not support HTML5 video.</p>

</video>

八、总结

本文从视频采集上传,服务器处理视频推流,以及H5页面播放直播视频一整套流程,具体阐述了直播实现原理,实现过程中会遇到很多性能优化问题。

① H5 HLS 限制必须是H264+AAC编码。

② H5 HLS 播放卡顿问题,server 端可以做好分片策略,将 ts 文件放在 CDN 上,前端可尽量做到 DNS 缓存等。

③ H5 直播为了达到更好的实时互动,也可以采用RTMP协议,通过video.js 实现播放。

以上就是本文的全部内容,希望对大家的学习有所帮助

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中连接函数的使用

Python中连接函数的使用 在Python编程中&#xff0c;连接函数是一个非常重要的部分。连接函数主要是用来连接字符串和序列。它可以把多个字符串或序列合并成一个字符串或序列。本篇文章将介绍Python中连接函数的基本用法。 连接字符串 使用加号&#xff08;&#xff09;可以…

chatgpt赋能python:Python内连接介绍

Python内连接介绍 Python是一种高级编程语言&#xff0c;因其简单易懂、易于学习、高效易用而备受欢迎。内连接是Python编程中的一个重要概念&#xff0c;其可以用于连接两个或更多数据集&#xff0c;极大地方便了数据的处理和分析。 Python内连接是指通过相同的列将两个或更…

chatgpt赋能python:Python连接Hive:深度剖析

Python连接Hive&#xff1a;深度剖析 简介 近年来&#xff0c;数据分析和处理在企业中扮演着越来越重要的角色。因此&#xff0c;数据仓库系统&#xff08;如Hive&#xff09;的需求也越来越迫切。对于数据分析工程师和开发人员而言&#xff0c;Hive提供了一种基于Hadoop的SQ…

chatgpt赋能python:Python如何连接数据库?

Python如何连接数据库&#xff1f; Python作为一种高级编程语言&#xff0c;已经被广泛应用于数据科学和Web开发。连接数据库是Python的一项重要功能&#xff0c;可以使我们的代码访问各种数据源来收集、分析和存储数据。在这篇文章中&#xff0c;我们将介绍Python如何连接各种…

【VMware workstation】虚拟机/主机互相ping不通的问题排查

环境&#xff1a;主机 Windows10 VMware workstation pro; 虚拟机 Windows XP 参考&#xff1a;VMware虚拟机和主机互相ping不通排查以及解决 workstation下载&#xff1a;感谢原作者&#xff01;截止到目前是可用的 问题描述 虚拟机无法上网&#xff0c;主机与虚拟机互相pi…

免费主机 虚拟主机 香港虚拟主机

免费主机 虚拟主机 香港虚拟主机http://zhuji.zzhinan.com/

虚拟呼叫中心运营管理平台压力测试

今次将以实际的案例来说明&#xff0c;asterisk 的并发量&#xff0c;通过对比发现asterisk 1.8 性能比asterisk1.4 版本高了很多。 普通4线程的CPU&#xff0c;2G 内存&#xff0c;Asterisk 1.8 运行100路并发&#xff0c;系统负载最大负载也只有到1&#xff0c;但是Asterisk …

host-only模式,主机能ping通虚拟机,虚拟机无法ping通主机解决办法

一、问题描述 今天配环境发现VMware下的虚拟机处于host-only模式时&#xff1a;主机能ping通虚拟机&#xff0c;虚拟机无法ping通主机。 二、解决办法 1、打开控制面板—->Windows防火墙——>允许应用或功能xxx 2.勾选“文件和打印机共享” 然后点确定。

为什么VM虚拟机ping得通主机,但主机ping不通虚拟机?

云计算这门课程要搭建hadoop集群环境&#xff0c;我就按着老师得要求&#xff0c;在我win 10里的VMware中安装了Ubuntu。 确认安装Hadoop&#xff0c;然后两台机子还要互ping。之前的步骤顺风顺水&#xff0c;到这一步就出现问题了。我主机ping不通虚拟机&#xff0c;但是Ubun…

VMware 主机与虚拟机ping不通问题

VMnet1&#xff1a;是host-only&#xff0c;也就是说&#xff0c;选择用VMnet1就相当于VMware提供了一台虚拟机&#xff0c;仅虚拟机和真实系统连接&#xff0c;虚拟机可用与真实系统共享文件&#xff0c;但是虚拟机无法访问外网 VMnet8&#xff1a;是网络地址转换&#xff08…

为什么选择香港虚拟主机?

虚拟主机的工作原理是在单个物理服务器托管多个站点——在这台共享的服务器上&#xff0c;各种用户以非常低的成本来享受资源配置&#xff0c;适合不需要高级配置或流量不高的小型网站。而位于香港数据中心的虚拟主机通常拥有免备案、高稳定性的特点&#xff0c;尤其适合拓宽国…

对于主机ping不通vmware虚拟机,虚拟机能ping通主机的一种解决方案

如果都在vmware的网络适配器的参数和主机中VMnet8网络配置好了都不能解决的话&#xff0c;可以试试重启VMnet8网络 先禁用再启动

Callnovo全球联络中心云通讯CRM平台系列(一)

技术赋能语音电话组件为全球来电顾客打造优质体验 为了实现全球客服中心优质运营管理&#xff0c;给客服中心一线客服人员和全球来电顾客打造优质体验&#xff0c;每一家进军全球市场的出海企业都一定会通过自建或者外包&#xff0c;部署一套专业且完善的全球客诉解决方案。其…

关于虚拟机能ping通主机,而主机不能ping通虚拟机的问题

Ping不通虚拟机或者主机这个问题恐怕让很多同学头疼吧&#xff1f;如果你是关于标题的问题&#xff0c;可以参考一下&#xff0c;如果是其他问题请移步其他博客。当然也欢迎大家前来阅读指正&#xff01;第一次写&#xff0c;写的不好的地方大家多包涵&#xff01; 这个问题是我…

经济回暖、兴趣电商升级,品牌在竞争白热化的市场中如何突围?| D3大会圆桌回顾

冬去春来&#xff0c;消费市场韧性回弹&#xff0c;消费趋势正处于“转折”和“跃升”的阶段。新的机遇和挑战也将伴随着新的思维、方法和模式&#xff0c;呈现出更多元的变化和创新&#xff1a;渠道虚实融合&#xff0c;内容为王&#xff0c;社会化媒体成为主战场等消费场景不…

计算机的负面影响英语作文,关于电脑的坏处英语作文

电脑&#xff0c;大家并不陌生&#xff0c;电脑能带给我们什么呢? 我觉得电脑是我们学习中的好伙伴&#xff0c;电脑可以用来查资料&#xff0c;电脑可以用来看你最想了解的新闻&#xff0c;电脑可以用来写博文&#xff0c;发表你自己的文章&#xff0c;发表你... 这学期&…

依赖计算机英语作文,过度依赖电脑的英语作文

过度依赖电脑的英语作文 在平时的学习、工作或生活中&#xff0c;大家对作文都再熟悉不过了吧&#xff0c;借助作文人们可以反映客观事物、表达思想感情、传递知识信息。为了让您在写作文时更加简单方便&#xff0c;以下是小编为大家收集的过度依赖电脑的.英语作文&#xff0c;…

【雅思】【大作文】优缺点作文举例——普通游客和科学家都可以去南极,优缺点如何?...

【雅思】【大作文】优缺点作文举例——普通游客和科学家都可以去南极&#xff0c;优缺点如何&#xff1f; 关于优缺点作文一般都是5段式&#xff1a; 1&#xff09;优点>缺点&#xff1a;开头段 、 缺点&#xff08;小缺点&#xff0c;好洗白的缺点&#xff09;、优点 、优点…

有关计算机利弊的英语作文,急需一篇有关电脑优缺点的作文(英文的)

满意答案 zhdingding 2013.05.18 采纳率&#xff1a;59% 等级&#xff1a;12 已帮助&#xff1a;10725人 I knew very many people access the net, mainly is for playing games, which is very bad for the study. Therefore, some people believed, the elementary and m…

关于计算机优点缺点的英语作文,关于网络优缺点的英语作文(精选3篇)

关于网络优缺点的英语作文(精选3篇) 在平日的学习、工作和生活里&#xff0c;大家都尝试过写作文吧&#xff0c;借助作文人们可以实现文化交流的目的。相信许多人会觉得作文很难写吧&#xff0c;下面是小编帮大家整理的关于网络优缺点的英语作文(精选3篇)&#xff0c;希望能够帮…