因为项目要求,需要实现通过摄像头进行视频采集并进行H264的编码。于是就开始了和度娘热火朝天的交流。现在把整个过程整理一下和大家分享。
过程如下:
OpenCV实现摄像头的数据采集和显示:
代码如下:
IplImage *pFrame = NULL;
CvCapture *pCapture = cvCreateCameraCapture(-1); //创建摄像头操作句柄
cvNamedWindow("video",1); //创建图像像是窗体
pFrame = cvQueryFrame(pCapture); //从摄像头中获取一帧图像
cvShowImage("video",pFrame); //显示一帧图像
使用OpenCv实现视频采集和显示起始很简单,在我操作过程一次成功。紧接 着实现视频数据的编码,问题来了!
首先从ffmpeg官网中下载ffmpeg开数据包:
链接如下:http://www.ffmpeg.org/download.html
下载之后将文件解压获取到如下目录:
此处请注意需要更具操作系统的差异选择不同的版本。ffmpeg提供四中种下载模式,分别为:
静态编译版本:提供编译好的指令文件如ffmpeg、ffmplay等可执行文件
共享库编译版本:提供编译好的指令文件如ffmpeg、ffmplay等可执行文件和对应的dll
开发版本:提供编译好的库文件、dll和头文件
源码:直接下载ffmpeg的所有源码。
我在开发中使用了开发版本。
将ffmpeg库文件的路径和头文件路径添加到VS2008的文件目录中:
在程序中添加编码代码:
int switch_format(AVFrame *pYuvFrame,int nWidth, int nHeight,int nDataLen,char *pData,uint8_t *pYuvBuffer)
{
AVFrame *pRgbFrame = NULL;
pRgbFrame = new AVFrame[1];
SwsContext * scxt = sws_getContext(nWidth,nHeight,AV_PIX_FMT_BGR24,nWidth,nHeight,AV_PIX_FMT_YUV420P,SWS_POINT,NULL,NULL,NULL);
//AVFrame *m_pYUVFrame = new AVFrame[1];