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
两个同时启动以后,点击encode的开始,点击decode的开始,就开始传输画面,画面修改成为16:9的模式,发送端首先修改
如以下代码,讲画面拦截成为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。
注意关掉decoder, 打开代码下的test.sdp 文件,就打开了,显示出画面,vlc 如果演示时间不改,比decoder会延时一些。