本机搭建RTMP服务器--------35
搭建流媒体服务器
- 准备流媒体服务器(Linux或mac)
- 编译并安装nginx开发
- 配置RTMP服务并启动RTMP
下载nginx源码:
http://nginx.org/en/download.html
选择最新版本即可。
下载nginx-rtmp-module
地址
https://github.com/arut/nginx-rtmp-module 选择最新版本即可。
下载完成后进行解压.
通过 tar -zxvf xxxxxx 命令
./configure --prefix=/usr/local/nginx --add-module=/Users/yuanxuzhen/tools/nginx-rtmp-module 命令进行安装
--prefix=/usr/local/nginx 在/usr/local/nginx下进行安装
在执行的过程中如果遇到下面的问题
报错说明需要pcre和openssl我们通过下面的地址进行下载
pcre https://ftp.pcre.org/pub/pcre/
openssl https://github.com/openssl/openssl
下载成功后进行解压
再一次执行命令
./configure --prefix=/usr/local/nginx --add-module=/Users/yuanxuzhen/tools/nginx-rtmp-module --with-pcre=/Users/yuanxuzhen/tools/pcre-8.00 --with-openssl=/Users/yuanxuzhen/tools/openssl-OpenSSL_1_1_1i
然后执行下面的命令
make -j 4 多个进程安装
sudo make install
然后我们在/usr/local/nginx下面就看到了安装的文件
进入sbin我们看到
可以看到有一个nginx的执行文件
我们再进入conf目录下进行查看
需要在nginx的conf在添加下面的代码
#rtmp服务
rtmp{
server{
#指定服务端口
listen 1935;
chunk_size 4000;
#指定流应用
application live
{
live on;
allow play all;
}
}
}
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}#rtmp服务
rtmp{server{#指定服务端口listen 1935;chunk_size 4000;#指定流应用application live{live on;allow play all;}}}http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
这里修改有一个技巧。nginx.conf 是只读文件,我们先通过
cp ./conf/nginx.conf 目的文件
复制出来,然后进行修改。
在通过
sudo cp 目的文件 ./conf/nginx.conf
将nginx.conf 进行修改
下面我们来启动rtmp服务器:
./sbin/nginx -c conf/nginx.conf
启动后我们可以通过下面的命令进行查看
通过上面的命令我们可以看到nginx已经在进行工作,1935端口在进行监听。
下面我们来进行推流
1、通过ffmpeg命令进行推流 ,通过ffplay进行播放
ffmpeg -re -i 文件 -c copy -f flv rtmp://localhost/live/room
ffplay rtmp://localhost/live/room
2、通过ffmpeg的api进行推流,通过ffplay进行播放
下面是https://blog.csdn.net/qq_15255121/article/details/115768611?spm=1001.2014.3001.5501 flv实战中将的推流代码
//
// pushstream.c
// PushStream
//
// Created by yuanxuzhen on 2021/4/15.
//#include "pushstream.h"
#include "librtmp/rtmp.h"/*flv文件 头部有9个字节,第一个字节是字母F,第二个字节是L,第三个字节是V,第四个字节是版本号,第五个字节 1-5位保留,必须是0,第6位是否有音频tag 第7位保留必须是0,第8位是否有视频tag第六到九字节代表header的大小,必须是9*/static int status = 1;
void set_status(int state){status = state;
}static FILE* open_flv(char* flvaddr){FILE* fp = NULL;fp = fopen(flvaddr, "rb");if(!fp){printf("failed to open flv:%s", flvaddr);return NULL;}fseek(fp, 9, SEEK_SET); //跳过flv头 9个字节fseek(fp, 4, SEEK_CUR); //跳过pretagsize 4个字节return fp;}static RTMP* connect_rtmp_server(char* rtmp_addr){RTMP* rtmp = NULL;rtmp = RTMP_Alloc();if(!rtmp){printf("NO Memory");goto __ERROR;}RTMP_Init(rtmp);//设置rtmp的超时时间和rtmp的连接地址rtmp->Link.timeout = 10;RTMP_SetupURL(rtmp, rtmp_addr);//设置推流还是拉流,设置开启是推流,不设置是拉流RTMP_EnableWrite(rtmp);//建立链接if(!RTMP_Connect(rtmp, NULL)){printf("failed to connect");goto __ERROR;}//创建流RTMP_ConnectStream(rtmp, 0);return rtmp;
__ERROR:if(rtmp){RTMP_Close(rtmp);RTMP_Free(rtmp);}return NULL;
}
static RTMPPacket *alloc_packet(){RTMPPacket *pack = NULL;
// pack = (RTMPPacket*)malloc(sizeof(RTMPPacket));pack =(RTMPPacket*)malloc(sizeof(RTMPPacket));if(!pack){printf("NO Memory alloc_packet");return NULL;}RTMPPacket_Alloc(pack, 64 * 1024);RTMPPacket_Reset(pack);pack->m_hasAbsTimestamp = 0;pack->m_nChannel = 0x4;return pack;
}static int read_u8(FILE* fp, unsigned int *u8){unsigned int tmp;if(fread(&tmp, 1, 1, fp) != 1){printf("Failed to read_u8!\n");return -1;}*u8 = tmp & 0xFF;return 0;
}static int read_u24(FILE* fp, unsigned int *u24){unsigned int tmp;if(fread(&tmp, 1, 3, fp) != 3){printf("Failed to read_u24!\n");return -1;}*u24 = ((tmp >> 16) & 0xFF)| ((tmp << 16) & 0xFF0000) | (tmp &0xFF00);return 0;
}static int read_u32(FILE* fp, unsigned int *u32){unsigned int tmp;if(fread(&tmp, 1, 4, fp) != 4){printf("Failed to read_u32!\n");return -1;}*u32 = ((tmp >> 24) & 0xFF) || ((tmp >> 8) & 0xFF00)| ((tmp << 8) & 0xFF0000) | ((tmp << 24)&0xFF000000);return 0;
}static int read_ts(FILE *fp, unsigned int *ts){unsigned int tmp;if(fread(&tmp, 1, 4, fp) !=4) {printf("Failed to read_ts!\n");return -1;}*ts = ((tmp >> 16) & 0xFF) | ((tmp << 16) & 0xFF0000) | (tmp & 0xFF00) | (tmp & 0xFF000000);return 0;
}int read_data(FILE* fp, RTMPPacket **pack){/** tag header* 第一个字节 TT(Tag Type), 0x08 音频,0x09 视频, 0x12 script* 2-4, Tag body 的长度, PreTagSize - Tag Header size* 5-7, 时间戳,单位是毫秒; script 它的时间戳是0* 第8个字节,扩展时间戳。真正时间戳结格 [扩展,时间戳] 一共是4字节。* 9-11, streamID, 0*/unsigned int tt;unsigned int tag_data_size;unsigned int ts;unsigned int streamId;unsigned int tag_pre_size;int ret = -1;size_t data_size = 0;if(read_u8(fp, &tt)){goto __ERROR;}if(read_u24(fp, &tag_data_size)){goto __ERROR;}if(read_ts(fp, &ts)){goto __ERROR;}if(read_u24(fp, &streamId)){goto __ERROR;}data_size = fread((*pack)->m_body, 1, tag_data_size, fp);if(tag_data_size != data_size){printf("read data size error tag_data_size = %d, real data size = %d\n", tag_data_size, data_size);goto __ERROR;}(*pack)->m_headerType = RTMP_PACKET_SIZE_LARGE;(*pack)->m_nTimeStamp = ts;(*pack)->m_packetType = tt;(*pack)->m_nBodySize = tag_data_size;read_u32(fp, &tag_pre_size);ret = 0;
__ERROR:return ret;}static void send_data(FILE* fp, RTMP *rtmp){//1、创建RTMPPacket对象RTMPPacket *packet = NULL;unsigned int pre_ts = 0;packet = alloc_packet();packet->m_nInfoField2 = rtmp->m_stream_id;while (1) {//从flv读取文件//2.从flv文件中读取数据if(read_data(fp, &packet)){printf("over!\n");break;}//判断rtmp是否还处在链接状态if(!RTMP_IsConnected(rtmp)){printf("Disconnect....\n");break;}unsigned int diff = packet->m_nTimeStamp - pre_ts;usleep(diff * 1000);//发送数据RTMP_SendPacket(rtmp, packet, 0);pre_ts = packet->m_nTimeStamp;}}void push_stream(){char* rtmp_addr = "rtmp://localhost/live/room";char* flv = "/Users/yuanxuzhen/study/mac/PushStream/PushStream/output/test_yuv.flv";//读flv文件FILE* fp = open_flv(flv);//链接RTMP服务器RTMP* rtmp = connect_rtmp_server(rtmp_addr);//push video/audio datasend_data(fp, rtmp);}
通过ffplay rtmp://localhost/live/room 进行播放。
通过上面的配置,我们就在本地搭建了RTMP服务器,我们也就可以推流播放了。
慢一点再慢一点。
原理性的东西一直没有变。
以教为学才能更快的学好。
加油!!!!!!!!!!
本机搭建RTMP服务器--------35相关推荐
- 使用nginx临时搭建rtmp服务器
使用nginx临时搭建rtmp服务器 文章目录 使用nginx临时搭建rtmp服务器 系统环境 搭建步骤 RTMP服务验证 由于需要研究rtmp协议交互方式及报数据格式,使用nginx临时搭建一个rt ...
- 【Android RTMP】NV21 图像旋转处理 ( 快速搭建 RTMP 服务器 Shell 脚本 | 创建 RTMP 服务器镜像 | 浏览器观看直播 | 前置 / 后置摄像头图像旋转效果展示 )
文章目录 安卓直播推流专栏博客总结 一. 编写快速搭建 RTMP 服务器 Shell 脚本 二. RTMP 快速搭建方法 三.创建阿里云 RTMP 服务器镜像 四.浏览器查看直播内容 五.前置 / 后 ...
- Nginx搭建RTMP服务器+FFmpeg实现海康威视摄像头预览
场景 Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流: Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流_BADAO_LIUMANG_ ...
- 【Android RTMP】RTMP 直播推流 ( 阿里云服务器购买 | 远程服务器控制 | 搭建 RTMP 服务器 | 服务器配置 | 推流软件配置 | 直播软件配置 | 推流直播效果展示 )
文章目录 安卓直播推流专栏博客总结 一. 阿里云服务器购买 二. 远程服务器控制软件 三. 配置 Ubuntu 服务器 1 . 更新 apt 源 2 . 安装 pcre.OpenSSL.zlib 库 ...
- nginx搭建rtmp服务器
目录 前言 一.nginx是什么? 二.环境准备 1.系统版本 2.nginx版本 三.搭建过程 1.安装编译 nginx 所需要的库 2.下载 nginx-1.21.6.tar.gz 3.下载 ng ...
- 在Ubuntu系统使用Nginx搭建RTMP服务器
在Ubuntu系统使用Nginx搭建RTMP服务器 参考链接:nginx搭建rtmp服务器 简介 本文简单记录了在Ubuntu18.04系统上使用nginx搭建RTMP服务器的方法. 安装 下载ngi ...
- 【音视频】在windows下搭建RTMP服务器(3-2)
最近在使用ffmpeg进行rtmp推流开发,那么必须先搭建rtmp服务器. 一.搭建时需要用到的软件 1.下载 nginx 1.7.11.3 Gryphon 链接: http://nginx-win. ...
- 【音视频】RTMP:windows下搭建rtmp服务器(未完结...)
0.RTMP服务器简介 0.1 Nginx-RTMP 使用Nginx和Nginx的RTMP模块(nginx-rtmp-module)搭建RTMP流媒体服务器. Nginx 是一款轻量级的 Web 服务 ...
- mac搭建rtmp服务器
mac搭建使用rtmp服务器 1.安装openssl和zlib 使用默认安装方式,因为安装nginx的时候会到特定目录寻找,也可以自定义安装,再在安装nginx的时候指定openssl的路径.为方便安 ...
最新文章
- ad放置网络标号_PCB工程师必备:AD常用快捷键总结,超级实用
- SQL在线格式化工具
- 导数定义考法一网打尽
- Aseprite学习/技巧
- 【acwing】166. 数独****(DFS)
- 高德地图 SDK 的应用 01:绘制多边形区域图
- 又老了一岁,祝自己生日快乐。。。
- 使用chart.js 制作图表
- 万由nas系统安装MySQL_【不折腾】VM虚拟机安装体验万由U-NAS系统
- tesseract::tesseractAPI::setVariable()参数列表
- 2021-10-20 推荐一个在线视频格式转换的好网站https://www.zamzar.com/,我测试过mp4转到gif
- 毕业论文小论文查重吗?
- 四川大学和电子科技大学计算机哪个好,四川大学和电子科技大学哪个好?高校大比拼开始!...
- 夜光带你走进python开发 (二十九)传奇语言
- 《Linux Shell脚本攻略》学习笔记-第一章
- SMU Winter 2023 (div.2)1
- DHU Matlab Experiment【6】作业记录_第七章
- less的了解及基本使用
- camunda 多租户
- 计算机科学导论(1):绪论
热门文章
- 生成圆锥内的均匀分布的单位向量(Generating uniform unit random vectors in a cone)
- 情人节,那就给她做一个网站吧!
- 企业架构(EA)产生背景
- datagram和packet的区别
- centOS镜像 + Wmwar虚拟机+Xshell + git实现一键部署服务器(详细)
- java addall 不能传null_使用List的addAll()方法请判空指针
- 单片机C基本编程规范
- 企业再造(Re-engineering)(转载)
- 帆软报表如何实现开始时间-结束时间-时间间隔(时,日、周、月、年)分段显示数据
- 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象