本章会介绍FFmpeg 的具体应用与安装配置、 NRM常用配置字典,以及直播系统中常用的 架构体系。
1. FFmpeg 介绍
FFmpeg 是一个完整的、 跨平台的解决方案,用于记录、转换和流化音/视频。 FFmpeg 采用 LGPL 或 GPL许可证,提供了录制、转换及流化音/视频的完整解决方案。 其 包含了非常先进的音/视频编解码库 libavcodec。 FFmpeg 是在 Linux 平台下开发的, 但是它同样也可以在其他操作系统环境中编译运行,包 括Windows、 Mac OS X 等系统。这个项目最早是由 Fabrice Bellard 发起的,在 2004 年至 2015 年由Michael Niedermayer 主要负责维护。 许多 FFmpeg 的开发人员都来自 MPlayer 项目组,而 且当前FFmpeg 也是被放在 MPlayer 项目组的服务器上的。 其名称来自 MPEG 视频编码标准, “FF”代表“FastForward”。
2. FFmpeg组件
FFmpeg 的组件包含 libavcodec、 libavutil、 libavfonnat、、 libavdevice、 libswscale 和 libswresample (这些都可以应用于应用程序),以及ffmpeg、 ffplay 和 ffprobe (可以被终端用 户进行编码和播放)
4. 示例
转码一个视频码率为4Mbps:
ffmpeg -i input.avi -b 4Mbps output.avi
转码一个视频为24帧
ffmpeg -i input.avi -r 24 output.avi
(1)FFmpeg 调用 libavformat 库(包含 demuxers)来读取输入文件,并获取包含编码数据 的数据包。
(2 )将编码的信息包传递给解码器。
(3 )解码器产生未压缩的rj快,可以通过过滤做进一步处理。
(4 )过滤后,帧被传递给编码器, 编码器将其编码井输出编码的数据包。 (5 )最后,这些数据包被传递给muxer, 它将编码的包写入输出文件中
FFmpeg 的安装
本节介绍FFmpeg 的安装及组件的选择。
1. 下载 先下载 ffmpeg-x.x.x.tar.bz2 (本书使用的版本为 ffmpeg-3.4. l .tar.bz2 )或通过 wget 命令在 Linux 系统中直接下载。
2. 解压 通过rz命令将下载文件上传到/download 目录中: tar - xjvf ffmpeg- 3. 4.l.tar.bz2 mv ffmpeg-3 .4.l .tar.bz2 ffmpeg cd f fmpeg
3. 配置 进行如下配置
/configure --prefix=/usr/local/ ffmpeg make & make install
基础配置信息
无论是rtmp 标签,还是server 标签,甚至是 application 标签,都可以算是核心配置信息中 的成员。因为它们的存在, 影响着整个NRM,必须要配置。
1. 「tmp rtmp 是根级标签,并且是配置中最关键的标签。
2. server 一rtmp 中可以包含多个server标签,每个 sever标签可以通过端口隔离。
rtmp{
server
{
listen 1935;
}
server
{
listen 1935;
}
}
3. listen listen 只能被放在 server 中,指定了所在 server标签绑定的端口信息
server
{
listen 1935;
}
4. application application 可以被放在 server标签中,可以包含多个application 井通过applicationName来隔离。
rtmp
{
server
{
listen 1935;
application A{
}
application B{
}
server
{
listen 1934;
application A{
}
application B{
}
}
#rtmp : //ip : 1934/A 与 rtmp: //ip: 1935/A 是 server 隔离 #rtmp : //ip : 1934/A 与 rtmp: //ip : 1934/B 是 application 隔
5. ping he ping_timeout
ping 和 ping_timeout 可以被放在rtmp 和 server 中,用于主动检查心跳,将各心跳包发送到 客户端。 ping_timeout 中设置的值为超时回复时间,如果在超时回复时间内没有得到回复, 则关 闭客户端。 ping 默认为 l 分钟, timeout默认为 30 秒, 当 ping 为0 时,关闭此功能。
6. ack_window
ack_window 可以被放在 rtmp 和 server 中,用于设置 rtmp 确认窗口大小,默认为 5000000 字节
RTMP 消息包-共分成 3 种类型。
第一类是命令(通知〉消息, 第二类是音频消息, 第三 类是视频消息。
而窗口大小则属于第一类消息, 即命令消息。 窗口大小的本意是让对端了解与 本端的通信状况,用以控制媒体传输流量的一种方案。通常,我们从RTMP服务器中拉取RTMP 流到本地时, 在协商的过程中, 会发送Ox05 和Ox06消息包,即带宽值通知, 通常设为2.5MB。 在实际的拉流过程中,我们通常隔一段时间就得向服务器报告我们已经从服务中收到了多少数 据,此种报告就是窗口大小,即 ack size 确认。 在实际开发的过程中, 通常当接收的数据量接 近于3倍带宽值 C2.5MBx3)时,向服务器报告一下目前己接收了多少数据。 在接收端的TCP协议缓存中还有多少剩余空间,发送端必须保证发迭的数据不超过这个剩 余空间,以免造成缓冲区溢出,这个窗口是接收端用来限制流量的。在传输过程中, 窗口大小 与接收端的进程取出数据的快慢有关。 ack window 5000000;
7. chunk size
chunk_size 可以被放在 rtmp 和 server 中,用于设置流中的块大小,默认是 4096 字节。这个 值越大, CPU开销就越低,但是这个值不能小于 128字节。
8. max_ message
max_ message 可以被放在 rtrnp 和 server 中, 用于设置输入数据报文最大尺寸。 所有输入数 据都会被分割成报文(然后进一步被分割为块)。 报文在处理结束之前会被放在内存中。 从理论 上讲,如果接收到的报文很大,则可能会影响服务器的稳定性。 报文默认值为 lMB,此时可以 满足大多数情况
9. buflen
buflen 可以被放在 rtmp 和 server 中, 用于设置缓冲区长度。
10. rtmp_auto_push
rtmp _auto _push 用于设置当多任务进行时,分发任务到多个进程。
11. rtmp_auto_push_reconnect
rtmp _auto _push_reconnect 用于设置当 rtrnp_auto_push 开启并因超时被销毁时, 进行重连。
12. meta
meta 可以被放在 rtmp, server 和 application 中,用于将元数据信息发送到客户端,默认 为打开
13. interleave
interleave 可以被放在 rtmp, server 和 application 中,用于交叉模式, 此模式下音/视频在同 一个chunks仕earn 上, 默认为关闭。
interleave on;
14. wait_key
wait_ key 可以被放在 门mp, server 和 application 中,用于使视频流从一个关键帧开始,默 认为关闭。 wait key on ;
15. wait video
wait_ video 可以被放在 此mp, server 和 application 中,用于禁用音频, 直到第一个视频帧发 送,默认为关闭。可以与wait_key 结合,使客户端接收视频关键帧。然而,这通常会增加连接 延迟。 可以在编码器中调整关键帧间隔以减少延迟。最新版本的IE浏览器需要设置这个选项才 能正常播放。 wait video on;
16. sync
sync 可以被放在此mp, server 和 application 中,用于同步音频流和视频流。如果客户端带 宽不足以接收到服务器的数据,那么一些l帧会被服务器删除。这导致了音频流和视频流不同步。 当时间戳差异超过指定为同步参数的值时,则将发送一个绝对帧,默认是300ms。
17. allow, deny
allow,deny 可以被放在 rtmp, server 和 application 中,用于设置白名单和黑名单。
18. play
play 可以被放在rtmp, server和 application 中,用于播放本地或远程点播文件。
19. max connections
max_ connections 可以被放在 rtmp, server 和 application 中,用于设置最大连接数。
20. access一log
access log 可以被放在此mp, server 和 application 中,用于通常来说, rtmp 日志是和 nginx/ logs/access.log 文件存放在一起的,通过 access_log 可以单独存放 rtmp_log。