继续上一节,我们使用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相关推荐

  1. 协议圣经 RTSP(三)

    rtsp协议 所有代码实例可能使用go c c++ java nodejs 等任何一种语言 协议捕获使用wireshark Real Time Streaming Protocol 实时流协议.这个协 ...

  2. php视频流传输,视频流传输协议RTP/RTCP/RTSP/HTTP的区别

    用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据.RTCP对RTP进行控制,同步.之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中没 ...

  3. 协议圣经 四 rtspclient

    live555 rtsp client 为了让读者快速掌握或者说快速做出一个rtspclient ,我们使用live555 来做一个客户端,live555是一个比较出名的rtsp协议实现库,虽然说他代 ...

  4. rtsp协议c语言,RTSP协议

    RTSP简介 RTSP(Real Time Streaming Protocol)是由Real Network和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议.RTSP对流 ...

  5. 【rtsp client取海康IPC H264视频流】——sdp数据格式

    rtsp client发送DESCIBE的时候,server响应的数据为sdp数据格式,sdp包含了音视频数据的信息.客户端发送"DESCRIBE",同时Accept头为" ...

  6. 转: 视频相关的协议族介绍(rtsp, hls, rtmp)

    转自: http://www.zhihu.com/question/20621558 作者:杨华 链接:http://www.zhihu.com/question/20621558/answer/15 ...

  7. VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用

    VS 中配置使用Visual SVN系列 五:SVN Client的配置和使用 1.TortoiseSVN上传项目文件 2.VS中同步该项目文件 到此VS 中配置使用Visual SVN系列已经完成如 ...

  8. 智能终端会议系统(20)---网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系

    网络视频传输协议--RTP/RTCP/RTSP/SIP/SDP 之间关系 RTP/RTCP/RTSP/SIP/SDP 关系 1. RTP Real-time Transport Protocol,是用 ...

  9. 协议圣经(二) RTP组播音视频技巧

    协议圣经 协议圣经一是基础,还没有写,先出2 RTP组播 RTP为半应用层,半传输层协议,可以使用tcp,也可以使用udp,组播为D类地址,为何要使用组播,组播对什么有效,如224.3.4.5,端口选 ...

最新文章

  1. 第一个实例-----我与node.js的第一步接触
  2. F3PlotStrip
  3. 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
  4. 微信小程序,前端大梦想(七)
  5. StackExchange.Redis 使用 (一)
  6. 1320A. Journey Planning
  7. 护航Lazada双11购物节 阿里云CDN全球化火力全开
  8. MYSQL教程之 concat
  9. Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)
  10. HBase之超时机制
  11. 看完本文若不能让你学通“Python”,我将永远退出IT界
  12. [Android] android:visibility属性应用
  13. Mac新手使用技巧——设置Finder(访达)快捷键
  14. Sonar安装和常见问题解决
  15. Android查看appPackage和Activity的多种方法
  16. 最棒的 JavaScript 学习指南(2018版)
  17. 苹果测试应用可一键生成ios测试UDID证书,IOS怎么安装APP?怎么测试APP?一键搞定
  18. 3GPP使用方法与协议下载
  19. There was an error checking the latest version of pip
  20. html获取 条码枪,获取扫描枪条码

热门文章

  1. SysTick系统定时器(功能框图和优先级配置)
  2. android消息机制 Message, Looper,Handler
  3. 什么时候使用resulttype_ResultMap和ResultType在使用中的区别
  4. 董明珠上榜中国杰出商界女性100
  5. 自如总部摘牌?官方回应:更换logo 业务一切正常
  6. 理想汽车7月交付8589辆理想ONE 单月交付量首次超8000辆
  7. 你中签了吗?端午节多地发放数字人民币红包!
  8. 《消费者报告》下调特斯拉Model 3安全评级
  9. 8部门联合约谈滴滴、高德等10家交通运输新业态平台公司
  10. iPhone 12s Pro渲染图曝光:屏幕和相机将成升级重点