nginx+ffmpeg实现流媒体

初步记录实现流媒体播放。

流媒体身边太常见了,比如网易云音乐、qq音乐、爱奇艺、哔哩哔哩之类的,只要是媒体数据在服务器上,动态的传输到客户端进行播放的都算是流媒体。实现流媒体的视频播放是最简单的,表现得现象是:ffmpeg安装完后默认就是视频流,实际我想实现得是纯音频流,类似于音乐播放软件一样仅播放歌曲,目前还在进一步研究中,这里初步记录流媒体得实现。

 

NG+FFmpeg组合实现流媒体,那么NG和FFmpeg到底在其中实现了什么:

NG:功能就只是网络入口,虽然NG得rtmp模块存在,但实际上,rtmp模块也只是作为一个服务端数据入口,这个入口对接客户端,默认端口是1935,当客户端访问1935数据,验证正确的信息后,客户端就可以获取1935这个端口的数据,而1935端口数据来源,这是等待rtmp模块推送的。所以NG+NG-rtmp模块功能只是做通信而已。

FFmpeg:这是一个软件,准确的叫做一个工具,此工具里面又分多个软件。这个工具的作用是把视频、音频进行解码、转换、切片、最后推送到指定位置。指定位置可以是本地文件夹进行数据输出,也可以是NG的rtmp数据接口位置。所以当FFmpeg把数据处理完后发送到ng的1935端口,客户就可以在1935端口获取数据,获取数据后再进行解码操作即实现流媒体播放。

 

FFmpeg工具超级强大,关于他的书籍也很多,本人也刚开始研究。对我的理解来看,切片操作是很容易理解的,因为视频歌曲文件都非常大不可能秒级传输完,所以把这个数据切分成几秒一个的音视频文件就可以通过网络传输到客户端进行播放,虽然单点播放只有秒级画面,但通过时时传输就实现了时时播放的流媒体。

解码和封装,可以更多了解。

搭建ng+ng rtmp模块已在之前的文章写过。ffmpeg直接yum安装即可。

安装完成后需要新建一个文件夹来存放需要播放的测试文件。

ng的配置文件需要田间ng-rtmp模块的功能代码,使得1935端口能收到ng的监听并且获取访问后直接调用rtmp指定文件夹的数据。

以下配置文件添加到NG配置文件最后面,大括号外:

rtmp {  #保存所有rtmp配置的块
    server {  #声明一个rtmp实例
        listen 1935;  #给Nginx添加一个监听端口以接收rtmp连接
        chunk_size 4096;  #流整合的最大的块大小。默认值为4096。这个值设置的越大CPU负载就越小。这个值不能低于128
        application test{  #app的名字为mp4
                live on;  #切换直播模式,即一对多广播
                
                }
        }
}

application指令快相当于一个地址,当我们访问1935后街上application后的地址就能获取到该地址的数据,而之后的FFmpeg发送的数据也是要发送到该地址,同样的,地址可以添加多个,所以可以添加多个application。

当配置好ng后,yum安装了ffmpeg,就可以直接使用ffmpeg的命令处理文件,我在测试文件路径中放了一个MP4文件:

ffmpeg -re -i /data/ffmpeg/悠哉日常大王.mp4 -vcodec copy -acodec copy -b:v 800k -b:a 32k -f flv rtmp://localhost/videotest

-i :这个参数表示输入 ,后面/home/lee/video.mp4 就是输入文件。
-vcodec copy : -vcodec表示使用的视频编解码器 ,前缀v表示video。后面紧跟的copy  表示复制使用源文件的视频编解码器,比如原文件的编解码器(codec)是h264,则这里就使用h264。
-acodec copy : -acodec表示使用的音频编解码器,前缀a表示audio。后面的copy 表示使用源文件的音频编解码器。
-b:v 800k : -b:v表示视频的比特率(bitrate) ,为800k。
-b:a 32k : 表示音频的比特率为32k。
-f flv : -f表示format ,就是强制输出格式为flv,这一步其实也叫封装(mux),封装要做的事就是把视频和音频混合在一起,进行同步。紧跟在后面的rtmp://localhost/videotest 表示输出的"文件名",这个文件名可以是一个本地的文件,也可以指定为rtmp流媒体地址。指定为rtmp流媒体地址后,则ffmpeg就可以进行推流

执行命令后就会出现切片流信息,这时候,客户端就可以获取到解析的rtmp流。

 

但是客户端如何获取?

客户端需要支持rtmp协议的播放器,windows下常见的是easyplayerpro,git免费开源的,下载完后解压,在bin/c#目录下有启动的exe文件,启动easyplayerpro,在路径里面输入IP地址+端口+rtmp路径即可获取该路径的流数据进行播放。这样就初步实现了流媒体。

 


还未解决的问题,对于flac/dsd纯音频来说,目前还没有找到切片推流的方法。了解到ffmpeg支持flac/dsf,但是对于纯音频无压缩,不转换成acc格式,还有待实现。


2019-8-19更新:

实际上做点播系统,使用hls方式会比rtmp更强大,通过ffmpeg切片成为m3u8清单后,可以做到浏览器直接支持。对于纯音频来说可以先把音频转化为wav后封装成aac,再进行切片,切片后生成m3u8,同时分片文件会封装成m4a,浏览器中不管是用video标签还是audio标签都能直接调用m3u8实现直接播放。

你可能感兴趣的:(nginx)