使用ffmpeg搭建HLS直播系统
[时间:2018-04] [状态:Open]
[关键词:流媒体,stream,HLS, ffmpeg,live,直播,点播, nginx, ssegment]
0 引言
本文作为HLS综述的后续文章。
主要目的是使用ffmpeg搭建一个简单的HLS点播及直播系统。使用nginx作为HTTP服务器。
HLS不管点播还是直播,都是基于HTTP的文件分发系统,所以本文的基本思路是:
- 使用nginx搭建HTTP服务器
- 使用ffmpeg实现ts文件的分片,并生成m3u8
- ffmpeg使用本地文件模拟HLS直播
- 支持多码率HLS生成
1 基于nginx的网络服务器搭建
伴随着大数据、云计算与云服务的兴起,nginx作为一款轻量级、高性能的web服务器,得到广泛的应用,其特点是占用内存小、并发能力强。目前国内的BAT基本上都在使用nginx。(如果你对nginx一无所知,不妨找找资料简单了解下)
言归正传,这里我们要是会用nginx搭建web服务器。先说明下我的系统环境:Ubuntu 15.04 (带有各种开发环境)
1.1 安装nginx
之前诸多网络资料中介绍的nginx安装都是从源码编译而来,但从目前的nginx开源环境来看,如果不修改相关代码,可以直接下载[nginx官网]((http://nginx.org)所提供的编译后的可执行文件。(如果你想从源码编译nginx,官网也有提供对应的文档)
我这里安装nginx比较简单,直接通过apt-get安装,命令如下:
sudo apt-get install nginx
就跟ubuntu上正常安装一个软件一样。
安装之后的nginx版本如下:
获取:2 http://mirrors.ustc.edu.cn/ubuntu/ precise-updates/universe nginx-common all 1.1.19-1ubuntu0.8 [17.1 kB]
获取:3 http://mirrors.ustc.edu.cn/ubuntu/ precise-updates/universe nginx-full amd64 1.1.19-1ubuntu0.8 [379 kB]
获取:4 http://mirrors.ustc.edu.cn/ubuntu/ precise-updates/universe nginx all 1.1.19-1ubuntu0.8 [5,812 B]
1.2 nginx启动及关闭
启动nginx很简单,直接使用以下命令即可:(nginx安装之后运行,需要权限较高,简单期间这里直接使用管理员启动,实际使用不建议这么做)
sudo nginx
启动之后你就可以通过ps aux | grep nginx检索到,我的主机上输出结果如下:
$ ps aux | grep nginx
root 14443 0.0 0.0 100240 3012 ? Ss 14:49 0:00 nginx: master process nginx
www-data 14444 0.0 0.0 100544 3780 ? S 14:49 0:00 nginx: worker process
www-data 14445 0.0 0.0 100544 3780 ? S 14:49 0:00 nginx: worker process
www-data 14446 0.0 0.0 100544 3780 ? S 14:49 0:00 nginx: worker process
www-data 14447 0.0 0.0 100544 3780 ? S 14:49 0:00 nginx: worker process
nginx启动成功之后,可以在浏览器中输入本机IP,就可以看到"Welcome to nginx!"的页面显示。
nginx退出可以使用nginx -s stop(强制退出,相当于直接杀进程)或nginx -s quit(优雅关闭,推荐使用)。
在修改nginx配置文件之后,可以通过nginx -s reload重新加载配置,无需重启。
1.3 配置nginx以支持html文件发布
nginx配置文件位于/etc/nginx目录下,日志文件位于/var/log/nginx下。下面是nginx配置文件的目录构成:
$ ls
conf.d koi-utf mime.types naxsi.rules proxy_params sites-available uwsgi_params
fastcgi_params koi-win naxsi_core.rules nginx.conf scgi_params sites-enabled win-utf
其中最主要的nginx.conf和sites-enabled/default两个文件。我们需要修改后者以保证网络可以访问指定目录下资源。
比如我们创建一个hls目录,放到/data/目录下,并在hls目录中创建一个名为index.html的文件,你可以在其中添加任何想添加的资源。要通过网络访问hls目录需要在sites-enabled/default中添加如下修改:
location /hls/ {
#alias /data/hls/;
root /data;
}
如果你对nginx配置文件语法感兴趣,建议参考官网中的用户手册。
修改完成之后重启nginx或者重新加载下nginx配置文件,就可以通过浏览器访问了,网址为: http://localhost/hls/index.html
到此我们基于nginx的网络服务器搭建完成,可以对外提供网络服务了。
1.4 参考资料
2. 使用ffmpeg实现文件的分片,并生成m3u8
2.1 准备工作
你需要下载或者编译一个可以在你系统运行的ffmpeg,自己编译的话请确保所有关于HLS的部分是使能的。
我是通过 https://johnvansickle.com/ffmpeg 网站下载的ubuntu下可运行的ffmpeg。
2.2 ffmpeg对文件分片①
这里使用直播中比较常用的hls_muxer对本地文件进行分片,其命令格式如下:
./ffmpeg -i s1080p.mp4 -c:v copy -c:a copy -f hls -hls_time 10 -hls_playlist_type vod high.m3u8
这里hls_time表示分片长度为10s,high.m3u8是最后输出的m3u8文件,同时这里设置了HLS类型为VOD。
成功运行之后,就可以通过 http://localhost/hls/high.m3u8 访问了。
关于ffmpeg的HLS demuxer更多参数介绍,请参考hls-doc。
2.3 ffmpeg对文件分片②
ffmpeg还提供了segment_demuxer,提供了更通用的分片机制及参数。
实现跟2.2同样的本地文件分片,可以使用下面命令:
./ffmpeg -i s1080p.mp4 -c:v copy -c:a copy -f ssegment -segment_format mpegts -segment_list shigh.m3u8 -segment_time 10 shigh%d.ts
segment_format表示输出格式,这里设置为mpegts;segment_list表示输出切片之后的文件列表;segment_time表示切片长度,最后一个字符串给定输出文件名的格式。
关于ffmpeg的segment demuxer更多参数介绍,请参考segment-doc
2.4 参考资料
3. ffmpeg使用本地文件模拟HLS直播
既然点播实现了,直播就相对简单了,你可以直接换个直播源就实现了转播,输出还是直播。当然你也可以从摄像头读取数据编码输出,也可以使用本地文件模拟直播(类似循环播放)。本文件使用最简单的本地文件模拟直播。(对于其他情况,ffmpeg直接支持各种设备和协议,换个-i参数即可。)
对于直播的情况,一般使用hls muxer。其命令格式如下:
./ffmpeg -re -i s1080p.mp4 -c:v libx264 -s 720x576 -c:a copy -f hls -hls_time 10 live.m3u8
hls muxer默认的是输出类型是直播的,所有这里去掉了设置hls_playlist_type的选项;由于我的主机性能一般,这里就不直接转码1080p的,将输出分辨率设置为720x576。
模拟直播最主要的参数是ffmpeg提供的re,这个参数的意思是按照实际帧率读取输入文件,多数用于模拟直播设备的输入的情况下。
更多信息建议参考ffmpeg-StreamingGuide
4. 支持多码率HLS生成
对于点播而言,当然可以通过独立的m3u8,然后自己编写一个master playlist来实现类似HLS多码率的效果。但是ffmpeg是否有提供类似一次性生成master playlist的机制呢?(毕竟能少一步是一步,提供效率是主要的。)
没找到网上相关的资料,那就直接看ffmpeg官网的HLS文档吧。各种命令尝试了下,最终验证可实现的命令行如下:
./ffmpeg -i s1080p.mp4 -c:v:0 copy -c:v:1 libx264 -s 640x320 -c:a:0 copy -b:a:1 32k \
-map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" 、
-hls_time 10 -hls_playlist_type vod -master_pl_name master.m3u8 out%v/out.m3u8`
这里多了几个特殊hls参数。master_pl_name用于指定输出的master playlist文件名;var_stream_map用于指定variant list中包含的节目信息,其中以空格分隔,比如上面的参数表示:variant#0中包含原始的1080p视频和音频,variant#1包含640x320的视频和32k的音频。
这个命令输出的master.m3u8格式如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1029895,RESOLUTION=1920x1080
out0/out.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=35200,RESOLUTION=640x320,CODECS="avc1.64001e,mp4a.40.2"
out1/out.m3u8
所生成的ts文件分别位于out0和out1目录下。
要是需要多码率直播,请参考2.2节和3小节的介绍
5. 小结
本文首先介绍了如何安装配置nginx,这样就可以实现http服务器,并在此基础上使用ffmpeg实现HLS点播/直播的处理,最后给出了ffmpeg命令以实现一条语句生成HLS所需的master playlist。
总体来说,做完这些让我对HLS系统环境搭建有了大体上的认识,仅作记录,以供后续参考。
使用ffmpeg搭建HLS直播系统的更多相关文章
- 使用Nginx+FFMPEG搭建HLS直播转码服务器
目的:使Nginx支持Rtmp协议推流,并支持hls分发功能及FFMPEG转码多码率功能. 一.准备工作 模块:nginx-rtmp-module-master(支持rtmp协议) 下载地址: htt ...
- 转: 基于nginx的hls直播系统
转自:http://blog.csdn.net/cjsafty/article/details/9108587 看点: 1. 详细解解答了 nginx rtmp配置过程. 前写了一篇基于nginx的h ...
- Android 自己搭建一个直播系统吧
服务端用 SRS(Simple Rtmp Server),在这里下载simple-rtmp-server需要Linux系统最好是Ubuntu,装个Ubuntu虚拟机就行了在Linux里,解压缩SRS ...
- 基于HTTP Live Streaming(HLS) 搭建在线点播系统
1. 为何要使用HTTP Live Streaming 可以参考wikipedia HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议.是 ...
- nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器
本文概要: nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择.本文介绍了一种简易方法快速搭建rtmp流媒体服务器,也叫rtsp转播,数据源不是读取文件,而是采用 ...
- 超强教程:如何搭建一个 iOS 系统的视频直播 App?
现今,直播市场热火朝天,不少人喜欢在手机端安装各类直播 App,便于随时随地观看直播或者自己当主播.作为开发者来说,搭建一个稳定性强.延迟率低.可用性强的直播平台,需要考虑到部署视频源.搭建聊天室.优 ...
- 【原创+史上最全】Nginx+ffmpeg实现流媒体直播点播系统
#centos6.6安装搭建nginx+ffmpeg流媒体服务器 #此系统实现了视频文件的直播及缓存点播,并支持移动端播放(支持Apple和Android端) #系统需要自行安装,流媒体服务器配置完成 ...
- 利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统
了解过ffmpeg的人都知道,利用ffmpeg命令即可实现将电脑中摄像头的画面发布出去,例如发布为UDP,RTP,RTMP等,甚至可以发布为HLS,将m3u8文件和视频ts片段保存至Web服务器,普通 ...
- 搭建HTTP Live Streaming直播系统
最近,需要将苹果的HTTP Live Streaming系统搭建起来.完全没有头绪,故第一步就是学习. 一.学习资料 官网资料 1. http://developer.apple.com/resour ...
随机推荐
- linux6.8安装docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- JavaScript基础笔记(十一)JSON
JSON 关于JSON,最重要的一点是理解它是一种数据格式,不是编程语言. 一.语法 JSON 不支持变量.函数或对象实例,它就是一种表示结构化数据的格式,虽然与 JavaScript 中表示数据的某 ...
- 树形动态规划(树状DP)小结
树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...
- Python3从零开始爬取今日头条的新闻【二、首页热点新闻抓取】
Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...
- BZOJ3324 : [Scoi2013]火柴棍数字
为了使数字最大,首先要最大化其位数. 设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴. 若$f[i][0][非0]\leq ...
- Three.js里自定义顶点构建三角形面的朝向问题
如上图所示,一个矩形可以由两个三角形组成 2 1 0 为朝向摄像机的方向显示 1 2 3 为朝向摄像机的方向显示
- C++学习笔记51:排序
//直接插入排序函数模板 template <class T> void insertionSort(T a[], int n) { int i, ; T temp; ; i < n ...
- HTML常用标签3
1.<a>标签,是内联标签 href:需要跳转的网址 2.id属性: 相当于一个身份证 例如: 设置id属性 3.列表标签 <ul>: 无序列表 [type属性:disc(实心 ...
- 一款开源免费的WPF图表控件ModernuiCharts
一款简洁好看的Chart控件 支持WPF.silverlight.Windows8 ,基本够用,主要是开源免费的.(商业控件ComponentOne for WPF要4w多呢) This proj ...
- 使用Spring AOP实现MySQL读写分离
spring aop , mysql 主从配置 实现读写分离,下来把自己的配置过程,以及遇到的问题记录下来,方便下次操作,也希望给一些朋友带来帮助.mysql主从配置参看:http://blog.cs ...