01 前言

      FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。它的工作过程如图所示:                                     

android FFmpegMediaMetadataRetriever实现推流 ffmpeg推流原理_ffmpeg推流

输入输出文件可有四种:

  • 普通文件如视频文件或jpg图片
  • 设备文件如摄像头或屏幕(unix理念一切皆是文件)
  • 网络协议如http和rtmp
  • 未编码的原生帧(应用滤镜)

     下面介绍利用ffmpeg的设备文件输入和网络协议推流输出功能搭建的直播环境,流程如下图所示:

android FFmpegMediaMetadataRetriever实现推流 ffmpeg推流原理_ffmpeg安装包_02

02 搭建环境

      图中摄像头和麦克风和ffmpeg程序集成在同一台windows电脑上,Nginx是高性能web服务,安装rtmp协议扩展模块后就可以提供媒体服务,它安装于局域网内一个虚拟机centos linux上,ffplay是ffmpeg工具集的播放器,安装于另一台电脑上。

03 搭建步骤

      一、在windows上安装ffmpeg,到ffmpeg官网下载编译好的windows版ffmpeg解压即可。

      二、在centos安装nginx和rtmp扩展模块,安装nginx很简单因为有现成的安装包,但安装rtmp扩展模块就没有那么简单了,需从源码编译的方式把rtmp模块编译进nginx里再安装,步骤是:

       ①下载nginx和nginx-module-rtmp的源码,解压。

       ②进入nginx源码目录

$ ./configure –add-moudle=../nginx-rtmp-module #配置编译参数
         $ make; sudo make install #编译并安装
  三、配置nginx支持rtmp,打开/usr/local/nginx/conf/nginx.conf,末尾添加上
         rtmp {
               server {
                   application live {
                           live on;
                  } } }
      四、 启动nginx
            #sudo /usr/local/nginx/sbin/nginx
      五、在widnows上采集摄像头和麦克风音视频流并推流给nginx:
          ① 先查看摄像头和麦克风的设备名:
          >ffmpeg -list_devices true -f dshow -i dummy

android FFmpegMediaMetadataRetriever实现推流 ffmpeg推流原理_ffmpeg录制后颜色失真_03

把设备名分别填入下面的命令中。

② 采集摄像头和麦克风的视频音频流并编码混合然后推流

        ffmpeg -f dshow -i video="HP Wide Vision HD Camera" -f dshow -i audio="麦克风阵列 (2- Realtek High Definition Audio)" -vcodec libx264 -acodec aac -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.151.158:1935/living

  • -f dshow指出后面输入流的格式
  • -I video=表示输入视频,后面指出摄像头设备名
  • -i audio=表示输入音频,后面指出麦克风设备名
  • -vcodec libx264表示用x264编码库把视频转码为h264
  • -acodec aac表示把音频转码为aac
  • -preset:v ultrafast -tune:v zerolatency表示对x264编码器设置两组预设参数集
  • -f flv表示输出文件的格式是flv
  • rtmp://表示采用rtmp协议,没有-i的就是输出项,所以它表示推流192.168.151.158是虚拟机centos所在的宿主windows的ip,1935是缺省的rtmp协议端口号,通过vmware里的端口映射,把访问宿主机的ip:1935映射为访问虚拟机的ip:1935,这样其它电脑就可以访问虚拟机里的nginx服务了。

     六、允许通过防火墙和从其他电脑访问宿主机内虚拟机提供的服务

      ①使centos的防火墙开放1935端口

$ sudo firewall-cmd –znotallow=public –add-port=1935/tcp –permanent
   $ sudo firewall-cmd –reload #使其生效

      ②配置虚拟机所在宿主windows系统防火墙开放1935端口。

     ③设置虚拟机端口映射,在虚拟机vaware的虚拟机网络编辑器里增加rtmp端口1935的映射,其他电脑就可以通过访问宿主机的ip和端口1935来访问虚拟机centos里的nginx服务

android FFmpegMediaMetadataRetriever实现推流 ffmpeg推流原理_ffmpeg nginx web_04

     七、在同一个局域网的另一个电脑上,用ffplay拉流播放

        ffplay  rtmp://192.168.151.158:1935/living 如下即为直播效果:

android FFmpegMediaMetadataRetriever实现推流 ffmpeg推流原理_ffmpeg推流_05

04 结束语

不用写一行代码就实现了简单的直播,可见ffmpeg的视频处理,媒体设备数据采集和网络推送功能丰富强大。

                                作者:张仰东