关于实时流媒体传输的开源库,目前流行的主要有两个:live555和jrtplib. 其中live555将rtp.rtcp和rtsp的传输协议实现集于一身,功能齐全,是个超强的集合体.但是对于嵌入式系统来说,live555的负载明显过大(与tcp直接传输媒体流相比). 而jrtplib则是只实现了rtp和rtcp的部分,而没有实现RTSP的部分.这既是jrtplib的短板,但同时也是jrtplib的优势. 对比一下live555和jrtplib的example程序,我们可以发现jrtplib要容易…
一.搭建RTSP服务器 要想测试RTSP客户端,没有服务端怎么行呢?然而,有时候条件有限,手头并没有独立的RTSP服务器拿来用,那么我们不妨自己撘一个. 以下有2种方便的做法可供选择: 第一种:使用vlc播放器(推荐做法) 这种方法最方便,而且任何视频格式的文件都可以拿来测试,具体做法网上有很多,以下提供一个链接以供参考. http://blog.csdn.net/beitiandijun/article/details/9232405 这种方法只有一个地方需要注意一下: 如果你想让你的vlc…
一.RTSP命令简述 RTSP是用来控制实时流媒体“播放”.“暂停”.“停止”.“录像”等行为的传输协议.该协议规定了一系列命令以及这些命令的发送格式,RTSP客户端可以通过发送这些指定的命令,从而控制媒体流数据的传输.rfc2326上明确指定的有以下11个命令:DESCRIBE, ANNOUNCE, GET_PARAMETER, OPTIONS, PAUSE, PLAY, RECORD, REDIRECT, SETUP, SET_PARAMETER, TEARDOWN.要完成基本的视频流传输,…
一.example逻辑伪码 myRTSPClient附带3个example程序:simple_example.complete_example.common_example.后两个example都是从simple_example中衍生出来的,以下将以simple_example为主进行解析,并且会在最后说明一下另两个example与simple_example的差别. 以下是simple_example简化后的伪代码,以便理解: 1. main(): 2.  myRtspClient Clien…
myRTSPClient是一个轻量级的RTSP客户端C++函数库. 支持多平台,支持H264,H265,MPA等音视频传输. 免费开源,接口易用,配套教程与代码解析(本博客). 适合RTSP入门学习. 适用轻量级RTSP客户端设备开发. 本教程共分为3部分: 1. 收流篇: 使用myRTSPClient接收音视频数据流. 收流篇:(一)简介 收流篇:(二)示例 收流篇:(三)RTSP命令解析 收流篇:(四)example代码解析 2. 解码篇: 使用myRTSPClient接收音视频数据流,然后…
一.概述 myRTSPClient(RTSPClient)获取音视频数据之后,接下来的工作便是将音视频数据交给解码器去解码(ffmpeg),ffmpeg解码之后于是便有了呈现在终端用户(USER)面前的视频(Video)和音频(Audio),具体过程如下图所示. 关于myRTSPClient从RTSP Server那里接收多媒体数据的过程,在<收流篇>中已经做了基本介绍了.接下来,我们来讨论当RTSPClient获取到多媒体数据之后,是怎么将数据交给解码器的.首先介绍视频部分. 二.代码示例(…
当RTSP客户端向RTSP服务端发送DESCRIBE命令时,服务端理应当回复一条SDP报文. 该SDP报文中包含RTSP服务端的基本信息.所能提供的音视频媒体类型以及相应的负载能力,以下是一段SDP示例: RTSP/1.0 200 OK Server: VLC/2.1.6 Date: Sun, 06 Dec 2015 11:51:38 GMT Content-Type: application/sdp Content-Base: rtsp://127.0.0.1:554/ansersion Co…
当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户端,此时RTSP客户端可以调用GetMediaData等接口获取媒体流数据. 一.uint8_t * RtspClient::GetMediaData(string media_type, uint8_t * buf, size_t * size, size_t max_size) 该函数的作用即获…
myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分所有代码均集中在myRtpSession.cpp中,接下来将对其进行分析. 一.获取RTP数据 此处GetMyRTPData获取数据的方式主要是轮询,即每隔USLEEP_UNIT个微秒轮询一次直到获取到一包数据或超时,超时时间为timeout_ms,单位是微秒. GetMyRTPPacket的逻辑与…
RtspClient类是myRTSPClient函数库所有特性集中实现的地方. 主要为用户提供: 1. RTSP协议通信接口函数,如DoOPTIONS(): 2. RTSP账号.密码设置函数,如SetUsername(): 3. 音视频码流接收函数,如GetVideoData(). 本篇主要介绍RtspClient的构造函数和析构函数. 一.RtspClient::RtspClient() RtspClient::RtspClient(): RtspURI(), RtspSockfd(-), R…
myRTSPClient主要可以分成3个部分: 1. RTSPClient用户接口层: 2. RTP 音视频传输解析层: 3. RTP传输层. "RTSPClient用户接口层": 包含所有myRTSPClient的外显特性,包括与RTSP服务器交互接口和音视频数据提取接口,直接供用户使用. "RTP音视频传输解析层": 用于区分不同音视频格式(H264,H265,MPA等等)RTP数据包,分离其中的音视频数据和格式数据."RTSPClient用户接口层&…
截至版本1.2.3,myRtspClient函数库共支持以下6个RTSP命令: (1)OPTIONS (2)DESCRIBE (3)SETUP (4)PLAY (5)PAUSE (6)TEARDOWN 对应的接口函数都以"Do"开头,如"DoOPTIONS".各个接口函数写法相似,大同小异,差异部分会在后续章节做说明,现以DoOPTIONS()和DoPLAY()举例. 一.ErrorType RtspClient::DoOPTIONS(string uri) Err…
该篇内容简单的将前两篇内容组合在一起,创建了2个线程,分别播放音频和视频. int main(int argc, char * argv[]) { RtspClient Client; pthread_t audio_th; pthread_t video_th; ) { cout << ] << " <URL>" << endl; cout << "For example: " << endl…
一.MPEG RTP音频传输 相较H264的RTP传输格式,MPEGE音频传输格式则简单许多. 每一包MPEG音频RTP包都前缀一个4字节的Header,如下图(RFC2550) “MBZ”必须为0(MustBeZero). “Frag_offset”为该包中有效的音频字节数. myRtspClient的任务就是去掉每一个RTP包的前4字节的头,并将音频数据拼接并存入缓冲区,如图: 二.源码分析 在mpeg_types.cpp中,首先分析函数: size_t FU_A::CopyData(uin…
一.H264传输封包格式的2个概念 (1)组包模式(Packetization Modes) RFC3984中定义了3种组包模式:单NALU模式(Single Nal Unit Mode).非交错模式(Non-interleaved Mode)和交错模式(Interleaved Mode). “单NALU模式”:NALU封包在传输过程中必须是整包传输,不可以分包(指应用层的分包,并非指传输层).而且NALU必须是严格按照解码顺序传输,也就是说,假设1s中连续的24帧分别标记为:frame1,fr…
一.差异 本地音视频数据格式和用来传输的音视频数据格式存在些许差异,由于音视频数据流到达客户端时,需要考虑数据流的数据边界.分包.组包顺序等问题,所以传输中的音视频数据往往会多一些字节. 举个例子,有时候一个媒体分包数据量很大(比如H264的一个分包常常会有2-4K),而大多数网络的MTU(最大传输单元)基本都是1500字节. 如果频繁收发这么大的数据包,会额外增添路由器的负担,甚至会导致网络阻塞,不利于网络的稳定. 于是服务器就自行对H264进行了分包以适应MTU,每个分包的开始处往往会多出一…
其实这篇的内容和(一)用ffmpeg解码视频基本是一样的,重点还是给ffmpeg指定callback函数,而这个函数是从RTSP服务端那里获取音频数据的. 这里,解码音频的示例代码量之所以比解码视频的略微复杂,主要是因为ffmpeg解码音频时要比解码视频要复杂一点,具体可以参见ffmpeg解码音频示例以及官网示例代码. 具体内容将不再赘述,源码如下: extern "C" { #include <libavcodec/avcodec.h> #include <liba…
一.myRtspClient音频解析架构 AudioTypeBase是处理解析各种编码的音频数据的接口类.处理MPA数据的MPEG_Audio类和处理g711-mulaw的PCMU_Audio类均从AudioTypeBase继承而来.AudioTypeBase最重要的接口为CopyData,它的作用就是将RTP接收到的实时数据(data)存放到用户的缓存区(buf),每当接收到1包新的RTP数据时,该函数就会得到调用. 二.myRtspClient视频解析架构 NALUTypeBase是处理解析…
混园子也有些年头了,从各个大牛那儿学了很多东西.技术这东西和中国的料理一样,其中技巧和经验,代代相传(这不是舌尖上的中国广告).转身回头一望,几年来自己也积累了一些东西,五花八门涉猎到各种方向,今日开始选一些有价值的开博分享. 首篇分享的是一个基于Mongodb的轻量级领域驱动框架,创作的起源比较杂,首先来自Mongodb,能够直接存储对象.例如: public class Person { public Person(string name) { Name = name; } public O…
前天写了一个基于tcp协议的服务器客户端程序,今天写了一个基于UDP协议的,由于在上一篇使用TCP协议的服务器中注释已经较为详细,且许多api的调用是相同的,故不再另外注释. 使用UDP协议需要注意几点: ①UDP是面向无连接的,客户端在于服务器通信前无须建立连接,且UDP协议不保证发出的消息是否被收到,是否有丢失. ②UDP的接收和发送信息使用recvfrom()与sendto()函数 代码如下: 服务器端: #include <iostream> #include "Ws2tcp…
一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处理: 例如: 拒绝服务(定向到错误页面或返回错误提示信息) 排队或等待(秒杀/评论/下单) 降级(只返回兜底数据或默认数据) 2,需要应用限流的环节 防火墙:firewalld/iptables层的限流,针对每台机器 接入层:nginx的limit_req模块,对每单位时间的平均速率限流,针对某个站…
在SpringBoot项目直接使用okhttp.httpClient或者RestTemplate发起HTTP请求,既繁琐又不方便统一管理.因此,在这里推荐一个适用于SpringBoot项目的轻量级HTTP客户端框架retrofit-spring-boot-starter,使用非常简单方便,同时又提供诸多功能增强.目前项目已经更新至2.2.2版本,并且会持续进行迭代优化. 项目地址:https://github.com/LianjiaTech/retrofit-spring-boot-starte…
''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() client.connect( ('127.0.0.1', 9527) ) print('启动客户端...') while True: client.send(b'hello') data = client.recv(1024) print(data) time.sleep(1) server ''' 服务…
作案工具下载 EasyDarwin 服务端程序,用来接受推流和拉流 FFmpeg 可以用来推流视频数据到服务端,也可以从服务端拉流下来播放,也可以从一个服务端拉流下来,转推到另一个服务端去. EasyPlayer-RTSP RTSP播放器,有PC版,也有手机版 EasyScreenLive 抓屏工具,可以抓取屏幕,并放出RTSP地址,供拉取 部署环境 把FFmpeg解压出来,并把bin目录添加到环境变量 Path 运行服务端 解压EasyDarwin,可以看到个start.bat,运行它,会弹出…
基于REST的Web服务客户端是一款功能强大的谷歌浏览器插件,使用基于REST的Web服务客户端(模拟REST客户端)可以让用户使用谷歌浏览器模拟REST请求来测试REST风格. 基于REST的Web服务客户端的开发背景 REST风格的web架构系统,又称为RESTful架构,它是一种网络数据编程的规范,REST没有具体的标准,它只是一种编程风格或者是一种约束,主要用于网络客户端与服务端的数据交互,比如手机app与云服务器之间的交互,游戏客户端与游戏服务器的交互.REST的一大特点就是表现在其是…
找到一个好的示例框架很难,但不是不可能.大多数是小型Todo风格的应用程序,通常基于SimpleCRUD.值得庆幸的是,Microsoft已经为eShopOnContainers创建了一个基于微服务的.NET Core示例应用程序. eShopOnContainers是 .NET Core示例应用框架,由Microsoft提供支持,基于简化的微服务架构和Docker容器技术. 这个示例应用程序在服务器和客户端是跨平台的,这要归功于.NET Core服务能够在Linux或Windows容器上运行,…
本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决的一些关键问题. 本周章涉及到的代码可以从github上下载: https://github.com/brandonlyg/tinytransport.git. 设计协议 本章要设计的协议是基于TCP的应用层协议.在设计一个协议之前需要先回答以下几个问题: 使用场景是什么? 这个协议有哪些功能? 性…
前后端分离了! 第一次知道这个事情的时候,内心是困惑的. 前端都出去搞 SPA,SEO 们同意吗? 后来,SSR 来了. 他说:"SEO 们同意了!" 任何人的反对,都没用了,时代变了. 各种各样的 SPA 们都来了,还有穿着跟 SPA 们一样衣服的各种小程序们. 为他们做点什么吧?于是 rxModels 诞生了,作为一个不希望被抛弃的后端,它希望能以更便捷的方式服务前端. 顺便把如何设计制作也分享出来吧,说不定会有一些借鉴意义.即便有不合理的地方,也会有人友善的指出来. 保持开放,付…
WoodpeckerCI 是一个由社区维护的 DroneCI 分支,使用 Apache License 2.0 许可证发布.社区版进一步扩展了 pipeline 的功能特性.支持对文件路径设置 pipeline 执行条件,并且可以与 Gitea 实现紧密集成.不同的是,DroneCI 的配置文件是 .drone.yml,WoodpeckerCI 重命名为了 .woodpecker.yml.好在 WoodpeckerCI 也兼容 DroneCI 的配置文件,迁移起来并不会太麻烦. 下面,我们以 t…
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客户端应用程序的设计与开发. 目录: http://www.cnblogs.com/sheng_chao/p/6084144.html SailingEase WinForm Framework 其实这是从 IDE 项目中提取出来的一个纯开发框架,它没有用户管理.权限管理之类的现成功能,而是提供纯开发…