使用 ffmpeg nginx rtmp 搭建实时流处理平台

环境: 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.conf HTTPPort端口号相同
测试代码
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
步骤如下
- 修改 nginx.conf 文件
- 重启 nginx 服务
- 修改 /etc/hosts, 添加本机地址对应的域名, 如 "9.123.143.116 nowgood"
- 打开浏览器查看效果, 注意网址为 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 搭建实时流处理平台的更多相关文章
- 三、Windows下用FFmpeg+nginx+rtmp搭建直播环境 实现推流、拉流
一.环境 1.开发环境:windows 2.开发工具:FFmpeg.nginx.nginx-rmtp-module (链接:https://pan.baidu.com/s/119d2GeMzddas_ ...
- 用FFmpeg+nginx+rtmp搭建环境实现推流
Windows: 1.下载文件: 链接:https://pan.baidu.com/s/1c2LmIHHw-dwLOlRN6iTIMg 提取码:g7sj 2.解压文件: 解压到nginx-1.7.11 ...
- nginx + rtmp 搭建流媒体服务器
一.安装nginx服务器 1.路径说明: 路径:/usr/local/src 2.下载nginx-rtmp-module (我这里的目录是在/usr/local/src/下面) cd /usr/loc ...
- Ubuntu中使用Nginx+rtmp搭建流媒体直播服务
一.背景 本篇文章是继上一篇文章<Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务>文章而写,在上一篇文章中我们搭建了一个点播服务器,在此基础上我们再搭建一个直播服务器, ...
- 基于Hadoop生态SparkStreaming的大数据实时流处理平台的搭建
随着公司业务发展,对大数据的获取和实时处理的要求就会越来越高,日志处理.用户行为分析.场景业务分析等等,传统的写日志方式根本满足不了业务的实时处理需求,所以本人准备开始着手改造原系统中的数据处理方式, ...
- 大规模实时流处理平台架构-zz
随着不同网络质量下接入终端设备种类的增多,服务端转码已经成为视频点播和直播产品中必备的能力之一.直播产品讲究时效性,希望在一定的时间内让所有终端看到不同尺寸甚至是不同质量的视频,因此对转码的实时性要求 ...
- ELK搭建实时日志分析平台
ELK搭建实时日志分析平台 导言 ELK由ElasticSearch.Logstash和Kiabana三个开源工具组成,ELK平台可以同时实现日志收集.日志搜索和日志分析的功能.对于生产环境中海量日志 ...
- ELK搭建实时日志分析平台之二Logstash和Kibana搭建
本文书接前回<ELK搭建实时日志分析平台之一ElasticSearch> 文:铁乐与猫 四.安装Logstash logstash是一个数据分析软件,主要目的是分析log日志. 1)下载和 ...
- ELK搭建实时日志分析平台之一ElasticSearch搭建
文:铁乐与猫 系统:CentOS Linux release 7.3.1611 (Core) 注:我这里为测试和实验方便,ELK整套都装在同一台服务器环境中了,生产环境的话,可以分开搭建在不同的服务器 ...
随机推荐
- 01--STL算法(算法基础)
一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中 ...
- 如何在Ubuntu上开启SSH服务
更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"-- ...
- 理解maven命令package、install、deploy的联系与区别
我们在用maven构建java项目时,最常用的打包命令有mvn package.mvn install.deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能,但这三个命 ...
- HDU - 3974 Assign the task (线段树区间修改+构建模型)
https://cn.vjudge.net/problem/HDU-3974 题意 有一棵树,给一个结点分配任务时,其子树的所有结点都能接受到此任务.有两个操作,C x表示查询x结点此时任务编号,T ...
- Linux 命令详解(十二)Systemd 入门教程:使用定时器发送邮件(mail)
Systemd 定时器教程:http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html 一.定时任务 Systemd 定时任务:每小时发送一封电 ...
- [Android] Android读取Asset下文件的最简单的方法总结(用于MediaPlayer中)
方法一:getAssets().openFd //读取asset内容 private void openAssetMusic(String index) throws IOException { ...
- JS创建对象之动态原型模式
动态原型模式把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了 同时使用构造函数和原型的优点:换句话说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初 ...
- luogu 1850 换教室 概率+dp
非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) ...
- ELK平台搭建(上)
一.目的 为指导在Centos6.8系统下搭建标准ELK平台的工作. 二.定义 Elasticsearch Logstash Kibana结合Redis协同工作. 三.适用范围 适用于运营维护组运维工 ...
- JMeter(三)遇到的问题01: 通过CSV Data Set Config参数化有中文时,显示为?
当使用CSV Data Set Config进行参数化,内容中含有中文时,响应文本显示为? 解决办法:只需要将“file encoding”设置为“gb2312”就可以了.