3 客户端解析m3u8播放列表,然后依次请求各段的URL,获取ts数据流。
简单流程:
3.HLS直播延迟
我们知道hls协议将直播流分成短视频进行下载和播放,因此假设列表中包含5个ts文件,每个ts文件包含5秒的视频内容,那么整体延迟为25秒。 因为当你看到这些视频的时候,主持人已经把视频录制好并上传了,所以存在由此带来的延迟。 当然,可以缩短列表的长度和单个ts文件的大小以减少延迟。 极端情况下,列表的长度可以减少到1,ts的持续时间可以减少到1s。 但是这样会增加请求数量,增加服务器压力。 当网速较慢时,Timing 会导致更多的缓冲,因此苹果官方推荐的 ts 持续时间为 10s,因此这会造成 30s 的延迟。 参考:
4、视频直播的整个流程是怎样的?
视频直播大致可以分为:
1 视频录制端:一般是电脑上的音视频输入设备或者手机上的摄像头、麦克风。 目前以手机视频为主。
2 视频播放器:可以是电脑上的播放器,也可以是手机上的原生播放器,也可以是h5视频标签等,目前以手机上的原生播放器为主。
3 视频服务器:通常是nginx服务器,用于接受视频录制端提供的视频源,同时向视频播放端提供流媒体服务。
简单流程:
5.如何采集音视频?
我们先澄清几个概念:
**视频编码:**所谓视频编码是指通过特定的压缩技术将某种视频格式文件转换为另一种视频格式文件的方法。 我们在iPhone上录制的视频必须经过编码并上传。 ,在客户端播放器中实际播放之前对其进行解码。
**编解码标准:**视频流传输中最重要的编解码标准有ITU的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 编码:**
**faac编码:**
**ffmpeg 编码:**
如果要给视频添加一些特效,比如添加滤镜,通常会在编码之前使用滤镜库,但这也会花费一些时间,并且会导致视频数据上传有一定的延迟。
简单流程:
6.前面提到的ffmpeg是什么?
和之前的x264一样,ffmpeg实际上是一套编码库。 与Xvid类似,Xvid是基于MPEG4协议的编解码器。 解码协议,通过设置参数,可以完成基于MPEG4、H.264等协议的编解码。 这里的演示使用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的。
9. 设置流媒体服务器
一个简单的推送服务器设置。 由于我们上传的视频流是基于rtmp协议的,所以服务器也必须支持rtmp。 它可能需要以下步骤:
1 安装 nginx 服务器。
2 安装nginx的rtmp扩展。 目前最常用的是
3 配置nginxconf文件:
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代表实例,您可以为首先要生成的文件设置一个随机名称。 更多配置请参考:
按照上面的步骤,一个支持rtmp的视频服务器基本已经实现了。
10.在html5页面上播放实时视频?
简单来说,可以直接使用video标签来播放hls协议的直播视频:
需要注意的是,video标签中添加了webkit-playsinline属性。 该属性是为了让视频在iOS的uiwebview中能够不全屏播放。 默认情况下,ios会全屏播放视频。 您需要将 allowedInlineMediaPlayback=YES 设置为 uiwebview。 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,并且必须添加端口号,因为上传时手机无法识别localhost 。
稍后会添加一些陷阱,其中一些需要粘贴代码,但这里列出了这些。
12、产业支持
目前,腾讯云、百度云、阿里云都有基于视频直播的解决方案。 从视频录制到视频播放和流媒体,有一系列的SDK可供使用。 缺点是需要付费。 如果可能的话,您可以自己实现。 想要一套并不难。
演示地址:
参考: