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的功能,以利于调试。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐