使用ffmpeg搭建HLS直播系统

[时间:2018-04] [状态:Open]

[关键词:流媒体,stream,HLS, ffmpeg,live,直播,点播, nginx, ssegment]

0 引言

本文作为HLS综述的后续文章。

主要目的是使用ffmpeg搭建一个简单的HLS点播及直播系统。使用nginx作为HTTP服务器。

HLS不管点播还是直播,都是基于HTTP的文件分发系统,所以本文的基本思路是:

  1. 使用nginx搭建HTTP服务器
  2. 使用ffmpeg实现ts文件的分片,并生成m3u8
  3. ffmpeg使用本地文件模拟HLS直播
  4. 支持多码率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.confsites-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系统环境搭建有了大体上的认识,仅作记录,以供后续参考。

原文地址:https://www.cnblogs.com/tocy/p/using-ffmpeg-build-hls-live-system.html

时间: 2024-10-10 01:39:51

使用ffmpeg搭建HLS直播系统的相关文章

使用Nginx+FFMPEG搭建HLS直播转码服务器

目的:使Nginx支持Rtmp协议推流,并支持hls分发功能及FFMPEG转码多码率功能. 一.准备工作 模块:nginx-rtmp-module-master(支持rtmp协议) 下载地址: http://nginx.org https://github.com/arut/nginx-rtmp-module 1.安装依赖包: #yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel exp

使用Nginx+FFMPEG搭建HLS直播服务器

 目的:使Nginx支持Rtmp协议推流,并支持hls分发功能 一.准备工作 模块:nginx-rtmp-module-master(支持rtmp协议) 下载地址: http://nginx.org https://github.com/arut/nginx-rtmp-module 1.安装依赖包: #yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel get

转: 基于nginx的hls直播系统

转自:http://blog.csdn.net/cjsafty/article/details/9108587 看点: 1. 详细解解答了 nginx rtmp配置过程. 前写了一篇基于nginx的hls点播系统,本质上是把一个媒体文件做成m3u8索引,对应的文件都是提前做好放在服务器上的. nginx充当的是个Http 服务器的角色,之所以说是基于nginx的,是因为它可以设置限速. 本文主要是描述一个直播系统,核心在于m3u8和里面对于的ts链接都是实时的,可以刷新.类似于cntv里面的直播

基于HTTP Live Streaming(HLS) 搭建在线点播系统

1. 为何要使用HTTP Live Streaming 可以参考wikipedia HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议.是苹果公司QuickTime X和iPhone软件系统的一部分.它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些.当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率.在开始一个流媒体会话时,客户端会下载一个包含

如何快速搭建一个完整的移动直播系统?

移动直播行业的火热会在很长一段时间内持续,通过和各行业的整合,从而成为具有无限可能性的行业.主要因为以下三个原因: 第一,移动直播的UGC生产模式比PC端的直播更明显,人人都有设备,随时随地开播,完全顺应了互联网时代的开放性原则,能刺激更多人去创造和传播优质内容. 第二,网络带宽和速度在逐渐提高,网络成本在逐渐下降,为移动直播提供一个极佳的发展环境.文字.声音.视频.游戏等都会在移动直播中呈现,创造出更加丰富的用户体验.直播可以以SDK的形式接入到自己的应用中,比如,教育领域中的课后辅导完全可以

视频直播系统搭建过程中用到的协议

视频直播市场的火爆也催化了直播系统开发行业的发展,不少人想要搭建自己的直播平台,想要搭建直播平台就要从基础开始了解直播系统的组成.今天,就跟小编一起来学习一下搭建视频直播系统时可能会用到的协议.一.RTMP协议(Real Time Messaging Protocol)实时消息传输协议.是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.他有多种变种:1.RTMP工作在TCP之上,默认使用端口1935:2.RT

一对一直播系统搭建,主要应用于什么样的行业领域

直播系统经历了秀场直播.游戏直播之后开始慢慢的向私密化.专属化的方向发展.传统的秀场直播粉丝基数大,粉丝的参与度不高,为了增加粉丝的参与感以及直播的互动性,一对一直播系统成为目前行业的热潮.小编为您解析搭建一对一直播系统完成后,主要可以适用于什么样行业领域?一对一社交直播直播讲究的就是实时性与互动性,显然在这一方面一对一直播要比普通的秀场直播更加优秀.一对一直播可以有效地拉近主播与粉丝的距离,线上交友.线下见面,是一个很好的社交平台.运营商可以对直播系统源码进行二次开发,相应的增加适合自己的功能

nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器

本文概要: nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择.本文介绍了一种简易方法快速搭建rtmp流媒体服务器,也叫rtsp转播,数据源不是读取文件,而是采用获取rtspNal流后使用ffmpeg转播.csdn固本培元:[email protected] 开发环境:centos6.4 (主流的linux服务器选择,30%以上的市场占有率) 需要这几个包. 版本号:nginx 1.7.3  openssl 1.0.2   rtmp-module(版本未知)

Android手机直播系统开发介绍

近两年直播热的兴起也带动了直播开发行业的崛起,每个人都想要去吃直播开发这块蛋糕.但这块蛋糕也不是这么容易吃到的,在激烈的市场竞争下,有几个大的直播平台始终占据着市场中较大的份额,也有一些小的公司承受不住冲击倒下,只有拥有高精尖的技术,才能够在市场中拥有一席之地.直播开发不是一件能够容易完成的事情,安卓和苹果对于搭建的要求就不一样,今天我们就先了解一下安卓如何搭建直播系统.如果一上来就要去搭建一个直播系统,基本是不可能的,首先我们要从总体上了解直播到底是什么.手机直播要实现的就是将手机采集到的视频