
软件开发
文章平均质量分 65
音视频牛哥
牛哥@大牛直播SDK,致力于跨平台的实时RTMP推流、转发、RTMP/RTSP直播播放、GB28181设备接入...
展开
-
Nginx RTMP 通知模块 (ngx_rtmp_notify_module) 详细分析
该模块的核心作用是监听 RTMP 流会话的各种事件,并通过 HTTP 通知外部系统。通过配置指令,用户可以灵活地指定哪些事件需要被通知,并设置通知的方式(如 HTTP POST 或 GET)。对于直播和推流应用,实时的通知机制是非常重要的,可以用于实现监控、告警、统计等功能。模块的工作流程:配置 RTMP 事件和对应的通知 URL。监听 RTMP 事件(如连接、断开、发布、播放等)。在事件触发时,根据配置生成 HTTP 请求,发送通知。如果发生重定向,自动处理并更新通知目标。原创 2025-03-27 10:48:16 · 614 阅读 · 0 评论 -
Nginx RTMP AMF 模块代码分析
基本类型: 数字类型(0x00): 布尔类型(0x01): 字符串类型(0x02): 对象类型(0x03): 空值类型(0x05): 空数组类型(0x06): 混合数组类型(0x08): 结束标记(0x09): 数组类型(0x0a)扩展类型: 8位整数(0x0100): 16位整数(0x0101): 32位整数(0x0102): 变体类型(0x0103)标志位: 可选类型: 无类型标识: 上下文标识数据元素结构type: 数据类型name: 数据名称(字符串)data: 数据本身(指针)len: 数据长度。原创 2025-03-27 10:37:22 · 279 阅读 · 0 评论 -
nginx-rtmp-module之ngx_rtmp_live_module.c代码详解
Nginx RTMP 直播模块通过这些功能使得流的管理、发布、播放、同步变得更加灵活和高效。模块通过 RTMP 协议进行流媒体的推送和拉取操作,并提供了流的生命周期管理(如暂停、恢复、开始和结束播放)。此外,还提供了带宽管理、流同步等功能,以确保直播体验的稳定性。原创 2025-03-27 10:17:03 · 969 阅读 · 0 评论 -
nginx-rtmp-module之ngx_rtmp_codec_module.c代码详解
RTMP 中继模块的核心功能是提供流的推送(push)和拉取(pull)功能,确保 RTMP 流在多个服务器之间传输的稳定性和可靠性。通过配置文件中的指令,用户可以配置推流和拉流的目标地址、缓冲区大小、重连时间等参数。该模块还提供了自动重连的机制,确保在中继过程中流的连接丢失时能够自动恢复。该模块中有丰富的事件和状态管理,能够实时处理 RTMP 流的各种变化,如流的创建、播放、推送、拉取等。原创 2025-03-27 09:57:41 · 269 阅读 · 0 评论 -
nginx-rtmp-module之ngx_rtmp_bitop.c代码详解
这两个文件主要涉及对比特流的处理,包括:使用结构体来存储比特流的读取状态。提供了多个宏来方便地读取不同长度的比特(8、16、32、64)。通过函数实现了按位读取数据,函数用于解码 Golomb 编码数据。这些功能对于处理 RTMP 流中的视频和音频数据非常重要,特别是在进行压缩和传输时。整体上,这部分代码提供了精细的比特级操作支持,能够处理比特流中的数据读取、错误处理以及 Golomb 编码的解码。原创 2025-03-27 09:51:33 · 406 阅读 · 0 评论 -
ngx_rtmp_flv_module.c — FLV文件处理模块设计与分析
该结构体是每个 RTMP 会话与 FLV 相关的上下文,存储了文件的索引信息、时间戳、音视频的最后更新时间等。会读取 FLV 文件中的数据,并根据音视频的时间戳顺序进行处理。主要负责 RTMP 协议中 FLV 格式的文件处理,包括文件的读取、索引处理、时间戳跳跃、数据发送等功能。:分别表示文件的位置索引和时间戳索引,用于快速定位 FLV 文件的具体数据。该函数用于 FLV 文件的时间戳跳跃,根据新的时间戳定位到文件的正确位置。索引数组,获取时间戳对应的偏移量,进而定位到 FLV 文件中的数据。原创 2025-03-26 22:49:53 · 576 阅读 · 0 评论 -
nginx-rtmp-module之ngx_rtmp.c代码详解
ngx_rtmp.c:主要负责 RTMP 模块的初始化、配置解析、事件和端口管理等核心功能。它定义了 RTMP 模块的初始化流程,配置文件的解析和处理,以及端口和地址的管理,确保 RTMP 协议的正常工作。ngx_rtmp.h:定义了 RTMP 协议所需的各种常量、数据结构和函数指针,提供了 RTMP 协议消息类型、控制消息、事件类型等的定义,同时也定义了 RTMP 会话和网络连接的结构,确保 RTMP 协议的数据传输和处理功能。原创 2025-03-26 22:46:10 · 553 阅读 · 0 评论 -
音视频新人如何快速上手nginx-rtmp-module
通过以上说明,相信你能够更快地熟悉和理解nginx-rtmp-module源码及其背后的Nginx核心思想,帮助你进一步提高代码阅读效率并更快上手实践。Nginx本身就具有连接管理机制,RTMP模块在此基础上实现了自己的RTMP连接处理,包括握手、建立会话、维护RTMP状态等。复用Nginx的配置机制(ngx_conf_t)与内存池机制(ngx_pool_t)。学习本模块对深入理解Nginx源码、协议处理、网络高并发设计都有很大帮助。、内存池机制、事件循环等),再回头看RTMP模块的源码,会更加清晰。原创 2025-03-26 21:41:00 · 722 阅读 · 0 评论 -
音视频直播SDK宝藏公司之大牛直播SDK
我们将持续加大研发投入,紧跟音视频技术的发展趋势,积极探索更高效的视频编码标准、研究低延迟直播的新架构,进一步降低延迟、提升画质,为用户提供更优质的直播体验。为千行百业的数字化转型和升级注入更强劲的动力,向着成为业内为数不多真正稳定可靠的流媒体技术方案提供商的目标稳步迈进。原创 2025-03-25 09:59:06 · 586 阅读 · 0 评论 -
对话音视频牛哥之大牛直播SDK的十年奋进路
我们的产品生态是经过多年精心布局、逐步完善的。在推流方面,大牛直播SDK支持跨平台(Windows、Linux、Android、iOS)的RTMP直播推流,不仅兼容H.264,还率先支持RTMP扩展H.265推送。它具备多实例运行能力,能同时进行快照、录像,还能实现实时静音及外部编码前后音视频数据对接。特别在Windows平台,可完成超高帧率推送(50帧+),满足了如游戏直播等对画面流畅度要求极高的场景需求。对于播放模块,我们有业内领先的RTMP、RTSP以及HTTP-FLV直播播放器SDK。原创 2025-03-24 23:38:24 · 822 阅读 · 0 评论 -
C++20之2025年上桌我坐哪里?
C++20作为C++语言的一次重大更新,带来了模块、协程、概念、范围等一系列革命性的特性。这些特性不仅在语法和功能上对老版本进行了扩展和改进,还在开发效率、代码质量、程序性能等多个方面带来了显著的优势。对于C++开发者来说,深入学习和掌握C++20的新特性,将有助于编写出更优秀、更现代化的C++代码,更好地应对现代软件开发中的各种挑战。随着C++标准的不断演进,未来还将有更多新特性加入,我们有理由期待C++在未来的编程世界中继续发挥重要作用。coder们,你们说,2025年,我还能不能上桌?上桌我坐哪里?原创 2025-03-12 09:39:20 · 733 阅读 · 0 评论 -
结合Linux平台RTSP|RTMP播放器demo谈谈std::remove_if
好多开发者可能会疑惑,你一个搞音视频开发的,怎么做起了C++基础普及的事情?搞音视频底层开发的,大多需要有相对好的C C++基础,这里提到的std::remove_if,也是因为大牛直播SDK的demo代码里面有用到。有些对接的开发者容易疑惑,做个基础的扫盲。它的主要功能是根据用户提供的条件,将容器中满足该条件的元素移除。通过这种方式,你可以方便地根据自定义条件从容器中移除元素,并且代码简洁高效。原创 2025-01-21 17:57:40 · 265 阅读 · 0 评论 -
音视频基础扫盲之认识PCM(Pulse Code Modulation,脉冲编码调制)
例如,对于 5.1 声道、采样率为 48000Hz、位深度为 24 位的音频,每个样本占用 3 个字节(24 位转换为 3 个字节)。例如,对于同样采样率为 44100Hz、位深度为 16 位、时长为 5 秒的立体声音频,总样本数量为 220500×2(左右声道各有相同数量的样本)。数据存储时,先存储左声道第一个样本的 2 个字节,再存储右声道第一个样本的 2 个字节,然后是左声道第二个样本、右声道第二个样本,以此类推。按照特定的声道顺序依次存储每个声道的样本,同样可以采用交错或非交错的方式。原创 2024-11-25 16:54:58 · 1218 阅读 · 0 评论 -
音视频基础扫盲之I帧和IDR帧区别
I帧是一种独立的帧,它不依赖于其他帧进行编码。I 帧包含了完整的图像信息,可以单独解码成一幅完整的图像。作用:作为视频序列中的关键参考帧,I 帧为视频的解码提供了初始的图像数据。在视频播放过程中,如果出现丢包或错误,播放器可以利用 I 帧进行恢复,重新开始解码过程。例如,在网络不稳定的情况下,当部分帧丢失时,播放器可以等待下一个 I 帧到达后继续解码播放,从而减少播放中断的影响。原创 2024-11-25 16:36:21 · 988 阅读 · 0 评论 -
计算机视觉之OpenCV vs YOLO
OpenCV 和 YOLO 在计算机视觉领域各有特点和优势。OpenCV 是一个功能强大的计算机视觉库,提供了广泛的算法和工具;而 YOLO 是一种高效的目标检测算法,适用于特定的应用场景。在实际应用中,可以根据具体需求选择合适的工具和算法。原创 2024-10-10 00:03:54 · 5011 阅读 · 0 评论 -
计算机视觉之YOLO算法基本原理和应用场景
YOLO 作为一种高效的目标检测算法,在视觉分析中具有广泛的应用前景。随着技术的不断发展,YOLO 将不断改进和创新,为计算机视觉领域带来更多的突破和进步。原创 2024-10-09 23:13:05 · 2037 阅读 · 0 评论 -
ONVIF、GB28181技术特点和使用场景分析
ONVIF(Open Network Video Interface Forum)即开放型网络视频接口论坛,是一个全球性的开放性行业论坛,旨在推动基于网络的物理安防产品的互操作性。好多开发者希望搞明白ONVIF和GB28181的区别和各自适合的场景,为什么大牛直播SDK只做了GB28181接入端,没有做ONVIF?本文就二者差别,做个大概的介绍。GB28181 即《公共安全视频监控联网系统信息传输、交换、控制技术要求》,是中国国家标准,在视频监控领域发挥着重要作用。原创 2024-09-30 15:42:02 · 1721 阅读 · 0 评论 -
鸿蒙操作系统(HarmonyOS)生态与机遇
在物联网时代,各种智能设备层出不穷,鸿蒙系统的分布式特性使其能够很好地适应这一趋势,实现不同设备之间的高效互联和协同工作,为万物互联奠定了基础,具有广阔的发展前景。:可作为智能家居的核心 “大脑”,实现家庭中各种设备如灯光、空调、电视、窗帘等的互联互通和智能控制,为用户打造便捷、舒适的智能家居体验,推动智能家居行业的发展。:微内核仅包含操作系统最基本的功能模块,具有更高的安全性和稳定性,降低了系统被攻击的风险,同时也提高了系统的运行效率,能更好地保障用户数据和隐私安全。原创 2024-09-23 00:42:36 · 2095 阅读 · 0 评论 -
拥抱变化之FFmpeg 7.0与VVC
相比于之前的编码标准,VVC在相同视频质量下能够显著减少数据传输和存储的带宽需求,为高清、超高清甚至8K视频内容的传输和播放提供了强有力的支持。:VVC采用了一系列新的编码技术和工具,如更灵活的块划分方法(如Multiple-Type Tree,MTT)、更多的帧内预测模式、增强的帧间预测技术等,这些技术共同提升了VVC的编码效率和视频质量。此外,VVC标准的应用还需要考虑视频内容的版权保护等问题。然而,随着技术的不断进步和VVC标准的不断演进,我们可以期待更高的压缩性能、更好的视频质量和更广泛的应用。原创 2024-09-21 19:53:01 · 1474 阅读 · 0 评论 -
GB28181和SIP网关优缺点分析
GB28181和SIP网关各有其优缺点,在实际应用中需要根据具体需求和场景进行选择。对于需要实现视频监控系统的互联互通和统一管理的场景,GB28181是一个较好的选择;而对于需要实现跨网络、跨协议通信的场景,SIP网关则具有更大的优势。原创 2024-09-13 10:58:43 · 547 阅读 · 0 评论 -
如何实现视频数据的PES打包和传输?
实现视频的PES(Packetized Elementary Stream)打包和传输涉及多个步骤,主要包括视频数据的编码、PES打包、以及通过网络协议的传输。使用视频编码器(如H.264、H.265等)对原始视频数据进行编码,生成编码后的视频码流(ES,Elementary Stream)。将ES包的数据(即编码后的视频数据)添加到PES包中,PES包由PES头部和负载(payload)组成。如果视频数据需要保密传输,可以在PES打包过程中加入加密控制字段,对视频数据进行加密处理。原创 2024-09-12 21:53:19 · 553 阅读 · 0 评论 -
I420和YV12有什么区别?
I420和YV12是YUV420颜色编码格式中的两种不同存储方式,它们之间的主要区别在于色度分量U和V的存储顺序。原创 2024-09-11 17:50:01 · 598 阅读 · 0 评论 -
AVC编码规格之Baseline、Main、High profile区别
规格功能特点应用场景Baseline支持I/P帧,无交错和CAVLC低阶或需要额外容错的应用,如视频通话、手机视频Main支持I/P/B帧,无交错和交错,CAVLC和CABAC主流消费类电子产品规格,如mp4、便携视频播放器、PSP、iPodHigh在Main基础上增加高级编码工具,如8x8内部预测、自定义量化等对视频质量和编码效率要求极高的场景,如广播、视频碟片存储、高清电视。原创 2024-09-11 11:38:44 · 905 阅读 · 0 评论 -
如何看待2020年的最新国际视频编解码标准H.266?
H.266作为最新一代国际视频编码标准,在压缩效率、新编码工具与技术改进、支持新型视频类型和应用等方面都展现出了显著的优势。然而,其推广和应用也面临着专利许可等挑战。未来,随着技术的不断发展和完善,H.266有望在视频编码领域发挥更大的作用。原创 2024-09-11 11:26:46 · 924 阅读 · 0 评论 -
细数H.264 H.265 H.266区别
H.264:也称为AVC(Advanced Video Coding),是MPEG-4的第十部分,由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT)提出的高度压缩数字视频编解码器标准。H.264以其高压缩比和广泛的兼容性成为目前最普遍、用途最广泛的编码格式。H.265:也称为HEVC(High Efficiency Video Coding),是H.264的后继产品,旨在提供更高的压缩效率和更好的图像质量。原创 2024-09-11 11:12:03 · 2969 阅读 · 0 评论 -
C++11 14 17 20 23进化史
C++11、C++14、C++17、C++20和C++23是C++语言标准的不同版本,它们之间在功能、特性和语法上存在一些区别。原创 2024-09-09 21:46:43 · 1175 阅读 · 0 评论 -
C++为什么要引入智能指针?
C++ 引入智能指针是为了更好地管理动态分配的内存,减少内存泄漏、野指针和异常安全等问题,提高代码的安全性和可靠性原创 2024-09-09 21:42:12 · 840 阅读 · 0 评论 -
CopyOnWriteArrayList技术探究
CopyOnWriteArrayList的优势在于可以保证线程安全的同时,不阻塞读操作,但是这仅限于读多写少的情况,在写多读少的情况下,或者写入的对象占用内容较大时,不建议使用。原创 2024-08-14 23:41:40 · 183 阅读 · 0 评论 -
多路RTSP转RTMP推送方案的两个选择
RTSP转RTMP模块设计,可以用ffmpeg直接命令行转发,也可以用方案二的非常成熟的转发设计,ffmpeg转发,需要有一定的代码基础,有问题的话,bug修复需要对底层逻辑非常了解才行,方案二,技术成熟,二次开发难度不大,很同意集成到自己现有系统,感兴趣的开发者,可以单独跟我沟通交流。原创 2024-08-09 10:53:14 · 1409 阅读 · 0 评论 -
Linux平台x86_64|aarch64架构如何实现轻量级RTSP服务
我们在做Linux平台x86_64架构或aarch64架构的推送模块的时候,有公司提出这样的技术需求,希望在Linux平台,实现轻量级RTSP服务,实现对摄像头或屏幕对外RTSP拉流,同步到大屏上去。[V4L2摄像头]支持V4L2摄像头设备选择(设备文件名范围:[/dev/video0, /dev/video63])、分辨率设置、帧率设置;[屏幕/V4L2摄像头]支持帧率、关键帧间隔(GOP)、码率(bit-rate)设置;[V4L2摄像头]支持水平反转、垂直反转、0° 90° 180° 270°旋转;原创 2024-07-05 15:19:22 · 506 阅读 · 0 评论 -
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
Linux平台RTSP、RTMP播放器数据跟python交互,两种方式均可,bitmap实现,也不麻烦,需要注意的时候,由于解码后的单帧数据比较大,建议适当控制导出的bitmap文件数。原创 2024-06-28 17:12:54 · 493 阅读 · 0 评论 -
拉取RTSP流后的几个去向探讨(播放|转RTMP|轻量级RTSP服务|本地录制|GB28181)
Android平台拉取RTSP流后,有了数据源,开发者可以在一个推送实例中,转推到不同的业务场景,实现高效率低延迟的数据转发。原创 2024-01-31 15:41:33 · 662 阅读 · 0 评论 -
Android端获取设备IP地址代码
当然有些场景下,不一定可以拿到设备IP,这时候,需要手动设置IP地址到模块。原创 2023-11-26 12:36:34 · 716 阅读 · 0 评论 -
什么是TCP粘包?如何避免TCP粘包?
4. 使用消息协议:定义自己的消息协议(如使用特定格式的消息头),在发送和接收数据时,按照协议规定的格式进行打包和拆包。2. 固定长度:固定每个数据包的长度,无论实际数据有多少,都按照固定的长度进行发送和接收。TCP粘包是指发送方在发送数据时,由于网络传输的特性,多个数据包可能会被接收方一次性接收到,从而导致粘在一起的现象。1. 发送方发送的数据小于TCP缓冲区的大小,导致多个小的数据包被合并成一个大的数据包发送。2. 发送方快速连续发送多个数据包,接收方在一次接收中接收到了多个数据包。原创 2023-10-28 00:18:59 · 667 阅读 · 0 评论 -
C++智能指针之shared_ptr原理和应用举例
当ptr2和ptr3超出作用域时,引用计数减1,但由于ptr1仍然存在,所以MyClass对象不会被销毁。当ptr1超出作用域时,引用计数为0,MyClass对象会被自动释放,析构函数调用打印出相应的信息。3. shared_ptr在对象不再需要时自动释放,无需手动delete,避免了悬空指针和重复释放的问题。1. shared_ptr可以通过复制来共享对象的所有权,多个指针可以同时指向同一个对象。3. 当一个新的shared_ptr指向一个对象时,引用计数加1。5. 当引用计数为0时,对象会被自动释放。原创 2023-10-26 23:49:40 · 272 阅读 · 0 评论 -
如何使用C++11原子操作实现自旋锁
C++自旋锁是一种低层次的同步原语,用于保护共享资源的访问。自旋锁是一种轻量级的锁,适用于短时间的资源锁定。自旋锁的特点:当一个线程尝试获取已经被另一个线程占有的自旋锁时,这个线程会进入一个循环(自旋),在这个循环中它不断地检查锁是否已经被释放。如果锁已经被释放,那么该线程就可以获取到锁并执行。如果锁仍然被占用,该线程就会一直处于自旋状态,直到获取到锁。自旋锁的一个重要特点是它不会导致调用者睡眠,如果自旋锁已经被占用,调用者会一直处于忙等待状态,直到能够获取到锁。原创 2023-09-02 22:43:50 · 356 阅读 · 0 评论 -
原子类型AtomicLong用法探究
LongAdder 是把 value 分成若干cell,并发量低的时候,直接 CAS 更新值,成功即结束。并发量高的情况,CAS更新某个cell值和需要时对cell数据扩容,成功结束; 是 Java 提供的一个原子长整型类,提供了对长整型数据的原子性操作。 对象的原子性操作,确保在多线程环境下的数据安全性。 的原子性操作,我们可以在多线程环境下安全地递增 。 的使用方法和功能与标准 Java 中的 。 可以确保对长整型数据的操作是线程安全的。,避免了竞态条件的问题。原创 2023-07-22 19:15:29 · 675 阅读 · 0 评论 -
C++设计模式之责任链模式
当需要将请求发送给多个对象处理时或需要动态指定处理请求的对象集合时,如果在不明确接收者的情况下,将请求发送给多个对象中的一个或多个时,可以使用责任链模式。责任链模式将发送者和接收者解耦,提高了系统的灵活性和可扩展性。将这些接受处理的对象连成一条链,并沿着该链处理请求,收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。,它包含一个责任链,可以将请求传递给链上的每个处理者。在测试代码中,我们创建了处理者对象和请求者对象,并将责任链设置为。,以及两个具体的处理者类。原创 2023-07-20 23:50:50 · 173 阅读 · 0 评论 -
C++实现设计模式之观察者模式
观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。然后,当主题的状态改变时,所有附加的观察者都会收到通知并执行相应的操作。是具体的主题实现,它维护一个观察者列表,并在状态改变时通知所有观察者。是具体的观察者实现,它在被通知时执行特定的操作。在主函数中,我们创建了一个。是观察者接口,。实例,并将三个。原创 2023-07-19 23:49:48 · 231 阅读 · 0 评论 -
C++14新特性扫盲探究
闲暇之时,聊到C++14,实际上C++14相对之前的11并没有太大的改动,或者说更像C++11标准基础上的查漏补缺,C++14之后,还有17、20甚至23,所以说,C++14更像个过渡版本。原创 2023-07-12 23:39:44 · 288 阅读 · 0 评论