RTMP低延迟推流

news2025/2/26 14:21:34

人总是需要压力才能进步, 最近有个项目, 需要我在RK3568上, 推流到公网, 最大程度的降低延迟.
废话不多说, 先直接看效果:
在这里插入图片描述
数据经过WiFi发送到Inenter的SRS服务器, 再通过网页拉流的.

因为是打金任务, 所以逼了自己一把, 把RTMP推流好好捋一遍.
先说说任务目标, 首先是MPP编码, 把mpp的github库下载下来, 研究mpi_enc_test这个例程, 基本就能实现, 从摄像头/dev/video0获取yuv数据, 编码为h264, 保存为文件.

最终值得注意是两点:

  1. log看不到, mpp的log都保存到了/var/log/messages中.

在这里插入图片描述

  1. 输入参数, 因为人家的test demo, 包装得非常好, 编码的参数需要用参数输入, 而你必须设置一些编码参数, 我想到一个非常偷懒的做法:

在这里插入图片描述
伪装, 哈哈
这里面几个比较重要的参数,
-w -h分辨率之类,
-n 表示连续获取数据帧, 不显示数量
-t 就是h264比那吗
-g 是关键帧间隔
-rc 是码流控制, 1代表固定码流, 可根据需要修改, 在固定码流模式下, 可以设置码率

下图的bps就是码率, 直接写死, 要提高码率, 可以修改这里
在这里插入图片描述
3. 在整个编码一开始, 会有一个生成SPS/PPS帧的过程, 原本的代码是直接写入到h264裸文件中. 我看了下面雷神的做法, 先缓存了下来, 跟第一个I帧一起发送.

接下来就是RTMP推流国过程了.

整个过程的前提是, 我之前在腾讯, 花5分钟(开通)+30分钟(折腾防火墙发现是梯子的问题), 搞了个SRS的服务器, 这个服务能接收N种推流方式:
在这里插入图片描述
这里面我最熟悉的就是RTMP了.
其实我最迷信的就是直接TCP转发…但是播放端没有研究, 而我之前试过, 先在板子这端用RTSP, 然后用ZLMedia的pusher, 或者叫Muxer, 把RTSP转到RTMP上去:

https://blog.csdn.net/zunly/article/details/138510170?spm=1001.2014.3001.5502

我偶然发现, 通过网页看到的流, 延迟非常小, 说明这个路应该是ok的, 但是经过RTSP, 再转推, 实在太2, 于是乎经过了几天的折腾, 下面是一点发现:

先说说目前的目标, 就是把mpp编码完的h264数据帧, 一帧一帧的通过RTMP推到Internet上的SRS上去.

首先我能想到的, 就是这么普及的应用, 应该是有库的吧, 搜了一圈, 发现有几个选择:
传说的librtmp, 如果直接在github搜索, librtmp, 过滤掉iOS, 安卓平台, 就会看到雷神(致敬RIP)之前的仓库:

https://github.com/leixiaohua1020/simplest_librtmp_example.git

他的做法是使用一个叫librtmp的库, 但是这个库没有源码, 只有编译好的lib文件跟dll文件, 这没法移植啊…

github上, SRS librtmp的仓库, 留了一个留言:

在这里插入图片描述
两个连接都已经失效.

我又研究了ZLMedia的RTMP部分, 发现一时之间很难看懂…

接下来是ffmpeg, ffmpeg最早进入视野是因为我一开始就想研究webRTC的推流, 据说那玩意儿贼快, 于是看到了一个国内的现状, 很多开发者, 开发出一个框架, 像变现, 方法成了, 什么知识星球, 什么CSDN收费下载…唉…当然作为一个自由主义知识分子, 信仰的是Milton Friedman, Ronald H. Coase, 我举双手赞同知识付费…
最后因为没有钱, 我放弃了WHIP就是webRTC推流的方法…默默留下了贫穷的眼泪.

偶然的机会, 我发现了另一个雷神的仓库:
https://github.com/leixiaohua1020/simplest_ffmpeg_streamer

差点跟前面那个搞混了, 这个仓库就是一个既可以推mp4也可以推flv, 也可以推裸流的宝藏代码, 也是雷神在8年前遗珠…
这个方案用的是ffmpeg的库, ffmpeg老早就集成了这些了…ffmpeg牛逼!!!
我先是在Unbantu上面, 把代码在x86/x64环境跑起来(居然真的能跑通, 推流也是能看到画面的).
然后通过WireShark抓包, 看看到底除了了裸流的数据, ffmpeg 还发了些啥:

在wireshark中, 我发现了几个问题, 一个是对应代码的, RTMP的初始化连接过程, 是非常必要的, 这个过程相当于告诉RTMP的服务器, 你要推流的视频的一些信息, 例如宽高, 帧率之类.
在这里插入图片描述
而这些信息, 其实是ffmpeg通过读取你要发送的h264/flv文件来获取的, 就是这个write_head的过程
在这里插入图片描述

实际的每一个数据帧的发送, 根据打印结果发现, 如下图, 如果我推流的是一个h264的文件, 每次发送的packet, 其实就是通过ffmpeg的 av_read_frame方法, 跟NAL的分割字符(00 00 00 01或者00 00 01), 读取的一帧数据

在这里插入图片描述
read之后, 打印pkt, 长度跟数据内容, 用winhex打开比较

在这里插入图片描述
发现, 每个包, 就是一帧
在这里插入图片描述
那么思路就这样串起来了.

首先, 通过编码, 把摄像头数据, 保存为一个h264的文件, 这个文件当中, 最少有1个SPS, PPS, 跟一个关键帧, 作为一个初始化ffmepg AVPacket对象的工具, 同时也供RTMP的连接初始化使用, 接下来, 再使用实时编码出来的h264帧, 不断填充AVPacket对象的data 跟len这两个参数, 再通过ffmpeg的av_interleaved_write_frame 方法, 就可以把数据源源不断的推到RTMP上去了.

代码暂时不开源, 因为是个打金的项目, 如果上面的文章您还有任何疑问, 欢迎发私信讨论, 感谢大家.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片恢复的实用指南,为你拯救遗失的记忆!

随着科技的日新月异,我们的生活已被照片填满。它们记录着我们的喜怒哀乐,见证着每一个重要的时刻。但我们往往会因为各种原因将手机图片遗失,有什么方法可以恢复呢?本文将提供一份实用的图片恢复指南,帮助你找回那些遗…

【附poc】H5 云商城漏洞

漏洞描述 H5 云商城 file.php 文件上传,攻击者可通过此漏洞上传恶意脚本文件,对服务器的正常运行造成安全威胁!漏洞可在圈子中获取,8000陆续更新中! 漏洞复现 语法及其界面 1、fofa(会员可在圈子获取) b…

文本分类TextRNN_Att模型(pytorch实现)

TextRNN_Att TextRNN-Att简介模型结构:pytorch代码实现: TextRNN-Att简介 TextRNN前面已经介绍过了,主体结构就是一个双向/单向的LSTM层,由于LSTM获得每个时间点的输出信息之间的“影响程度”都是一样的,而在关系分类…

[vue] nvm use时报错 exit status 1:一堆乱码,exit status 5

报错exit status 5:�ܾ����ʡ� 原因:因为当前命令提示符窗口是user权限, 解决:cmd使用管理员方式打开就可以 参考: vm use时报错 exit status 1…

web安全学习笔记(16)

记一下第27-28课的内容。Token 验证 URL跳转漏洞的类型与三种跳转形式;URL跳转漏洞修复 短信轰炸漏洞绕过挖掘 一、token有关知识 什么是token?token是用来干嘛的?_token是什么意思-CSDN博客 二、URL跳转漏洞 我们在靶场中,…

ES 数据写入方式:直连 VS Flink 集成系统

ES 作为一个分布式搜索引擎,从扩展能力和搜索特性上而言无出其右,然而它有自身的弱势存在,其作为近实时存储系统,由于其分片和复制的设计原理,也使其在数据延迟和一致性方面都是无法和 OLTP(Online Transac…

python实现贪吃蛇游戏,python贪吃蛇

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 贪吃蛇游戏是一款经典的休闲益智类游戏,以下是关于该游戏的详细介绍: 游戏类型与平台:

玩转网络调试利器:深入剖析ip命令的强大功能

欢迎来到我的博客,代码的世界里,每一行都是一个故事 玩转网络调试利器:深入剖析ip命令的强大功能 前言ip命令概述网络接口管理ip地址配置路由管理邻居关系查看 前言 在我们的日常网络使用中,我们经常需要管理和调试网络接口、路由…

【大模型微调】一文掌握7种大模型微调的方法

本篇文章深入分析了大型模型微调的基本理念和多样化技术,细致介绍了LoRA、适配器调整(Adapter Tuning)、前缀调整(Prefix Tuning)等多个微调方法。详细讨论了每一种策略的基本原则、主要优点以及适宜应用场景,使得读者可以依据特定的应用要求和计算资源限…

前端开发切入第三方页面显示不全问题解决方案

前端开发切入第三方页面显示不全问题解决方案 最近做一个电视大屏,大屏分为三个部分,又分为上下结构,下部分分为左右结构布局,第一个部分是设备架构图、第二个部分是本市设备网点告警图,第一、二部分是我自己开发的,采用自动计算、自动适配各种场景缩放,兼容性没有任何…

uni-app 开发准备工作(一次开发,多端部署)

前言 uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。 …

车辆超龄无法注册滴滴司机怎么办理账号

车辆超龄无法注册滴滴司机,别担心这个视频教你如何解决,滴滴司机注册过程中 车辆年限是一个常见的限制条件,如果您的车辆超过了8年,那么注册滴滴可能会遇到困难,但是不要因此而放弃成为滴滴司机的机会,《 …

nestJs链接redis

给大家推荐一个库,地址:Yarn service import { Injectable } from nestjs/common; import { RedisService as RedisServices, DEFAULT_REDIS_NAMESPACE } from liaoliaots/nestjs-redis; import Redis from ioredis;Injectable() export class RedisService {priva…

入职java开发第一天,不会VUE竟然被.........

Vue2 技术栈 第 1 章:Vue 核心1.1. Vue 简介1.1.1. 官网1.1.2. 介绍与描述1.1.3. Vue 的特点1.1.4. 与其它 JS 框架的关联1.1.5. Vue 周边库 1.2. 初识 Vue1.3. 模板语法1.3.1. 效果1.3.2. 模板的理解1.3.3. 插值语法1.3.4. 指令语法 1.4. 数据绑定1.4.1. 效果1.4.2…

012.使用传统.NET事件进行通知操作

Rx的目标是协调和编排来自各种来源的基于事件的异步计算,如社交网络、传感器、UI事件等。例如,建筑物周围的安全摄像头,以及当有人可能在建筑物附近时触发的运动传感器,会向我们发送最近摄像头的照片。Rx还可以统计包含选举候选人…

关爱内向儿童:理解与支持助力成长

引言 每个孩子都是独特的,有些孩子天生性格外向,善于表达,而有些孩子则比较内向,喜欢独处。内向并不是缺点,而是一种性格特质。然而,内向的孩子在社交和学习过程中可能会面临一些挑战。本文将探讨内向儿童…

光伏运维系统在光伏电站的应用

摘要:全球化经济社会的快速发展,加快了传统能源的消耗,导致能源日益短缺,与此同时还带来了严重的环境污染。因此,利用没有环境污染的太阳能进行光伏发电获得了社会的普遍关注。本文根据传统式光伏电站行业的发展背景及其监控系统的技术设备,给出了现代化光伏电站数据…

Python 机器学习 基础 之 监督学习 【分类器的不确定度估计】 的简单说明

Python 机器学习 基础 之 监督学习 【分类器的不确定度估计】 的简单说明 目录 Python 机器学习 基础 之 监督学习 【分类器的不确定度估计】 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 分类器的不确定度估计 1、决策函数 2、预测…

20232831 袁思承 2023-2024-2 《网络攻防实践》第10次作业

目录 20232831 袁思承 2023-2024-2 《网络攻防实践》第10次作业1.实验内容2.实验过程(1)SEED SQL注入攻击与防御实验①熟悉SQL语句②对SELECT语句的SQL注入攻击③对UPDATE语句的SQL注入攻击④SQL对抗 (2)SEED XSS跨站脚本攻击实验…

github新手用法

目录 1,github账号注册2,github登录3,新建一个仓库4,往仓库里面写入东西或者上传东西5, 下载Git软件并安装6 ,获取ssh密钥7, 绑定ssh密钥8, 测试本地和github是否联通9,从…