hur.cn - 华软网

 热门搜索

[求助]VFW采集的视频如何压缩成H263?

  作者:未知    来源:网络    更新时间:2011/5/26
准备实现的功能:
========================
发送端:
用VFW采集USB摄相头的视频,压缩成H263,最后用jrtplib打包成RTP流发送出去。

接收端:使用jrtplib,H263进行解码播放视频。
========================
自己写的程序,跟一个SIP电话软件Linphone进行通信,
发给对方的视频流,对方解析时提示忽略I帧,解码出问题。

我自己写的程序负责采集视频,压缩后发给Linphone软件
压缩成H263用的是一个DLL文件,主要提供帧内和帧间编码两个函数;
========================
另外,从网上找了些开源的H263代码,因为是处理视频文件的,并且算法比较复杂,
还没使用这个开源的H263进行测试。
========================
采集视频用了两种格式的USB摄相头,
一个不需要安装驱动,采集的是YUV格式;
另外一个需要安装驱动,采集的是RGB格式
========================
不知道是不是都可以直接压缩成H263,还是需要转换格式后再进行压缩?
---华软 网友回答---
不需要安装驱动的USB摄相头,获取的参数;



需要安装驱动的USB摄相头,获取的参数

---华软网友回复---
1  VFW 很早就已被 DSHOW 代替。

2  当然这两种方式都是可行的。

3  Video 即每桢图像,有 YUV444 422 等多种格式,

    看你的 codec 吃什么乐。

    格式间可以相互转换。费 CPU。

4  I 是关键桢,丢弃影响后续 decode,等下一个 I 才能正确解。
---华软网友回复---
在网上看资料介绍:
(1)biCompression = 0
表示采集的视频默认格式是RGB;

(2)biCompression = 844715353
表示采集的视频默认格式是YUV。

LinqPhone软件发送的Invite请求中,关于视频部分的的SDP:
m=video 1234 RTP/AVP 34  --对方在1234端口接收视频
a=rtpmap:34 H263/90000   --H263负载类型是34,采样率是90000
a=fmtp:34 QCIF=2         --QCIF=2,这个不知道是什么意思??????

使用h263.dll,进行压缩,用到的接口函数:

C++">//视频编码解码
BYTE* VideoCodeSrc;   //保存压缩前的视频
BYTE* VideoCodeDest;  //保存压缩后的视频

int m_nFirstFrame;

LRESULT CALLBACK OnCaptureVideo(HWND mwnd, LPVIDEOHDR lphdr)
{
int len;
VideoCapture *vidcap=(VideoCapture *)capGetUserData(mwnd);

if (FALSE == bVideoCodesInit)
{
bVideoCodesInit = TRUE;
m_nFirstFrame = 0;

TRACE("%s\n", "初始化视频编码库");
InitEncoder((BYTE **)&VideoCodeSrc,   (BYTE **)&VideoCodeDest,   VideoW, VideoH);
InitDecoder((BYTE **)&VideoDecodeSrc, (BYTE **)&VideoDecodeDest, VideoW, VideoH);
}

if(vidcap != NULL )
{
                //lphdr->lpData 采集到的视频数据
                //lphdr->dwBytesUsed 视频数据的长度
((CXXDlg*) (vidcap->dlg))->DisplayVideo(lphdr->lpData, lphdr->dwBytesUsed);

   char *buf = (char*)lphdr->lpData;
len = lphdr->dwBytesUsed;
memset(VideoCodeSrc,0,len);  
                memset(VideoCodeDest,0,len); 
memcpy(VideoCodeSrc, buf, len);    

if(m_nFirstFrame++%SEND_INTRACODEC_FRAME==0)
len = EncodeOneIntra(); //帧间编码
else
len = EncodeOneInter(); //帧内编码

//压缩后的视频,拷贝到buf中
memcpy(buf, VideoCodeDest, len);  

                //使用jrtplib发送视频RTP视频流
}

return TRUE;
}

---华软网友回复---
引用 2 楼 jslisong 的回复:
1 VFW 很早就已被 DSHOW 代替。

2 当然这两种方式都是可行的。

3 Video 即每桢图像,有 YUV444 422 等多种格式,

  看你的 codec 吃什么乐。

  格式间可以相互转换。费 CPU。

4 I 是关键桢,丢弃影响后续 decode,等下一个 I 才能正确解。

=========================
从USB摄相头采集到的原始视频,可以获取到YUV么? 
---华软网友回复---
这取决于 PC Camera 本身所能支持的格式。不能一概而论。
---华软网友回复---
之前听一个朋友讲:
biCompression就是数据格式
关于原始图像数据的格式,一般分两大系,
YUV系和RGB系,RGB格式主要用于图像编辑处理。
对于编码器,通常支持YUV系,YUV里面通常支持YUV412,
==========================
如果采集到RGB24格式的视频的话,
需要先转换成YUV格式,才可以进行压缩处理么?
==========================
从网上找的一个开源的程序,
可以把那个需要安装驱动的USB摄相头采集的视频,
(原始视频格式可能是RGB24)
转换成YUV420

C++">//  Convert from  RGB24 to YUV420
int ConvertRGB2YUV(int w,int h,unsigned char *bmp,unsigned int *yuv)
{ //先把RGB转换成YUV,然后再进行帧内和帧间压缩编码。。。

---华软网友回复---
引用 5 楼 jslisong 的回复:
这取决于 PC Camera 本身所能支持的格式。不能一概而论。



首先需要取得视频数据,数据格式这里比较模糊,采用vfw从camera取得的原始数据是什么,avi的吧,压缩或者不压缩的,没有看到说能取到yuv.
---华软网友回复---
引用 5 楼 jslisong 的回复:
这取决于 PC Camera 本身所能支持的格式。不能一概而论。

--------------------------
如果采集的原始视频,是YUV格式的话,
能否确定是YUV444,YUV422,YUV420, YUV412当中的哪一个呢?
---华软网友回复---
YUV2对应的就是4:2:2,
这里指的是采样
---华软网友回复---
搜索了一些相关参考资料,不知道是否可以参考下。。。

H263视频压缩问题
http://topic.csdn.net/u/20080830/00/154EE98A-98AE-4584-897A-451971D2F2A6.html

H263网络实时视频问题
http://topic.csdn.net/u/20090304/09/1ABBF6E8-D616-4F26-919D-095B0F4D256E.html

如何将摄像头获取得RGB视频转换成H263格式得压缩视频
http://topic.csdn.net/t/20030515/21/1790224.html

H263视频压缩后显示问题
http://topic.csdn.net/u/20080903/19/3ABC9144-1432-40B4-923A-839D55221682.html

关于16位摄像头的问题
http://topic.csdn.net/u/20070404/22/5AE375EA-B2BE-413D-82E9-079018D1722A.html

抓取单帧图像是 16位,bicompression的值为844715353?是RGB565还是RGB555呢?
http://topic.csdn.net/u/20100511/09/AD5F77E0-50F9-4013-A492-E400E982FF81.html

BITMAPINFOHEADER相关
http://topic.csdn.net/u/20110412/10/471E86C6-9DEE-43C6-8C8A-EBE6B29EC0CB.html

vfw捕获到摄像头为YUY2格式如何处理
http://topic.csdn.net/u/20071228/14/CB22C61F-46BC-42B1-943F-C1F420924932.html

16位图像数据如何保存为24位bmp图像
http://topic.csdn.net/u/20101022/16/B35D1AA5-AE42-405A-A462-1C3037C7F22B.html#r_69268852

如何得到这个bitmap的实际位图占用的字节数
http://topic.csdn.net/u/20090226/21/2603D0B3-E0AC-4085-ACD7-F4330AAFDFF8.html
---华软网友回复---
YUV2对应的就是4:2:2
---华软网友回复---
如果采集的原始视频是YUV2,
不用RGB转YUV,
就可以直接压缩成H263么?
---华软网友回复---
YUV2 就是 YUV422么,或者说 4:2:2
可以这样理解么?
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。