rtmp推流和rtsp区别_Rtsp/Rtmp协议介绍及区别

RTSP是一种基于文本的协议,便于增加自定义参数和抓包分析,主要包含请求和响应报文。RTMP操作流程包括握手、建立连接、建立流和播放四个步骤。RTMP特点是Adobe支持广泛、适合长时间播放、延迟较低但有累积延迟风险。
摘要由CSDN通过智能技术生成

RTSP是一种基于文本的协议,用CRLF(回车换行)作为每一行的结束符,其好处是,在使用过程中可以方便地增加自定义参数,也方便抓包分析。从消息传送方向上来分,RTSP的报文有两类:请求报文和响应报文。请求报文是指从客户端向服务器发送的请求(也有少量从服务器向客户端发送的请求),响应报文是指从服务器到客户端的回应。

RTSP请求报文的常用方法与作用:

2d374c21c22f98e21ac5febc58b1dd12.png
2e58b90083c378d6f382265d3e899921.png

原文:https://blog.csdn.net/deliapu/article/details/79199023

RTMP spec下载:https://www.adobe.com/devnet/rtmp.html

RTMP操作流程(引用自:https://www.cnblogs.com/ostin/p/9900918.html)

播放一个RTMP协议的流媒体需要经过以下几个步骤:握手,建立连接,建立流,播放。

1. 握手

握手开始于客户端发送C0、C1块。服务器收到C0或C1后发送S0和S1。

当客户端收齐S0和S1后,

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的示例代码,用于将RTSP流转发到RTMP服务器: ```cpp #include <iostream> #include <cstdlib> #include <cstring> #include <unistd.h> #include <libavformat/avformat.h> #include <libavutil/opt.h> int main(int argc, char* argv[]) { // 注册所有的FFmpeg组件 av_register_all(); // 创建输入上下文 AVFormatContext* inputContext = avformat_alloc_context(); // 打开RTSP流 if (avformat_open_input(&inputContext, "rtsp://your_rtsp_url", nullptr, nullptr) != 0) { std::cerr << "无法打开RTSP流" << std::endl; return -1; } // 查找流信息 if (avformat_find_stream_info(inputContext, nullptr) < 0) { std::cerr << "无法获取流信息" << std::endl; return -1; } // 创建输出上下文 AVFormatContext* outputContext = avformat_alloc_context(); // 设置输出格式为RTMP AVOutputFormat* outputFormat = av_guess_format("flv", nullptr, nullptr); outputContext->oformat = outputFormat; // 打开输出URL if (avio_open(&outputContext->pb, "rtmp://your_rtmp_url", AVIO_FLAG_WRITE) < 0) { std::cerr << "无法打开RTMP URL" << std::endl; return -1; } // 遍历输入流 for (unsigned int i = 0; i < inputContext->nb_streams; i++) { AVStream* inputStream = inputContext->streams[i]; AVStream* outputStream = avformat_new_stream(outputContext, inputStream->codec->codec); // 复制流参数 if (avcodec_copy_context(outputStream->codec, inputStream->codec) < 0) { std::cerr << "无法复制流参数" << std::endl; return -1; } outputStream->codec->codec_tag = 0; if (outputContext->oformat->flags & AVFMT_GLOBALHEADER) { outputStream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } } // 写入输出头部 if (avformat_write_header(outputContext, nullptr) < 0) { std::cerr << "无法写入输出头部" << std::endl; return -1; } // 转发流数据 AVPacket packet; while (av_read_frame(inputContext, &packet) >= 0) { AVStream* inputStream = inputContext->streams[packet.stream_index]; AVStream* outputStream = outputContext->streams[packet.stream_index]; // 设置时间基 av_packet_rescale_ts(&packet, inputStream->time_base, outputStream->time_base); packet.pos = -1; // 写入输出流 if (av_interleaved_write_frame(outputContext, &packet) < 0) { std::cerr << "无法写入输出流" << std::endl; break; } av_packet_unref(&packet); } // 写入输出尾部 av_write_trailer(outputContext); // 清理资源 avformat_close_input(&inputContext); avio_close(outputContext->pb); avformat_free_context(outputContext); return 0; } ``` 请注意,这只是一个简单的示例代码,用于演示如何使用FFmpeg将RTSP流转发到RTMP服务器。你需要根据自己的需求进行适当的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值