协议圣经 五 rtsp client
继续上一节,我们使用live555之后得到rtsp的流,然后再解码进行下一步动作。先进行基础播放,然后再进行分析,后接opencv,直接将码流解到opencv的mat 中。
c++11 thread
c++11 thread 比起使用api 或者 pthread lib 要方便很多了,两种方式比较推荐
1 使用lamba
2 使用封装并继承
thread 封装
class c_thread
{private://线程thread _thread;//等待信号std::mutex _signal_mutex;std::condition_variable _cond;
protected://char _running = false;char _stop = true;//锁定运行状态std::mutex _mutex;
public:c_thread(){}virtual ~c_thread(){}public:char * status(){return &_stop;}void Join(){if (_thread.joinable())_thread.join();}bool IsStop(){return _stop == 1 ? true : false;}void WaitForSignal(){std::unique_lock<std::mutex> ul(_signal_mutex);_cond.wait(ul);}void Notify(){_cond.notify_one();}virtual int Start(){if (_stop == 1)//非運行中{_stop = 0;_thread = std::thread(std::bind(&c_thread::Run, this));return 0;}return -1;} virtual void Stop(){_stop = 1; // true;}virtual void Run() = 0;
};
使用虚函数 virtual void Run() = 0 ,因此实现类必须实现 Run 函数
例子
c_rtspthrad 继承c_thread ,实现Run
class c_rtspthread:public c_thread
{int v_headlen = 0;c_rtsp *v_rtsp = nullptr;//32位hash值uint32_t v_key = 0;// hash(live/1001);uint32_t _recv_stamp = 0;uint32_t _first_stamp = 0;sp_buffer _spbuffer;void *v_flv;c_analyse *v_analyse = NULL;
private://decode use itAVCodec *v_codec = NULL;AVCodecContext *v_codecctx = NULL;AVFrame *v_frame = NULL;//c_analyse *v_analyse = NULL;int do_decode_init(const char *codec);int do_decode_unit();int width(){if (v_codecctx != NULL)return v_codecctx->width;return 0;}int height(){if (v_codecctx != NULL)return v_codecctx->height;return 0;}int Decode2YUV(uint8_t* src, int srcLen, uint8_t *destYuv, int destw, int desth);void Decode2RGB(uint8_t* src, int & srcLen);struct SwsContext *_img_convert_ctx = NULL;
public:void init_start(void * flv,const char * ip, uint16_t port, const char * stream_id,const char * url, uint32_t key);int callback(const char* flag, uint8_t * data, long size);//重写stop函数void Stop();//断线重连void Run();
};
这个例子是继承thread 后实现了一个rtsp 客户端
这个类是从rtsp client 拉取流之后解码使用,可以将rtsp 的流解码成 yuv或者RGB,实际上是BGR,解码后可以做两种动作
1 解码播放
2 解码实现识别分析。
解码到mat
void c_rtspthread::Decode2RGB(uint8_t* src, int & srcLen)
{AVPacket pkt;av_init_packet(&pkt);pkt.data = src;pkt.size = srcLen;int ret = avcodec_send_packet(v_codecctx, &pkt) == 0;av_packet_unref(&pkt);if (ret < 0){fprintf(stderr, "Error sending a packet for decoding\n");return;}while (ret >= 0){ret = avcodec_receive_frame(v_codecctx, v_frame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF){//av_frame_free(&frame);break;}else if (ret < 0) {//fprintf(stderr, "Error during decoding\n");//av_frame_free(&frame);break;}int w = 640; //v_frame->width;int h = 360; //v_frame->height;if (_img_convert_ctx == NULL){_img_convert_ctx = sws_getContext(w, h,v_codecctx->pix_fmt,//PIX_FMT_YUV420P, w,h,AV_PIX_FMT_BGR24,//SWS_POINT,SWS_BICUBIC,NULL,NULL,NULL);}AVFrame *dframe = av_frame_alloc();cv::Mat nmat;nmat.create(cv::Size(w, h), CV_8UC3);//printf("frame %3d\n", v_codecctx->frame_number);av_image_fill_arrays(dframe->data, dframe->linesize, nmat.data, AV_PIX_FMT_BGR24,w, h, 16);sws_scale(_img_convert_ctx, v_frame->data, v_frame->linesize, 0, h, dframe->data, dframe->linesize);if (v_analyse != NULL){v_analyse->pushdata(nmat);}av_frame_free(&dframe);}//av_packet_unref(&pkt);}
播放使用:
1 直接使用opencv
2 使用sdl, 这里使用opencv直接播放就行,使用opencv非常简单
imshow 函数直接显示mat,
分析,使用opencv,
且听下回分解
协议圣经 五 rtsp client相关推荐
- 协议圣经 RTSP(三)
rtsp协议 所有代码实例可能使用go c c++ java nodejs 等任何一种语言 协议捕获使用wireshark Real Time Streaming Protocol 实时流协议.这个协 ...
- php视频流传输,视频流传输协议RTP/RTCP/RTSP/HTTP的区别
用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据.RTCP对RTP进行控制,同步.之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中没 ...
- 协议圣经 四 rtspclient
live555 rtsp client 为了让读者快速掌握或者说快速做出一个rtspclient ,我们使用live555 来做一个客户端,live555是一个比较出名的rtsp协议实现库,虽然说他代 ...
- rtsp协议c语言,RTSP协议
RTSP简介 RTSP(Real Time Streaming Protocol)是由Real Network和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议.RTSP对流 ...
- 【rtsp client取海康IPC H264视频流】——sdp数据格式
rtsp client发送DESCIBE的时候,server响应的数据为sdp数据格式,sdp包含了音视频数据的信息.客户端发送"DESCRIBE",同时Accept头为" ...
- 转: 视频相关的协议族介绍(rtsp, hls, rtmp)
转自: http://www.zhihu.com/question/20621558 作者:杨华 链接:http://www.zhihu.com/question/20621558/answer/15 ...
- VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用
VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用 1.TortoiseSVN上传项目文件 2.VS中同步该项目文件 到此VS 中配置使用Visual SVN系列已经完成如 ...
- 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系
网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系 RTP/RTCP/RTSP/SIP/SDP 关系 1. RTP Real-time Transport Protocol,是用 ...
- 协议圣经(二) RTP组播音视频技巧
协议圣经 协议圣经一是基础,还没有写,先出2 RTP组播 RTP为半应用层,半传输层协议,可以使用tcp,也可以使用udp,组播为D类地址,为何要使用组播,组播对什么有效,如224.3.4.5,端口选 ...
最新文章
- 第一个实例-----我与node.js的第一步接触
- F3PlotStrip
- 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
- 微信小程序,前端大梦想(七)
- StackExchange.Redis 使用 (一)
- 1320A. Journey Planning
- 护航Lazada双11购物节 阿里云CDN全球化火力全开
- MYSQL教程之 concat
- Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)
- HBase之超时机制
- 看完本文若不能让你学通“Python”,我将永远退出IT界
- [Android] android:visibility属性应用
- Mac新手使用技巧——设置Finder(访达)快捷键
- Sonar安装和常见问题解决
- Android查看appPackage和Activity的多种方法
- 最棒的 JavaScript 学习指南(2018版)
- 苹果测试应用可一键生成ios测试UDID证书,IOS怎么安装APP?怎么测试APP?一键搞定
- 3GPP使用方法与协议下载
- There was an error checking the latest version of pip
- html获取 条码枪,获取扫描枪条码
热门文章
- SysTick系统定时器(功能框图和优先级配置)
- android消息机制 Message, Looper,Handler
- 什么时候使用resulttype_ResultMap和ResultType在使用中的区别
- 董明珠上榜中国杰出商界女性100
- 自如总部摘牌?官方回应:更换logo 业务一切正常
- 理想汽车7月交付8589辆理想ONE 单月交付量首次超8000辆
- 你中签了吗?端午节多地发放数字人民币红包!
- 《消费者报告》下调特斯拉Model 3安全评级
- 8部门联合约谈滴滴、高德等10家交通运输新业态平台公司
- iPhone 12s Pro渲染图曝光:屏幕和相机将成升级重点