RTMP推流方案总结

由于项目需要 RTMP 推送 H264 数据,在网上查找了下相关的方案,总结一下。

RTMP协议简介

在总结之前,我们先简单介绍一下 RTMP 协议。
RTMP(Real Time Messaging Protocol) 实时消息传送协议是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的私有协议。

它有三种变种:

1)工作在 TCP 之上的明文协议,使用端口 1935;

2)RTMPT 封装在 HTTP 请求之中,可穿越防火墙;

3)RTMPS 类似 RTMPT,但使用的是 HTTPS 连接;

RTMP 协议就像一个用来装数据包的容器,这些数据可以是 AMF 格式的数据,也可以是 FLV 中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流。这些通道中的包都是按照固定大小的包传输的。

更多协议的细节可以参见《rtmp specification 1.0》。

RTMP服务器

RTMP 服务器,现成的开源方案有以下几种推荐:

1. nignx

Nginx("engine x") 是一款是由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的 Web 和反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下,Nginx 是 Apache 服务器不错的替代品。

我们这里使用的是 Nginx 的 rtmp 插件实现实时流推送,具体实现可以参考我的另一篇博客:Windows 搭建 nginx RTMP 服务器

2. srs

SRS(Simple RTMP Server) 是国人写的一款非常优秀的开源流媒体服务器软件,使用 C++ 开发,可用于直播/录播/视频客服等多种场景,其定位是运营级的互联网直播服务器集群。SRS 提供了丰富的接入方案将 RTMP 流接入 SRS,包括推送 RTMP 到 SRS、推送 RTSP/UDP/FLV 到 SRS、拉取流到 SRS。SRS 还支持将接入的 RTMP 流进行各种变换,譬如将 RTMP 流转码、流截图、转发给其他服务器、转封装成 HTTP-FLV 流、转封装成 HLS、转封装成 HDS、录制成 FLV。GitHub 源码链接为:https://github.com/ossrs/srs

3. crtmpserver c++

crtmpserver 是一个由 C++ 语言编写的开源的 RTMP 流媒体服务器,与其对应的商业产品自然是 Adobe 公司的 FMS。与 FMS 相比,从功能上来说crtmpserver 只能称为 FMS 的简化版本,其功能并没有 FMS 那么完善甚至是远远没有达到。其与 flash player 的兼容性自然也比不上官方的 FMS 了。但是 crtmpserver 提供了最常见的 RTMP 实现。作为开源的高性能 RTMP 流媒体服务器,不仅可以用在 x86 平台的 linux 服务器,windows 服务器,还可以被用在 arm 等嵌入式平台上。crtmpserver 的代码结构良好,类的继承体系清楚,代码效率高。是学习 RTMP 协议和服务器端编程的好例子。GitHub 源码链接为:https://github.com/shiretu/crtmpserver

crtmpserver 源码依赖 openssl,所以不管是在 Linux 还是 Windows 平台下,都需要先编译 openssl 库,具体编译请参考:crtmpserver系列(二):搭建简易流媒体直播系统

4. livego

Go(又称Golang,wiki 中文)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言(github),支持windows、linux、macOS等操作系统。

livego 是基于 go 语言的 rtmp 直播服务器。go 语言为服务器性能而生,开发效率远远高过 C/C++。GitHub 源码链接为:https://github.com/gwuhaolin/livego

为什么基于golang?

go 在语言基本支持多核 CPU 均衡使用,支持海量轻量级线程,提高其并发量。当前开源的缺陷:

  • srs 只能运行在一个单核下,如果需要多核运行,只能启动多个 srs 监听不同的端口来提高并发量;
  • ngx-rtmp 启动多进程后,报文在多个进程内转发,需要二次开发,否则静态推送到多个子进程,效能消耗大;

go 在语言级别解决了上面多进程并发的问题。具体请参考:默默前行的livego--基于go语言的rtmp直播服务器

5. node-rtsp-rtmp-server

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。

node-rtsp-rtmp-server 是使用 Node.js 实现的 rtmp 服务器。GitHub 源码链接为:https://github.com/iizukanao/node-rtsp-rtmp-server

测试

测试的话下载个推流工具,建议使用大牛直播提供的推流工具,也可以使用 FFmpeg 推流。

RTMP推流器

1. librtmp

RTMPDump 软件包含一个基本的客户端:rtmpdump,一些示例服务器和一个用来提供对RTMP协议进行支持的库(libRTMP)。librtmp 使用的人非常多,但也比较老了,具体请参考:

H264视频通过RTMP直播

windows - librtmp推送H264的Demo下载

最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)

2. FFmpeg

FFmpeg 也能实现 rtmp 推流,因为内部集成了 librtmp,官方给出了 muxing.c 源代码,就是实现如何推流的例子。具体可以参考:

ffmpeg 代码实现rtmp推流到服务器

《最简单的基于FFmpeg的推流器(以推送RTMP为例)》

基于FFmpeg进行RTMP推流(一)

Windows远程桌面实现之五(FFMPEG实现桌面屏幕RTSP,RTMP推流及本地保存)

3. srs-librtmp

srs-librtmp 是 srs 提供的一个 rtmp 库,可以推送 H264 数据。本来打算使用 srs 来做 rtmp 推流器,但是 srs 只提供了 Linux 平台的 srs_librtmp.lib 静态库和 Demo,费了些功夫,修修改改成功编译了 Windows 下的 srs_librtmp.lib 静态库,但是添加进工程后,工程可以打开库,却识别不了所调用的 API,由于时间问题暂时放弃。

参考:

rtmp服务器以及rtmp推流/拉流/转发

原文地址:https://www.cnblogs.com/linuxAndMcu/p/12538915.html

时间: 2024-11-05 22:50:05

RTMP推流方案总结的相关文章

安卓直播开源: RTMP 推流SDK

前些日子在github上提交了基于GPUImage的IOS直播推流SDK(https://github.com/runner365/GPUImageRtmpPush) 最近整理了android直播推流SDK,在github上开源出来. 1,支持市面上绝大部分的rtmp服务器 nginx-rtmp,SRS,RED5等 2,视频用软编,兼容性好 市面上的一些android rtmp推流sdk用的是android中mediacodec来进行,但是有两个缺点: 1,mediacodec这个类在andro

实现手机直播推送、屏幕推送及录像功能RTMP推流组件之EasyRTMP-Android设置授权Key介绍

Real Time Messaging Protocol(RTMP)即实时消息传输协议,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议. 关于RTMP推流组件 目前市面上比较通用的RTMP推流组件EasyRTM就是一套调用简单.功能完善.运行高效稳定的RTMP推流功能组件,经过多年客户实战和线上运行打造,支持RTMP推送断线重连.环形缓冲.智能丢帧.网络事件回调,支持Windows.Linux.ARM.Android.iOS平台,支

命令行利用ffmpeg实现rtmp推流《转》

ffmpeg在以前介绍过,是一个相当强大的工具,我们这次利用它实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123). 1.首先下载ffmpeg和ffplay http://ffmpeg.org/ 官方下载链接为:http://ffmpeg.org/ 2.cmd进入ffmpeg所在目录 cmd进入ffmpeg.exe所在目录 3.ffmpeg查看电脑设备 输入下面的语句即可列出电脑的设备 ffmpeg -list_devices true -f dsh

Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMP-iOS如何接入软编码?

视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率.减小带宽使用.提升画面质量,成为音视频开发者努力的重点.随着互联网.流媒体技术的发展,兼容支持H.264.H.265编码器(可减少计算的复杂性.提高压缩率,并降低编码时间)已经成为迫在眉睫的事. EasyRTMP推流功能特点 - 调用简单 无论是个人开发者还是企业级应用,只需要简单的几个接口调用就可以完成一套完整的互联网直播应用的上架 - 功能完善 配套完整的直播.录像.旋转功能示例,用户直接复用即可选择嫁接自定义功能 - 运行高

EasyRTMP实现内网摄像头RTSP拉流转码RTMP推流到RTMP服务器EasyRTMP-Android视频采集流程是什么?

背景分析 RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMP/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络下ieyi,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信.RTMP推流,就是将直播内容推送到服务器的过程. 关于RTMP推流组件 EasyRTMP是一套调用简单.功能完善.运行高效稳定的RTMP推流

ffmpeg rtmp 推流错误WriteN, RTMP send error 10053 10038

利用ffmepg推264流到rtmp服务端出现错误WriteN, RTMP send error 10053,具体如下图所示. 图1推流到rtmp服务错误 原因是视频流缺少SPS,PPS信息,加上这两个信息即可.

Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMP之如何搭建EasyRTMP-Android推流至EasyDSS测试环境

Real Time Messaging Protocol(RTMP)即实时消息传输协议,是 Adobe 公司开发的一个基于 TCP 的应用层协议,目前国内的视频云服务都是以 RTMP 为主要推流协议. EasyRTMP推流功能特点 - 调用简单 无论是个人开发者还是企业级应用,只需要简单的几个接口调用就可以完成一套完整的互联网直播应用的上架 - 功能完善 配套完整的直播.录像.旋转功能示例,用户直接复用即可选择嫁接自定义功能 - 运行高效 高效缓冲和发送设计模式,能非常灵活地让用户自定义延时和缓

RTP推流服务器EasyRTMP实现内网摄像头RTSP拉流转码RTMP推流到EasyRTMP-Android音频采集流程是什么?

音视频流媒体硬解码是指不使用CPU进行编码,使用显卡GPU,专用的DSP.FPGA.ASIC芯片等硬件进行编码.编码框架Video ToolBox和AudioToolbox. EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer).智能丢帧.自动重连.rtmp协议等等多种技术,能够非常有效地适应各种平台(Windows.Linux.ARM.Android.iOS),各种网络环境(有线.wifi.4G),以及各种情况下的直播恢复

How to encode picture to H264 use AVFoundation on Mac, not use x264(续 :其中提到的用VideoToolBox硬编码,RTMP推流的开源工程 VideoCore project)

来源:https://github.com/jgh-/VideoCore Code Issues 77 Pull requests 4 Wiki Pulse Graphs SSH clone URL You can clone with , , or . An audio and video manipulation pipeline 421 commits 5 branches 43 releases 10 contributors C++ 58.0% Objective-C++ 32.9%