栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998005.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号