万事开头难,当我们接触一个新的领域的时候,最难的是在纷杂的声音中找到适合自己的方式。从理论出发还是从实际出发,这本不是问题。 只要适合自己理解,有利于以后发展的就是好方法 。
本篇是nginx-rtmp-module系列的第一讲,我的原则是在初期尽量少的介绍理论,从实际操作入手,先以最快的速度看到结果,保持自己的热情不被枯燥的理论浇灭。之后再从协议和封装为突破口,一步步了解视频推流的整个技术体系。
那好,按照这个原则,本讲的主要内容有:
1.搭建的方法与媒体服务的选择
2.简单的推拉流测试
一、windows环境下,快速搭建RTMP媒体服务的方法
选择 windows 主要是受项目条件的约束,我的应用环境就部署在客户端,所以我也就写在客户端环境的搭建过程。
对于媒体服务器的选择有很多,最终选用nginx-rtmp-module也是综合比较之后的结果,我把对标的产品做个简单的介绍。
由于是 windows 环境,可选择的开源项目最后聚焦在这三个产品身上。它们都有各自的特点,比如 liveGo 上来就支持三种协议的输出,如果想以 httpflv 为拉流协议的话,它就是非常好的选择。
在我的录屏推流方案中,延迟是非常重要的指标,综合再三,我选择nginx-rtmp-module做媒体服务器。
1、nginx-rtmp-module的最简安装方法
nginx-rtmp-module是nginx的一个组件,可以自己编译生成(详见第二讲),也可以从网上下载。
需要注意的是,从nginx官网上下载的版本是不带rtmp模块的,但您可以通过:
http://nginx-win.ecsds.eu/
找到包含rtmp组件的nginx版本,比如:nginx 1.7.8.1 Gryphon
备注:关于rtmp的版本支持详见version.txt中的内容,并不是所有的版本都有rmtp:)
http://nginx-win.ecsds.eu/download/Readme%20nginx-win%20version.txt
好了,指定版本的 nginx 下载解压后,可以通过 nginx -V 命令查看组件的支持情况。
我把这些信息整理一下,你能看到该版本包含的rtmp模块。
2、nginx-rtmp-module的运行方法
启动nginx的缺省配置文件是 conf/nginx.conf,一个最简单的流媒体服务配置文件如下:
#将以下内容拷贝到conf/nginx.conf文件中。
#nginx进程数,建议设置为等于CPU总核心数
worker_processes 2;
#工作模式与连接数上限
events {
worker_connections 8192;
}
rtmp_auto_push on;
rtmp {
server {
listen 1935;
application myapp {
live on;
}
}
}
当然,nginx的启动还可以通过-c 选择指定的配置文件,但是这种方法带来的问题是不能优雅退出,切记!
不出意外的话,nginx就这样顺利启动了。下一章,我们简单来验证一下推拉流服务。
二、基于ffmpeg的推拉流测试
ffmpeg是一个自由软件,它提供了一整套多媒体的解决方案,从采集、编码、转换、播放应有尽有。在流媒体应用领域不借助 ffmpeg 的力量,就好比做 windows 程序而不用 Visual Studio ,做 iOSApp 不用 XCode 一样,需要很大的勇气。
FFmpeg的安装方法我就不说了,直奔主题,从推拉流开始。
1、应用ffmpeg实现录屏推流
录屏推流是两个功能的组合,在windows平台下,录屏主要有两种方式:
- GDI
- DShow
通过命令行方式,可以直接键入以下命令:
ffmpeg -f gdigrab -i desktop -f h264 -qp 20 gdiOut.mp4
ffmpeg -f dshow -i video="screen-capture-recorder" -f h264 -qp 20 dshowOut.mp4
通过编译方式,抓屏的行为如下:
备注:DShow就是DirectShow的缩写,微软在Windows下推出的一套流媒体开发包。简单理解DShow连接的是音视频设备,你的摄像头要依赖DShow,你的USB声卡也需要DShow。
如上所述,"screen-capture-recorder"是一个虚拟设备,在使用之前,需要安装,链接是:http://sourceforge.net/projects/screencapturer/
好了,既然录屏都已经实现了,我们把输出改为媒体服务器,就完成了录屏推流的过程。
命令行的方式为:
ffmpeg -f gdigrab -i desktop -r 16 -vcodec h264 -acodec aac -f flv rtmp://192.168.10.47/myapp/pc
dshow也可以,方法参照录屏命令!
一切正常。如果改用程序调用,过程大体是采集、编码封包和发送,内容如下:
2 、应用 ffmpeg 实现拉流播放
这部分相对简单,原因就在于录屏在 windows 下有两种方式, Linux 有一种, Mac 也有一种。而播放,在全平台都只有一种,就是依赖 ffplay 实现拉流播放。
比如通过如下命令,就可以播放刚才推的流。
ffplay.exe rtmp://192.168.10.47/myapp/pc
3、小结
ffmpeg 还有很多丰富的功能,比如通过以下命令:
可以轻松地实现多通道转码,甚至剥音频。总之一句话, ffmpeg 是一个巨人,借助它的能力,我们可以迅速实现很多功能。成本低,效率高,速度快。
流媒体服务器的搭建过程就简单介绍到这了,下一讲主要是nginx与rtmp插件的编译方法和注意事项,再会!