您当前的位置: 首页 > 

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

qianbo_insist 发布时间:2022-06-26 16:04:18 ,浏览量:0

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

关注
打赏
1663161521
查看更多评论
立即登录/注册

微信扫码登录

0.1870s