音视频学习(二十一)——rtmp收流(tcp方式)

这篇具有很好参考价值的文章主要介绍了音视频学习(二十一)——rtmp收流(tcp方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文主要介绍rtmp协议收流流程,在linux上搭建rtmp服务器,通过自研的rtmp收流库发起取流请求,使用ffmpeg+qt实现视频流的解码与播放。

关于rtmp协议基础介绍可查看:https://blog.csdn.net/www_dong/article/details/131026072

环境搭建

nginx-rtmp-module下载

# 下载地址,下载zip包即可
https://github.com/arut/nginx-rtmp-module

nginx编译与安装

  1. 下载nginx
# 下载地址
http://nginx.org/en/download.html
  1. 解压,将nginx-rtmp-module拷贝至nginx-1.24.0目录,如下所示:

音视频学习(二十一)——rtmp收流(tcp方式),音视频学习,音视频,学习,tcp/ip,rtmp

  1. 配置nginx编译环境
# 步骤1
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 步骤2
yum -y install libxml2 libxml2-dev
yum -y install libxslt-devel
  1. 生成Makefile文件
# 在/home/rtmp/nginx-1.24.0下执行如下命令
./configure --add-module=./nginx-rtmp-module-master --with-http_ssl_module --with-http_ssl_module --with-http_xslt_module --with-http_flv_module --with-debug --with-http_gzip_static_module
  1. 修改nginx.conf文件,进入conf/文件夹下,编译nginx.conf在末尾增加如下内容:
rtmp {
    server {
        listen 1935;               #监听端口,若被占用,可以更改
        chunk_size 4000;           #上传flv文件块儿的大小
        application live {         #创建一个叫live的应用
             live on;              #开启live的应用
             allow publish 192.168.191.100;#192.168.191.100为服务器ip 
             allow play all;
        }
    }
}
  1. 编译、安装
# 在/home/rtmp/nginx-1.24.0下执行如下命令
make
make install
  1. 启动nginx
# 测试配置文件
cd /usr/local/nginx
./sbin/nginx -t

# 有如下打印说明配置正常
[root@localhost nginx]# ./sbin/nginx  -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

# 启动nginx
./sbin/nginx

# 查看是否正常启动
ps -aux | grep nginx
  1. 网页访问,出现如下内容说明启动成功

音视频学习(二十一)——rtmp收流(tcp方式),音视频学习,音视频,学习,tcp/ip,rtmp

ffmepg推流

  • 安装ffmepg,将视频文件拷贝至安装路径下,如图所示:

音视频学习(二十一)——rtmp收流(tcp方式),音视频学习,音视频,学习,tcp/ip,rtmp

  • 执行如下命令
ffmpeg -re -stream_loop -1 -i test.h264 -c copy -f flv rtmp://192.168.191.100:1935/live/testrtmp

以上步骤执行完即完成rtmp服务器搭建。

设计

拉流流程

说明:客户端—自研的rtmp收流库,服务器—上述搭建的rtmp服务器

  • 客户端发送tcp握手请求,和服务器完成tcp握手和rtmp握手
  • 客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接;
  • 客户端发送网络连接命令的“创建流”(createStream)消息到服务端,以创建消息通信的逻辑通道。音频、视频和元数据的发布通过使用createStream命令创建的流通道执行。服务端发送createStream的“应答消息”(_result);
  • 客户端发送网络流命令中的“播放”(play)到服务端;
  • 服务端发送协议控制消息中的“设置块大小”(Set Chunk Size)到客户端设置chunk大小;
  • 服务器发送另一个协议控制消息(用户控制),指定事件“StreamIsRecorded”和该消息中的流ID。消息在前2字节中携带事件类型,在后4字节中携带流ID;
  • 服务端发送用户控制消息中的“流开始”(StreamBegin)消息到客户端,通知客户端流成功创建,可用于通信;
  • 如果客户端发送的播放命令成功,则服务器发送onStatus命令消息NetStream.Play.Start和NetStream.Play.Reset。仅当客户端发送的播放命令设置了重置标志时,服务器才会发送NetStream.Play.Reset。如果未找到要播放的流,服务器将发送onStatus消息NetStream.Play.StreamNotFound;
  • 服务端发送音视频数据到客户端;

代码设计

  1. 上层url解析
// rtmp://192.168.191.100:1935/live/testrtmp
// appName:"live"
// streamPath: "testrtmp"
// tcurl: "rtmp://192.168.191.100:1935/live"
int CRtmpTcpStreamReceiver::ParseUrl_(std::string& appName, std::string& streamPath, std::string& tcurl)
{
	if (m_rtmpUrl.empty())
		return -1;

	std::string url = m_rtmpUrl;
	std::string::size_type pos_0 = url.rfind("/");
	if (std::string::npos == pos_0)
		return -1;

	// "testrtmp"
	streamPath = url.substr(pos_0+1, url.length());
	// "rtmp://192.168.191.100:1935/live"
	tcurl = url.substr(0, pos_0);

	std::string tmpUrl = tcurl;
	std::string::size_type pos_1 = url.rfind("rtmp://");
	if (std::string::npos == pos_1)
		return -1;

	// ippUrl: "192.168.191.100:1935/live"
	std::string ippUrl = tmpUrl.substr(pos_1+7, tmpUrl.length());
	std::string::size_type pos_2 = ippUrl.rfind("/");
	if (std::string::npos == pos_2)
		return -1;

	// "live"
	appName = ippUrl.substr(pos_2+1, ippUrl.length());

	// "192.168.191.100:1935"
	std::string ipp = ippUrl.substr(0, pos_2);
	std::string::size_type pos_3 = ipp.rfind(":");
	if (std::string::npos == pos_3)
		return -1;

	m_rtmpIP = ipp.substr(0, pos_3);
	m_rtmpPort = atoi(ipp.substr(pos_3+1, ipp.length()).c_str());

	return 0;
}
  1. 开始tcp握手和rtmp握手
int CRtmpTcpStreamReceiver::InitRtmpSession_()
{
    // rtmp url解析
	std::string appName = "", streamPath = "", turl = "";
	if (0 != ParseUrl_(appName, streamPath, turl))
	{
		return -1;
	}

	do
	{
        // tcp连接
		m_tcpClient = std::make_shared<ZDTcpClient>(nullptr, this);
		if (!m_tcpClient.get()
			|| 0 != m_tcpClient->TcpCreate()
			|| 0 != m_tcpClient->TcpConnect(m_rtmpIP.c_str(), m_rtmpPort)
			|| 0 != m_tcpClient->TcpSetNoBlock(false)
			|| 0 != m_tcpClient->TcpRecvTimeout(5))
		{
			break;
		}

        // CRtmpCommand为librtmp库接口封装类
		m_command = std::make_shared<CRtmpCommand>(m_tcpClient, m_func, m_user);
		if (!m_command.get())
		{
			break;
		}

        // 创建接收实例
		if (0 != m_command->Create(appName, streamPath, turl)
			|| 0 != m_command->Start(1))
		{
			break;
		}

		return 0;
	} while (0);

	UnInitRtmpSession_();
	return -1;
}
  1. 启动线程接收数据
void CRtmpTcpStreamReceiver::RtmpWorker()
{
	std::shared_ptr<char> dataPacket(new char[RTMP_STREAM_DATA_SIZE], std::default_delete<char[]>());
	memset(dataPacket.get(), 0x00, RTMP_STREAM_DATA_SIZE);
	int recvLen = 0;

	while (m_running)
	{
        // tcp数据接收
		recvLen = m_tcpClient->TcpRecv(dataPacket.get(), RTMP_STREAM_DATA_SIZE);
		if (recvLen <= 0) 
		{
			continue;
		}

        // 塞数据
		if (0 != m_command->InputData(dataPacket.get(), recvLen))
		{
			break;
		}

		memset(dataPacket.get(), 0x00, RTMP_STREAM_DATA_SIZE);
	}
}

抓包

音视频学习(二十一)——rtmp收流(tcp方式),音视频学习,音视频,学习,tcp/ip,rtmp

效果

音视频学习(二十一)——rtmp收流(tcp方式),音视频学习,音视频,学习,tcp/ip,rtmp文章来源地址https://www.toymoban.com/news/detail-773893.html

到了这里,关于音视频学习(二十一)——rtmp收流(tcp方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android音视频学习系列(九) — Android端实现rtmp推流

    Android音视频学习系列(一) — JNI从入门到精通 Android音视频学习系列(二) — 交叉编译动态库、静态库的入门 Android音视频学习系列(三) — Shell脚本入门 Android音视频学习系列(四) — 一键编译32/64位FFmpeg4.2.2 Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲

    2024年02月09日
    浏览(47)
  • Android-音视频学习系列-(九)Android-端实现-rtmp-推流(2)

    配置好之后,检查一下 AudioRecord 当前的状态是否可以进行录制,可以通过 AudioRecord##getState 来获取当前的状态: STATE_UNINITIALIZED 还没有初始化,或者初始化失败了 STATE_INITIALIZED 已经初始化成功了。 2. 开启采集 创建好 AudioRecord 之后,就可以开启音频数据的采集了,可以通过调

    2024年04月12日
    浏览(58)
  • Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器

    #!/bin/sh HTTP_FLV_MODULE_PATH=…/nginx-http-flv-module-1.2.7 OpenSSL_PATH=…/openssl-1.1.1d #–prefix=./bin 代表编译完成之后输出的路径地址 #–add-module 将拓展模块添加到当前一起编译 ./configure --prefix=./bin –add-module= H T T P F L V M O D U L E P A T H   − − w i t h − o p e n s s l = HTTP_FLV_MODULE_PATH --with

    2024年04月15日
    浏览(61)
  • 音视频开发---ffmpeg rtmp推流

    推流是将输入视频数据推送至流媒体服务器, 输入视频数据可以是本地视频文件(avi,mp4,flv......),也可以是内存视频数据,或者摄像头等系统设备,也可以是网络流URL。本篇介绍将本地视频文件通过FFmpeg编程以RTMP直播流的形式推送至RTMP流媒体服务器的方法。 推流的网络拓扑

    2024年02月16日
    浏览(78)
  • 【音视频】基于NGINX如何播放rtmp视频流

    现阶段直播越来越流行,直播技术发展也越来越快。Webrtc、rtmp、rtsp是比较火热的技术,而且应用也比较广泛。本文通过实践来展开介绍关于rtmp如何播放。 本文重点介绍基于NGINX如何播放rtmp视频流 可以参考上一篇博文:【音视频】基于webrtc协议浏览器播放rtsp https://blog.csdn.n

    2024年01月19日
    浏览(60)
  • 音视频开发 RTMP协议发送H.264编码及AAC编码的音视频(C++实现)

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如 FMS , Red5 , crtmpserver 等。RTMP协议可用于实现直播、点播应用,通过 FMLE(Flash Media Live Encoder) 推送音

    2023年04月08日
    浏览(74)
  • 【秒懂音视频开发】26_RTMP服务器搭建

    基本概念 流媒体(Streaming media),也叫做:流式媒体。 是指将一连串的多媒体数据压缩后,经过互联网 分段发送 数据,在互联网上即时传输影音以供观赏的一种技术与过程 此技术使得数据包可以像 流水 一样发送,如果不使用此技术,就必须得先 下载整个 媒体文件才能进

    2023年04月08日
    浏览(52)
  • Android平台音视频推送选RTMP还是GB28181?

    早在2015年,我们发布了RTMP直播推送模块,那时候音视频直播这块场景需求,还不像现在这么普遍,我们做这块的初衷,主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑,走RTMP怎么可能低延迟?网上看到的RTMP推拉流延迟,总归要2-3秒起

    2024年02月10日
    浏览(42)
  • RK3568平台开发系列讲解(音视频篇)RTMP 推流

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP 、 RTSP 、 HLS 、 MPEG-DASH 、 WebRTC 流媒体传输协议等。 RTSP (Real-Time Streaming Protocol):实时流传输协议,用于控制媒体服务器上的实时流传输,支持音频

    2024年02月05日
    浏览(71)
  • SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

    参考:https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1)docker直接运行SRS服务: 运行起来后可以http://localhost:8080/ 看到服务基本信息: 2) OBS 推流 在设置里设置直播地址: 然后回到首页点击开始直播 3)点击http://localhost:8080/ 可以网页查看流视频 SRS低延迟启动(暂时测试下来延迟

    2024年04月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包