【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277

视频直播这么火,再不学就 out 了。

为了紧跟潮流,本文将向大家介绍一下视频直播中的基本流程和主要的技术点,包括但不限于前端技术。

1. H5 到底能不能做视频直播?

当然可以, H5 火了这么久,涵盖了各个方面的技术。

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

对于视频播放,可以使用 HLS(HTTP Live Streaming)协议播放直播流, ios 和 android 都天然支持这种协议,配置简单,直接使用 video 标签即可。

webRTC 兼容性:

video 标签播放 hls 协议视频:

 <video controls autoplay>
     <source src="http://10.66.69.77:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />
     <p class="warning">Your browser does not support HTML5 video.</p>
 </video>

2. 到底什么是 HLS 协议?

简单讲就是把整个流分成一个个小的,基于 HTTP 的文件来下载,每次只下载一些,前面提到了用于 H5 播放直播视频时引入的一个 .m3u8 的文件,这个文件就是基于 HLS 协议,存放视频流元数据的文件。

每一个 .m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8 放在 web 服务器上,ts 文件放在 cdn 上。

.m3u8 文件,其实就是以 UTF-8 编码的 m3u 文件,这个文件本身不能播放,只是存放了播放信息的文本文件:

 #EXTM3U                 m3u文件头
 #EXT-X-MEDIA-SEQUENCE   第一个TS分片的序列号
 #EXT-X-TARGETDURATION   每个分片TS的最大的时长
 #EXT-X-ALLOW-CACHE      是否允许cache
 #EXT-X-ENDLIST          m3u8文件结束符
 #EXTINF                 指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效
 mystream-12.ts

ts 文件:

HLS 的请求流程是:

1 http 请求 m3u8 的 url。

2 服务端返回一个 m3u8 的播放列表,这个播放列表是实时更新的,一般一次给出5段数据的 url。

3 客户端解析 m3u8 的播放列表,再按序请求每一段的 url,获取 ts 数据流。

简单流程:

3. HLS 直播延时

我们知道 hls 协议是将直播流分成一段一段的小段视频去下载播放的,所以假设列表里面的包含5个 ts 文件,每个 TS 文件包含5秒的视频内容,那么整体的延迟就是25秒。因为当你看到这些视频时,主播已经将视频录制好上传上去了,所以时这样产生的延迟。当然可以缩短列表的长度和单个 ts 文件的大小来降低延迟,极致来说可以缩减列表长度为1,并且 ts 的时长为1s,但是这样会造成请求次数增加,增大服务器压力,当网速慢时回造成更多的缓冲,所以苹果官方推荐的ts时长时10s,所以这样就会大改有30s的延迟。参考资料:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html

4. 视频直播的整个流程是什么?

当视频直播可大致分为:

1 视频录制端:一般是电脑上的音视频输入设备或者手机端的摄像头或者麦克风,目前以移动端的手机视频为主。

2 视频播放端:可以是电脑上的播放器,手机端的 native 播放器,还有就是 h5 的 video 标签等,目前还是已手机端的 native 播放器为主。

3 视频服务器端:一般是一台 nginx 服务器,用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。

简单流程:

5. 怎样进行音视频采集?

当首先明确几个概念:

视频编码:所谓视频编码就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式,我们使用的 iphone 录制的视频,必须要经过编码,上传,解码,才能真正的在用户端的播放器里播放。

编解码标准:视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,其中 HLS 协议支持 H.264 格式的编码。

音频编码:同视频编码类似,将原始的音频流按照一定的标准进行编码,上传,解码,同时在播放器里播放,当然音频也有许多编码标准,例如 PCM 编码,WMA 编码,AAC 编码等等,这里我们 HLS 协议支持的音频编码方式是AAC编码。

下面将利用 ios 上的摄像头,进行音视频的数据采集,主要分为以下几个步骤:

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

2 对视频进行 H264 编码,对音频进行 AAC 编码,在 ios 中分别有已经封装好的编码库来实现对音视频的编码。

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

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

ps:由于编码库大多使用 c 语言编写,需要自己使用时编译,对于 ios,可以使用已经编译好的编码库。

x264编码:https://github.com/kewlbear/x264-ios

faac编码:https://github.com/fflydev/faac-ios-build

ffmpeg编码:https://github.com/kewlbear/FFmpeg-iOS-build-script

关于如果想给视频增加一些特殊效果,例如增加滤镜等,一般在编码前给使用滤镜库,但是这样也会造成一些耗时,导致上传视频数据有一定延时。

简单流程:

6. 前面提到的 ffmpeg 是什么?

和之前的 x264 一样,ffmpeg 其实也是一套编码库,类似的还有 Xvid,Xvid 是基于 MPEG4 协议的编解码器,x264是基于 H.264 协议的编码器, ffmpeg 集合了各种音频,视频编解码协议,通过设置参数可以完成基于 MPEG4,H.264 等协议的编解码,demo 这里使用的是 x264 编码库。

7. 什么是 RTMP?

Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。和 HLS 一样都可以应用于视频直播,区别是 RTMP 基于 flash 无法在 ios 的浏览器里播放,但是实时性比 HLS 要好。所以一般使用这种协议来上传视频流,也就是视频流推送到服务器。

这里列举一下 hls 和 rtmp 对比:

8. 推流

简所谓推流,就是将我们已经编码好的音视频数据发往视频流服务器中,一般常用的是使用 rtmp 推流,可以使用第三方库 librtmp-iOS 进行推流,librtmp 封装了一些核心的 api 供使用者调用,如果觉得麻烦,可以使用现成的 ios 视频推流sdk,也是基于 rtmp 的,https://github.com/runner365/LiveVideoCoreSDK

9. 推流服务器搭建

简简单的推流服务器搭建,由于我们上传的视频流都是基于 rtmp 协议的,所以服务器也必须要支持 rtmp 才行,大概需要以下几个步骤:

1 安装一台 nginx 服务器。

2 安装 nginx 的 rtmp 扩展,目前使用比较多的是https://github.com/arut/nginx-rtmp-module

3 配置 nginx 的 conf 文件:

 rtmp {  

     server {  

         listen 1935;  #监听的端口

         chunk_size 4000;  

         application hls {  #rtmp推流请求路径
             live on;
             hls on;
             hls_path /usr/local/var/www/hls;
             hls_fragment 5s;
         }
     }
 }

4 重启 nginx,将 rtmp 的推流地址写为 rtmp://ip:1935/hls/mystream,其中 hls_path 表示生成的 .m3u8 和 ts 文件所存放的地址,hls_fragment 表示切片时长,mysteam 表示一个实例,即将来要生成的文件名可以先自己随便设置一个。更多配置可以参考:https://github.com/arut/nginx-rtmp-module/wiki/

根据以上步骤基本上已经实现了一个支持 rtmp 的视频服务器了。

10. 在 html5 页面进行播放直播视频?

简单来说,直接使用 video 标签即可播放 hls 协议的直播视频:

 <video autoplay webkit-playsinline>
     <source src="http://10.66.69.77:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />
     <p class="warning">Your browser does not support HTML5 video.</p>
 </video>

需要注意的是,给 video 标签增加 webkit-playsinline 属性,这个属性是为了让 video 视频在 ios 的 uiwebview 里面可以不全屏播放,默认 ios 会全屏播放视频,需要给 uiwebview 设置 allowsInlineMediaPlayback=YES。 业界比较成熟的 videojs,可以根据不同平台选择不同的策略,例如 ios 使用 video 标签,pc 使用 flash 等。

11. 坑点总结

简根据以上步骤,笔者写了一个 demo,从实现 ios 视频录制,采集,上传,nginx 服务器下发直播流,h5 页面播放直播视频者一整套流程,总结出以下几点比较坑的地方:

1 在使用 AVCaptureSession 进行采集视频时,需要实现 AVCaptureVideoDataOutputSampleBufferDelegate 协议,同时在- (void)captureOutput:(AVCaptureOutput )captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection )connection 捕获到视频流,要注意的是 didOutputSampleBuffer 这个方法不是 didDropSampleBuffer 方法,后者只会触发一次,当时开始写的是 didDropSampleBuffer 方法,差了半天才发现方法调用错了。

2 在使用 rtmp 推流时,rmtp 地址要以 rtmp:// 开头,ip 地址要写实际 ip 地址,不要写成 localhost,同时要加上端口号,因为手机端上传时是无法识别 localhos t的。

这里后续会补充上一些坑点,有的需要贴代码,这里先列这么多。

12. 业界支持

目前,腾讯云,百度云,阿里云都已经有了基于视频直播的解决方案,从视频录制到视频播放,推流,都有一系列的 sdk 可以使用,缺点就是需要收费,如果可以的话,自己实现一套也并不是难事哈。

demo地址:https://github.com/lvming6816077/LMVideoTest/

参考资料:http://www.nihaoshijie.com.cn/index.php/archives/615

 

http://www.cnblogs.com/bugly/p/5640069.html

 

时间: 2024-10-28 16:24:14

【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲的相关文章

新浪、搜狐、网易和腾讯四大门户将集体缺席视频直播

由于伦敦奥运会的视频直播权由央视买断.其他网站视频转播奥运会需要向央视旗下的CNTV(中国网络电视台)购买.而CNTV提供给网站的转播资源包一共分A.B.C三类中,四大门户都选择了仅包含点播权益的C类资源包.对于放弃视频播放权的原因,门户网站的负责人们提到主要是担心成本.腾讯网副总编辑王永治认为,如果花数千万去买伦敦奥运的直播权,在这么短的招商时间内,很难收回成本.搜狐网总编辑刘春也表示,购买直播权的性价比不高,伦敦奥运大都是夜间进行,即使有观众起来熬夜观看,也更倾向于选择电视. 记者发现,各大

Instagram CEO确认将增加视频直播功能

据外媒报道,Instagram今天确认,该公司正在为其图片分享应用开发视频直播功能.其CEO凯文·斯特罗姆(Kevin Systrom)周五在接受<金融时报>采访时谈到了该公司在视频直播方面的雄心. 几个星期之前,俄罗斯新闻网站T Journal首先爆出正在测试中的Instagram直播功能. 斯特罗姆表示:"生活总是会发生令人激动的事情,我认为我们可以做的更多.如果我想加强我与爱人的关系,那么视频直播将会是拉近我们关系的绝好方式." 斯特罗姆没有明说Instagram视频

腾讯旗下的8秒短视频分享应用产品微视于9月28日登陆App Store

摘要: 9月30日消息,腾讯旗下的8秒短视频分享应用产品微视于9月28日登陆App Store,凭借着操作极简.信息分离模式以及高质量的流畅播放体验,微视迅速获得用户的青睐,在微信.微博.朋友 9月30日消息,腾讯旗下的8秒短视频分享应用产品--微视于9月28日登陆App Store,凭借着操作极简.信息分离模式以及高质量的流畅播放体验,微视迅速获得用户的青睐,在微信.微博.朋友圈等社交领域中,掀起一股娱乐生活的分享热潮. 根据统计,截至29日下午18时,不到两天时间微视在App Store上的

A5站长网B2B网站运营培训经验干货分享

中介交易 SEO诊断 淘宝客 云主机 技术大厅 在参加A5站长网第二期B2B网站运营培训后我的心情还是比较激动,甚至是兴奋.首先必须感谢A5提供了一个有实力,有干货的培训平台.还要感谢培训讲师刘普老师无私分享,耐心指导.刘老师本身具有丰富的互联网运营经验,授课实在,细致耐心.充满热情,课程中也有大量干货分享.让我实实在在体会到:授人以鱼不如授人以渔.最后还有感谢充满激情的童鞋,老聂,丁生等,感谢在群里面的无私分享,从而共同进步. 通过本次B2B网站运营培训,收获巨多.有时一节课里面都无法消化,还

干货分享“微”营销之一:微博营销

我们是做网络营销策划的,当然微博营销也是我们的主要业务之一.我们一直秉承,没有经验就没有发言权的原则分享着我们最为干货的网络营销心得.目的有三:1,不让更多的企业被更多的所谓专家忽悠的团团转.2,让企业或即将想用微博做营销的企业理智的看待微博营销.3,希望我们分享能让你感觉有价值,并且将思路应用到你的工作中.闲话不多叙,我们直奔主题. 微博营销行业没有专家   一个微博,缔造了一种新的社交模式.从而也引申出很多商业模式,其中微博营销被大家传的神乎其神.当然也缔造了一些所谓的大师级别的人物.不才,

电子商务实战务实干货分享

着力于"电子商务实战务实,干货分享"的2009年派代电子商务年会上,国内各大知名电子商务企业负责人齐聚一堂,对电子商务业界"指点江山.激扬文字",不过可能更多地是将眼光放远,探索B2c电子商务未来发展之路.从众多电子商务大佬的只言片语中,一比多钟海波试图窥见他们对B2c电子商务企业发展的些许隐忧. 易讯网卜广齐:"我个人遇到的最大问题是人才,在招录人才的过程中遇到了很多的问题,电子商务又是一个多专业的行业,在物流.市场研发.客户关系管理等等方面都需要大量的

视频分享应用一下视频发布全新版本新增视频编辑功能

近日,视频分享应用"一下视频"正式发布了全新的升级版本.新版在界面的主要位置增加了拍摄按钮,为用户提供了更加方便快捷的操作通道.直观便捷的拍摄按钮另一大亮点是增加了视频编辑功能,包括视频剪辑.摄像头调焦和添加背景音乐,用户可以在视频录制完成之后,用手指轻轻拖动位于应用界面上方的蓝色选框,对录制的视频进行剪辑,截取想要的视频片段.同时可以在编辑页面的下方使用音频编辑功能.为刚刚剪辑好的视频搭配个性的音乐.新版的视频编辑功能,大幅提高了软件的用户体验,使用户编辑的视频更加个性化.并且,同时

【干货分享】QQ空间营销秘籍

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 经常看到QQ营销的干货分享,主要分类这几种方式来分享,第一:如何找QQ群或QQ好友.第二:如何加QQ群和QQ好友.第三:如果对QQ群或QQ好友发广告,试问一下,以上三点谁不会?这也叫干货的话,那么我认为还是去看看腾讯QQ的使用说明书,那可能比所谓的干货更具有权威性.OK,今天我分享的干货,并非这些,我仅分享一条QQ营销思路,简单的操作技巧还需

吐槽“干货分享”三大丧失

事实上,奈何写这篇文章的目的,很多的是在嘲讽,嘲讽什么?嘲讽我们的seo培训行业如火如荼,seo行业却是不温不火,薪资待遇就更加可怜,甚至于说,我们的seo行业是在每况愈下(因为百度接连调整的原因,也因为很多的站长和seoer自己的作弊行为,当然还有我们的斯巴达,今年seo行业受到了不小的冲击).现在很多培训都很喜欢说自己有干货分享,何谓干货?就是指具体的操作方案,能够切实可靠的帮助学员们提高自己网站的排名. 说道这里,就要提到一件挺有意思的事情,咱们网络营销行业的前辈,如果大家有所关注的话,都