rtmp推流异常分析

news2024/11/25 10:26:06

问题描述

向srs媒体服务上推送rtmp流,推送失败

分析过程

srs日志分析

从日志中看到发生错误时层次调用关系

[2023-09-05 11:10:29.933][Error][13594][9w5og10q][11] serve error code=3001 : service cycle : rtmp: stream service : rtmp: receive thread : handle publish message : rtmp: consume message : rtmp: consume video : meta update video : demux SPS/PPS : avc decode sequence header

去代码中搜索"avc decode sequence header"相关信息,发现是解析sps/pps信息异常

// src/kernel/srs_kernel_codec.cpp
srs_error_t SrsFormat::avc_demux_sps_pps(SrsBuffer* stream)
{
    // AVCDecoderConfigurationRecord
    // 5.2.4.1.1 Syntax, ISO_IEC_14496-15-AVC-format-2012.pdf, page 16
    int avc_extra_size = stream->size() - stream->pos();
    if (avc_extra_size > 0) {
        char *copy_stream_from = stream->data() + stream->pos();
        vcodec->avc_extra_data = std::vector<char>(copy_stream_from, copy_stream_from + avc_extra_size);
    }

    if (!stream->require(6)) {
        return srs_error_new(ERROR_HLS_DECODE_ERROR, "avc decode sequence header");
    }

    ......
}

stream对应的buffer中不够6个字节???

抓包分析

推流端给服务端发送完publish之后,服务端回复的onStatus,以及客户端给服务端发送的setDataFrame、onMetaData都没有被解析成rtmp,只能根据rtmp协议标准分析onMetaData(及ECMA Array)之后的数据,srs日志中也表示获取到了meta data                        

[2023-09-05 11:10:29.927][Trace][13594][9w5og10q] got metadata, width=1280, height=720, vcodec=7, acodec=10

再结合srs的日志,猜测是sps/pps解析引起的

onMetaData的"End Of Object Marker"对应着0x00 0x00 0x09序列,其后对应着其他的rtmp包

rtmp的header中各字段含义表示为

RTMP字段
字段分类字段含义位宽描述
Headerformat2bits

0表示header长度为11字节

1表示header长度为7字节

2表示header长度为3字节

3表示header长度为0字节

(不含本字节)

ChunkStreamID6bits
TimeStamp3Bytes
BodySize3Bytes
TypeId1Byte

0x08对应语音数据

0x09对应视频数据

StreamId4Bytes

Body

(需要根据header中TypeId区分,这里只描述audio/video)

Control1Byte视频数据       Type: 4bits, 1表示Key Frame; 2表示inter-frame     
Format: 4bits, 7表示H264
语音数据

Format: 4bits, 10表示HE-AAc

SampleRate: 2bits, 3表示44kHz

SampleSize: 1bit, 1表示16bits

Channels: 1bit, 1表示Stereo

DataBodySize - 1

抓包和rtmp协议规范对着看吧,第一个视频帧长度为5并且有效数据是00 00 00 00,代码中要求长度是6,所以对上号了

结论

推流端首帧视频数据长度为5,真实数据为00 00 00 00, 代码中要求是6,所以srs代码中校验不通过,报错。

猜测是客户端首帧编码异常,或者发送的太早了,数据还没编码好就开始发送了......

参考

setDataFrame、onMetaData协议格式参考手撕Rtmp协议细节(8)——publish推流_视界音你而不同的博客-CSDN博客

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

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

相关文章

Spring系列文章3:基于注解方式依赖注入

和XML 配置文件一样&#xff0c;注解本身并不能执行&#xff0c;注解本身仅仅只是做一个标记&#xff0c;具体的功能是框架检测 到注解标记的位置&#xff0c;然后针对这个位置按照注解标记的功能来执行具体操作&#xff0c;本质上所有操作都是Java代码来完成的&#xff0c;XML…

windows安装Oracle19c安装

windows安装Oracle19c安装 百度云安装包地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/11XvBN8Zqb7jbhugP88IHRw 提取码&#xff1a;ybsy 官网下载地址&#xff1a;https://www.oracle.com/database/technologies/oracle-database-software-downloads.html 下载…

基于vue3和element-plus的省市区级联组件

git地址&#xff1a;https://github.com/ht-sauce/elui-china-area-dht 使用:npm i elui-china-area-dht 默认使用 使用方法 <template><div class"app"><!--默认使用--><elui-china-area-dht change"onChange"></elui-china…

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析

一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…

MySQL阻塞与死锁

MySQL阻塞与死锁 阻塞 因为不同锁之间的兼容性关系&#xff0c;在有些时刻一个事务中的锁需要等待另一个事务中的锁释放它所占用的资源&#xff0c;这就是阻塞。 # 查看等待时间 show variables like innodb_lock_wait_timeout; SETinnodb_lock_wait_timeout60; # 是否在等待…

深度学习面试八股文(2023.9.06持续更新)

一、优化器 1、SGD是什么&#xff1f; 批梯度下降&#xff08;Batch gradient descent&#xff09;&#xff1a;遍历全部数据集算一次损失函数&#xff0c;计算量开销大&#xff0c;计算速度慢&#xff0c;不支持在线学习。随机梯度下降&#xff08;Stochastic gradient desc…

【HTML/CSS】入门导学篇

本文属于HTML/CSS专栏文章&#xff0c;适合WEB前端开发入门学习&#xff0c;如果有所帮助请一键三连支持&#xff0c;对博主系列文章感兴趣点击下方专栏了解详细。 本文内容出自B站pink老师的前端入门教程&#xff0c;感谢pink老师&#xff01;&#xff01;&#xff01; 视频链…

【ARM CoreLink 系列 1 -- CoreLink 系列 产品介绍】

文章目录 ARM CoreLink 介绍ARM CoreLink InterconnectARM CoreLink 处理器外设ARM CoreLink Memory Controllers ARM CoreLink 介绍 ARM的CoreLink系列产品是一套能够进行高效互联的组件和工具&#xff0c;它们用于构建高性能、低功耗的嵌入式和消费电子设备。CoreLink产品系…

Mac MySQL初始登录root报错access denied解决方法

如图&#xff0c;当在mac m2上首次安装mysql后尝试登录root用户时&#xff0c;无论输入什么样的密码&#xff0c;或者直接回车键&#xff0c;都会显示access denied for user rootlocalhost。同时win和ubuntu也出现了一模一样的问题&#xff0c;先记录一下mac的解决方法。 参考…

Sigrity仿真报错:找不到电容的S参数?

很多电子工程师会选择使用Sigrity软件进行高速PCB信号仿真&#xff0c;但在使用过程可能会遇见报错情况&#xff0c;其中之一是提示找不到电容的S参数&#xff0c;那么如何解决这个问题&#xff1f; 一般来说&#xff0c;S参数的全称为Scatter参数&#xff0c;即散射参数&#…

STM32单片机OLED贪吃蛇游戏记分计时

实践制作DIY- GC00165---OLED贪吃蛇游戏 一、功能说明&#xff1a; 基于STM32单片机设计---OLED贪吃蛇游戏 二、功能说明&#xff1a; STM32F103C系列最小系统板0.96寸OLED显示器上、下、左、右4个按键 1.通过OLED配合按键实现贪吃蛇游戏 2.可以上下左右移动。 3.可以统计显…

JavaScript-----DOM元素

目录 前言&#xff1a; 1. DOM介绍 2. 获取节点 3. 操作HTML内容 4. 监听事件 案例 5. 操作节点的标签属性 6. 操作样式 7. 创建、添加、删除节点 前言&#xff1a; 在此之前我们要想去操作网页元素一般是去通过CSS选择器实现的&#xff0c;今天我们就学习JavaScript里…

bit、bin 、mcs文件区别

FPGA里面的可执行文件都涉及到 *.bit&#xff0c; *.mcs&#xff0c; *.bin 和 *.elf。 bit文件 bit 文件一般用于JTAG在线进行调试的时候&#xff0c;是把bit文件是烧写到FPGA中进行在线调试。 bin文件 bin 文件是二进制文件&#xff0c;按顺序只包含原始字节流&#xff0c…

74HC595

简介 74HC595 是一个 8 位串行输入、并行输出的位移缓存器&#xff0c;其中并行输出为三 态输出&#xff08;即高电平、低电平和高阻抗&#xff09; 15 和 1 到 7 脚 QA--QH&#xff1a;并行数据输出 9 脚 QH 非&#xff1a;串行数据输出 10 脚 SCLK 非&#xff08; MR&#…

【UE 材质】制作飘动的旗帜

效果 步骤 1. 首先在建模软件中创建一个平面&#xff0c;注意分段数一定要多 2. 在UE中创建一个材质&#xff0c;这里命名为“Mat_Flag” 打开“Mat_Flag”&#xff0c;先将旗帜纹理连接到基础颜色 先选中导入的模型然后点击根据选中的模型预览材质 创建如下节点可以看到此时模…

本地开发环境大小写不敏感引发的问题

推荐阅读 大小写敏感知多少[1] 文件大小写与文件系统有关&#xff0c;与操作系统无关。 血泪教训--拿到新移动硬盘该做的第一件事[2] MacOS 默认的文件系统APFS&#xff0c;如果没有手动更改&#xff0c;默认不区分大小写(可以在初始化时设置为大小写敏感)。 而公司测试/生产环…

AOSP和AAOS,向左走还是向右走?

Android Automotive OS&#xff08;AAOS&#xff09;和Android Open-Source Project&#xff08;AOSP&#xff09;之间存在很多混乱。这两个Android版本经常被混淆使用&#xff0c;但它们代表不同的平台和方法。为汽车In-Vehicle Infotainment&#xff08;IVI&#xff09;项目选…

2023CSP-S初赛复习整理

目录 逻辑运算常见运算运算规则运算优先级例题 进制转换十进制转二进制、八进制、十六进制二进制、八进制、十六进制转十进制例题 主定理编程语言概况具体分类 逻辑运算 常见运算 非&#xff1a; n o t not not 即 与&#xff1a; a n d and and 即 ∧ ∧ ∧ 或&#xf…

依赖项的处理与层的创建与注册

依赖项的处理与层的创建与注册 依赖项的处理与层的创建与注册 新问题什么是 layer?layer 的创建与注册 与函数同时创建和绑定单独上传 layer 再绑定函数(推荐) 真正的运行时依赖 注册包的约定与平台强关联的运行时 1. 云端安装依赖2. 本地构建 Amazon Linux 2 容器环境3. 利用…

Nginx__高级进阶篇

目录 Nginx Web服务器 Nginx Proxy服务器 Nginx 邮 件 Nginx Web服务器 Nginx Proxy服务器 代理原理 正向代理&#xff1a;内网客户机通过代理访问互联网。通常要设置代理服务器地址和端口。 反向代理&#xff1a;外网用户通过代理访问内网服务器。内…