给奶牛做直播之三 我们讲了怎么搭建RTMP直播服务器,前几天在折腾Android直播推拉流一直没个结果,顺手整理了一下Android如何加载SO动态库,本想顺着这条路把JNI、NDK、JSBridge、Python调用SO这些一起整理出来 ,这样搞就像函数调用 A->B->C-D->E,然而没有返回一直往下很容易堆栈溢出,咱还是先回到视频相关的事情吧,上边知识点以后再扯。
给牛奶做直播之二 介绍了视频应用层HTTP和RTMP两大协议,今天我们看一下HLS协议。
HLS全称HTTP Live Stream是由Apple公司推出基于HTTP的流媒体网络协议,它的工作原理是把整个流切分成一个个小的基于HTTP协议进行文件下载。
视频的封装格式是TS
视频的编码格式是H.264,音频的格式是MP3、AAC.
控制播放的文件m3u8
注:基于HLS搭建的播放首次加载接近10秒,而RTMP3秒左右,但HLS不受防火墙影响,并且HLS除了首次加载,后续因为有m3u8索引文件会预先通过多个线程把小的TS文件下载下来.效率还是不错的。
注:上面图片来自网络,借用一下。
采集端可以是任意格式的视频,通讯也是可以任意协议。
视频服务端将原始视频流进行H.264编码 ,视频的编解码可以看 给奶牛做直播之一。
然后进行视频切片,切片后生成索引文件m3u8和很多小的ts文件
apt-get install ffmpeg
ffmpeg 是一套可以用于记录、转换数字音频、视频,并能将其转化为流的开源软件。
apt-get install libavformat-dev
m3u8-segmenter需要依赖于libavformat-dev这个库。
下载地址:https://github.com/m3u8-segmenter/m3u8-segmenter
安装依赖:不确定是否都需要,不管了,一起装。
- apt install curl build-essential automake automake1.11 libavformat-dev pkg-config ffmpeg
- aclocal
- automake -ac
- autoconf
- ./configure
- make && make install
例子:ffmpeg -y -i channel.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb channel.ts
例:m3u8-segmenter -i channel.ts -d 1 -p channel -m channel.m3u8 -u http://118.31.5.244/
每隔1秒钟切为一片,然后指定web的路径
注:ffmpeg和m3u8-segmenter安装好后,命令的参数可以使用man查看。
m3u8其实就是一个索引文件,它记录了TS文件的下载地址
上面例子生成的channel.m3u8内容如下
ts文件是一个视频封装格式,全名为MPEG-TS,每一个小片段都可以独立播放,上面m3u8-segmenter命令切片后生成的文件如下。
将生成的m3u8和所有TS文件放到Nginx目录下,然后前端整合Video.js,就可以进行播放了。
下面是淘宝同学录播课程的网络请求,可以看到一直在下载一个个小的TS文件,这样对版权也能起到一定的保护作用,除非你愿意将一个个TS再合并起来 。
http://v.xue.taobao.com/learn.htm?spm=a2174.7365753.0.0.y556Ba&courseId=53566
如果是直播的话需要动态生成m3u8和TS文件,这要复杂很多了,有时间再玩。
注:在写这个文章的时候才想起还在淘宝同学这个项目组呆过一段时间,不过视频是来自迅雷一个同事负责和淘宝视频组的人做对接,我当时好像在维护VSearch数据,对视频一直没去了解,话说前后不同项目组里共事过三个做视频的,一个来自快播,一个来自盛大,当时和他们在一起聊得最多的是妹子,没怎么聊技术,好像做视频技术都好色哈。