RTP 接发ps流工具改进(三)

前篇

RTP 接发ps流工具改进(二)

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

代码地址
https://gitee.com/guanzhi0319/rtp

注:
两种方式发送,一种直接rtp方式,一种ps over rtp方式
代码里面有直接rtp方式发送,可以修改代码成为直接的rtp方式也是可以的

现在

今天修正了一下发送和接收sdp的方式,因为用vlc 是可以直接打开ps流的,后续也会做rtsp的形式转发ps流

vlc sdp文件如下:

m=video 6000 RTP/AVP 96
a=rtpmap:96 MP2P/90000
a=framerate:20
c=IN IP4 127.0.0.1

存成test.sdp文件后,使用工具点击发送,然后打开test.sdp.
工具在配置里面选启动选成多个启动项目,同时打开decode和encode
RTP 接发ps流工具改进(三)_第1张图片

启动界面

两个同时启动以后,点击encode的开始,点击decode的开始,就开始传输画面,画面修改成为16:9的模式,发送端首先修改
RTP 接发ps流工具改进(三)_第2张图片

如以下代码,讲画面拦截成为16:9来进行传输

void VideoEncoderThread::Start()
{
	if (v_yuvbuf != NULL)
	{
		delete[]v_yuvbuf;
		v_yuvbuf = NULL;
	}
	int dh = v_w * 9 / 16;
	unsigned long yuvimg_size = v_w * dh * 3 / 2;
	if (v_yuvbuf == NULL)
		v_yuvbuf = (unsigned char*)malloc(yuvimg_size);
	if (ds_video_graph_)
	{
		//ds_video_graph_->Start(NULL, this);
		ds_video_graph_->Start(video_callback, this);
	}
	SimpleThread::Start();
}

显示的时候相应也要修改

void c_drawrgb24::Draw2(HWND hWnd, HWND hWnd2,unsigned char * buffer, int SrcW, int SrcH)
{
	HDC hDCDst1 = NULL;
	HDC hDCDst2 = NULL;
	RECT destRect1;
	RECT destRect2;
	if(hWnd!=NULL)
	{
		hDCDst1 = GetDC(hWnd);
		GetClientRect(hWnd,&destRect1);
	}
	if(hWnd2!=NULL)
	{
		hDCDst2 = GetDC(hWnd2);
		GetClientRect(hWnd2,&destRect2);
	}

	if(!m_bInit)
	{
		m_bInit = true;
		m_lpBmpInfo=new BITMAPINFO;
		m_lpBmpInfo->bmiHeader.biSize  = sizeof(BITMAPINFOHEADER);
		m_lpBmpInfo->bmiHeader.biWidth =   SrcW;
		m_lpBmpInfo->bmiHeader.biHeight=   -SrcH;
		m_lpBmpInfo->bmiHeader.biPlanes= 1;
		m_lpBmpInfo->bmiHeader.biBitCount      = 24;
		m_lpBmpInfo->bmiHeader.biCompression   = 0;
		m_lpBmpInfo->bmiHeader.biSizeImage     = 0;
		m_lpBmpInfo->bmiHeader.biXPelsPerMeter = 0;
		m_lpBmpInfo->bmiHeader.biYPelsPerMeter = 0;
		m_lpBmpInfo->bmiHeader.biClrUsed=0;
		m_lpBmpInfo->bmiHeader.biClrImportant  = 0;

		//CDC * dc =  CDC::FromHandle(hDCDst);
		//m_pMemDC = new CMemDC(*dc,DestRect);
	}

	if(hDCDst1!=NULL)
	{
		int DstWidth  = destRect1.right-destRect1.left;
		int DstHeight = destRect1.bottom- destRect1.top;
        //16:9
        DstWidth = DstHeight * 16 / 9;
		SetStretchBltMode(hDCDst1,STRETCH_HALFTONE);
		::StretchDIBits(
			//m_pMemDC->GetDC().GetSafeHdc(),
			hDCDst1,
			0, 0, DstWidth, DstHeight,
			0, 0, SrcW, SrcH,
			buffer, m_lpBmpInfo, DIB_RGB_COLORS, SRCCOPY );
		ReleaseDC(hWnd,hDCDst1);
	}
	if(hDCDst2!=NULL)
	{
		int DstWidth  = destRect2.right-destRect2.left;
		int DstHeight = destRect2.bottom- destRect2.top;
		SetStretchBltMode(hDCDst2,STRETCH_HALFTONE);
		::StretchDIBits(
			//m_pMemDC->GetDC().GetSafeHdc(),
			hDCDst2,
			0, 0, DstWidth, DstHeight,
			0, 0, SrcW, SrcH,
			buffer, m_lpBmpInfo, DIB_RGB_COLORS, SRCCOPY );
		ReleaseDC(hWnd2,hDCDst2);
	}

}

渲染的方式没有使用其他sdl,directx,或是opengl,为了简单,直接就是StretchDIBits。

使用sdp

注意关掉decoder, 打开代码下的test.sdp 文件,就打开了,显示出画面,vlc 如果演示时间不改,比decoder会延时一些。
RTP 接发ps流工具改进(三)_第3张图片

你可能感兴趣的:(音视频和c++,java,物联网,ffmpeg,c++高级技巧,ffmpeg,架构,git,visual,studio,视频编解码,gitee)