使用 ffmpeg nginx rtmp 搭建实时流处理平台 - nowgood - 博客园

标签: | 发表时间:2019-01-10 10:53 | 作者:
出处:https://www.cnblogs.com

环境: ubuntu 16.04
问题引入:

使用 opencv 获取摄像头数据帧, 进行处理之后(如进行 keypoint 识别), 将 opencv 中图像的 Mat类型转化为 ffmpeg 的 AvPicture 格式, 然后推送到流媒体服务器上, 本地通过 VLC 播放器查看实时检测效果

ffmpeg

      sudo apt-get install ffmpeg -y

然后 /etc/ffserver.conf配置外部可接入地址 在文件的 <feed></feed>部分添加

      BindAddress 0.0.0.0
ACL allow 127.0.0.1
ACL allow localhost
# 假设你的网络地址段为 `192.168.x.x`
ACL allow 192.168.0.0 192.168.255.255

然后 ffserver 开启服务器

      ffserver -d -f /etc/ffserver.conf

使用 ffmpeg 查看可用视频和音频设备

通用: 通过 ffmpeg -devices查看可用设备类型

linux 查看可用设备

      ffmpeg -f v4l2 -list_devices true -i ""
ls -l /dev/video*

macOS 查看可用设备 ffmpeg -f avfoundation -list_devices true -i ""

ffmpeg 基本操作

转播

      ffmpeg  -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -vcodec libx264 -acodec libvo_aacenc  -f rtsp rtsp://9.123.143.116:8090/live.sdp

摄像头直播

      ffmpeg -f video4linux2  -framerate 25 -video_size 640x480 -i /dev/video0 -vcodec libx264 -preset ultrafast -acodec libfaac -f flv  rtmp://10.210.107.141/live

本地文件播放

      ffmpeg -re -i smurf.flv  -vcodec copy -acodec copy -f flv -y rtmp://9.123.143.116/live

搭建 rtsp 服务器

github 上有现成的开源的封装好的 rtsp 服务器工具, 这里使用 EasyDarwin

      git clone https://github.com/EasyDarwin/EasyDarwin

修改配置文件 cfg.js, 将 rtsp_tcp_port端口修改为与 /etc/ffserver.conf中 HTTPPort 相同 (不知道什么原理)

      // cfg.js
module.exports = {
    http_port: 10090,
    # I change 554 to 8090 to map /etc/ffserver.conf  http port
    rtsp_tcp_port: 8090,
    defaultPwd: '123456',
    rootDir: __dirname,
    wwwDir: path.resolve(__dirname, "www"),
    dataDir: path.resolve(os.homedir(), ".easydarwin")
}
      # /etc/ffserver.conf
 
# Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same
# computer.

HTTPPort 8090

Linux 平台, 执行 start.sh运行服务执行 stop.sh停止服务

一定要将 cfg.js 中的 rtsp_tcp_port 端口号设置与与 /etc/ffserver.confHTTPPort端口号相同

测试代码

      ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -strict -2 -rtsp_transport tcp -vcodec h264 -f rtsp rtsp://9.123.143.116:8090/live/
      ffmpeg -f v4l2  -framerate 25 -video_size 640x480 -i  /dev/video0 -strict -2 -vcodec libx264 -acodec libvo_aacenc -f rtsp rtsp://9.123.143.116:8090/live/

搭建 rtmp 服务器

这里是采用比较常用的 nginx 来搭建rtmp 服务器

环境: nginx-1.8.1 + nginx-rtmp-module

nginx服务器的搭建

1.安装依赖

      sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev

2.下载 nginx-rtmp-module 与 nginx-1.8.1

      git clone https://github.com/arut/nginx-rtmp-module.git
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz

3.配置并编译 nginx

进入到 nginx-1.8.1 安装目录, 使用 nginx 的默认配置,添加 nginx 的 rtmp 模块。 add-module 为下载的 nginx-rtmp-module 文件路径。

      cd nginx-1.8.1
./configure --add-module=../nginx-rtmp-module
make
sudo make install

4.运行测试 nginx

进入安装目录 /usr/local/nginx,运行命令 ./sbin/nginx

注意:以后所有的命令都在/usr/local/nginx目录运行,也nginx配置文件的相对目录。

      cd /usr/local/nginx
./sbin/nginx

打开浏览器在地址栏输入:localhost。如果,如下图显示那样就证明您的nginx服务器搭建成功了。

nginx config

步骤如下

  1. 修改 nginx.conf 文件
  2. 重启 nginx 服务
  3. 修改 /etc/hosts, 添加本机地址对应的域名, 如 "9.123.143.116 nowgood"
  4. 打开浏览器查看效果, 注意网址为 http://localhost/stat
      sudo vim /usr/local/nginx/conf/nginx.conf
      sudo ./sbin/nginx -s reload
      #/usr/local/nginx/conf/nginx.conf
#注明:请勿直接覆盖原来的conf文件,这只是部分有关直播的内容
#配置RTMP,这个配置格式在github的readme上有详细说明

worker_processes  1;
events {
   worker_connections  1024;
}
rtmp {                
    server {
        listen 1935;  #服务端口--默认
        chunk_size 4096;   #数据传输块的大小--默认
        #设置直播的application名称是 live
    application live{ 
        live on; #live on表示开启直播模式
        }
        #设置推流的应用名称
    application push{ 
        live on; #开启直播
        push rtmp://rtmp-postbird/live; #推流到上面的直播应用
        }
    }
}

http{
   include       mime.types;
   default_type  application/octet-stream;
   sendfile        on;
   keepalive_timeout  65;
 server {
        listen       80; # 端口
    server_name  nowgood; #设置http服务器监听的域名 hosts中配置了
    
    #下面两个是加上去的,用来配置直播的http访问
    location /stat {    
                rtmp_stat all;
                rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
        #注意这里的路径不能错误,直接写绝对路径就可以
        root /home/gbsaa/wangbin/nginx-rtmp-module/;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

测试代码

      ffmpeg -f v4l2  -framerate 25 -video_size 640x480 -i  /dev/video0 -strict -2 -vcodec libx264 -acodec libvo_aacenc  -f flv rtmp://nowgood/live/webcam
      ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -strict -2 -vcodec libx264 -acodec libvo_aacenc -f flv rtmp://nowgood/live

推流

这里借用 jkuri大兄弟的代码, 不过不使用他的用 docker 搭建的 nginx-rtmp 的服务器(我没有运行成功, 不过很有借鉴意义)

      git clone https://github.com/jkuri/opencv-ffmpeg-rtmp-stream

将代码中的推流地址改为之前我们搭建的 rtmp 服务器的地址后, 使用功能 cmake 编译运行, 就可以将摄像头采集图像进行直播了

一些可能需要安装的依赖

      sudo apt-get install v4l-utils
v4l2-ctl -d /dev/video0 --list-formats
      sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install libavcodec-extra

参考

https://github.com/opencv-ffmpeg-rtmp-stream
http://www.ptbird.cn/nginx-rtmp-module-server.html
https://zhuanlan.zhihu.com/p/28009037

相关 [ffmpeg nginx rtmp] 推荐:

使用 ffmpeg nginx rtmp 搭建实时流处理平台 - nowgood - 博客园

- -
环境: ubuntu 16.04. 使用 opencv 获取摄像头数据帧, 进行处理之后(如进行 keypoint 识别), 将 opencv 中图像的 Mat类型转化为 ffmpeg 的 AvPicture 格式, 然后推送到流媒体服务器上, 本地通过 VLC 播放器查看实时检测效果. /etc/ffserver.conf配置外部可接入地址 在文件的.

NGINX的流媒体插件 nginx-rtmp-module

- - 开源软件 - ITeye博客
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能. 基于HTTP的FLV/MP4 VOD点播. HLS (HTTP Live Streaming) M3U8的支持. 基于http的操作(发布、播放、录制). 可以很好的协同现有的流媒体服务器以及播放器一起工作.

Nginx+ffmpeg搭建Apple Http Live Streaming笔记

- - 移动开发 - ITeye博客
起始Nginx来搭建HLS步骤非常少. 安装好Nginx,然后跑起来. 把切片好的视频和m3u8文件放到部署目录,直接访问就可以了. 网上国内国外的找了好多博客. 这里一定注意一点,不要用VLC播放器来测试,最好用iPad或者iPhone,再么用Safari 开发模式下模拟iPad、iPhone的浏览器模式播放.

用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器

- - 开源软件 - ITeye博客
这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTMP/RTMP流媒体方式强大,很多视频网站都是用HTTP方式实现的,如:YouTube,土豆,酷6等. 2、  RTMP/RTMP流媒体方式. 这种方式不用下载FLV视频文件到本地,可以实时的播放flv文件,可以任意拖拽播放进度条,但是比较消耗服务器的资源.

Nginx+ffmpeg的HLS开源服务器搭建配置及开发详解

- - 互联网 - ITeye博客
          至目前为止,HLS 是移动平台上非常重要并十分流行的流媒体传输协议. 做移动平台的流媒体开发,不知道它不掌握它 ,真是一大遗憾. 而HLS的平台搭建有一定的难度,本文针对对该方向有一定了解的朋友,将方案实施中的一些细节和流程进行分享交流. 本文介绍了,使用开源服务器nginx 搭建 HLS 服务比较详细的方案.

ffmpeg轉檔

- - SSORC.twSSORC.tw
ffmpeg 是一個命令列工具,用來對視訊檔案轉換格式. -i = 來源影片 (後面的參數先不接的話可以查看來源影片的詳細資訊,可供想要轉成什麼品質的參考). -vcodec = video code (如果要保留原格式就用 -vcodec copy). -acoder = audio code  (如果要保留原格式就用 -vcodec copy).

JW Player 使用 RTMP 流

- - CSDN博客互联网推荐文章
        译序:JW Media Player 是开源的网页使用的 Flash 播放器. 本文采摘于 JW Player 的官方文档,讲解了 JW Player 对于 RTMP 的使用方法,我们可以从 JW Player 客户端的角度来了解 RTMP 协议.         RTMP ( Real Time Messaging Protocol 实时消息传输协议) 是一个用于将点播和直播媒体交付给 Adobe Flash 应用 (比如 JW Player) 的体系.

RTMP 协议学习总结

- - C++博客-牵着老婆满街逛
RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议. RTMP协议中基本的数据单元称为消息(Message). 当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk). 消息是RTMP协议中基本的数据单元. 不同种类的消息包含不同的Message Type ID,代表不同的功能.

ffmpeg裁剪合并视频

- - inJava
这里裁剪是指时间轴裁剪,不是空间裁剪. 比如说,你想把视频的从一分20秒开始,30秒的视频裁剪出来,保存成一个视频. ffmpeg提供简单的命令参数:. -ss 开始时间,如: 00:00:20,表示从20秒开始;. -t 时长,如: 00:00:10,表示截取10秒长的视频;. -i 输入,后面是空格,紧跟着就是输入视频文件;.

玩转 FFmpeg 的 7 个小技巧

- mk - OSMSG
FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats查看FFmpeg支持的视音频格式,左侧若是E表明可以编码,D表明可以解码. 本文着重介绍命令行下ffmeg的7个技巧:.