RTP 发送PS流工具(已经开源)

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RTP 发送PS流工具(已经开源)相关的知识,希望对你有一定的参考价值。

RTP接收和发送程序

    实时传输协议一直在构建之中,此次听雨堂RTP程序增加了一个PS流发送,以便于GB28181 程序作为测试。
    对RTP协议的理解越深,越想自己建立一个实时传输协议。
程序界面还是比较粗糙的,等我更新吧,如果做一个界面,可能还是使用QT,因为界面比较繁复,所以暂时没有做这个的打算,还是先使用MFC来做这个。

发送程序

接收程序

增加了几个选项,目前实现了ps流的发送。
代码地址
https://gitee.com/guanzhi0319/rtp。

ps流的发送

   CString audio_device_id = audio_device_index_[cb_select_audio_.GetCurSel()];
    CString video_device_id = video_device_index_[cb_select_video_.GetCurSel()];

    CWnd *pWnd = GetDlgItem(IDC_VIDEO_PRIVIEW);
    CRect rc;
    pWnd->GetClientRect(&rc);

    CString tmp_str;
    edit_ip_.GetWindowText(tmp_str);
    std::string ipaddress = CStringA(tmp_str).GetString();
    edit_port_.GetWindowText(tmp_str);
    int port = _ttoi(tmp_str);
    live_ts_encoder_ = new LiveRTPUdpEncoder(audio_device_id, video_device_id, 640, 480, 
        (OAHWND)pWnd->GetSafeHwnd(), rc.right, rc.bottom, ipaddress,
        port);
    live_ts_encoder_->setStreamType(0);
    live_ts_encoder_->Start();

其中setStreamType是最近修改的主要内容,可以设置成为以下几种方式发送,注意还没有写完,目前实现了rtp ovre udp , ps rtp over udp

typedef enum en_stream_type

    en_rtp,
    en_ts_over_rtp,
    en_ps_over_rtp,
    en_rtmp,
    en_rtsp
en_stream_type;
void LiveRTPUdpEncoder::OnCaptureVideoBuffer(uint8_t *data, int len, unsigned int timestamp, bool isKeyframe)

#define D(x) *(data+x)
	if (SimpleThread::IsStop()) return;

#if 0
	char buffer[32];
	sprintf_s(buffer, "QB:%02x %02x %02x %02x %02x %02x",
		D(0), D(1), D(2), D(3), D(4), D(5));
	OutputDebugStringA(buffer);
	return;
#endif
    uint8_t* odata = NULL;
    int olen = 0;
    uint8_t n = D(4) & 0x1f;
    int isIFrame = n == 0x07;
    switch (v_stream_type)
    
    case en_rtp:
        odata = data;
        olen = len;
        break;
    case en_ps_over_rtp:
        uint8_t* odata;
        int olen;
        v_ps.packagingPs(isIFrame, timestamp, data, len, &odata, &olen);
        break;
    

	//timestamp = GetTimestamp();
    
        Lock lock(this);
        v_rtp.send_video(odata, olen, convertToRTPTimestamp(), isKeyframe);
        if (!gVideoBegin)
            gVideoBegin = true;
    
    if (v_stream_type == en_ps_over_rtp)
        delete[]odata;

需要修正的:

1 程序启动先把摄像头打开,可以直接显示
2 在没有摄像头的情况下,可以把窗口直播出去。

以上两点会在近期更新

需要增加的

1 需要增加rtmp发送和rtsp发送。
2 接收程序增加存储到磁盘IO的功能,以利于调试。

以上是关于RTP 发送PS流工具(已经开源)的主要内容,如果未能解决你的问题,请参考以下文章

RTP 发送PS流零拷贝方案

GB28181设备端PS流封装和发送

PS封装H264码流分析

RTP协议全解析(H264码流和PS流)

PES,TS,PS,RTP等流的打包格式解析之PES流

流媒体传输协议---RTP---荷载PS流