将摄像头原始RGB数据流编码成H.264文件

这篇博客介绍了如何利用ffmpeg库,将来自摄像头的RGB原始数据流转换并编码成H.264格式的视频文件。通过C++代码展示了从RGB数据到YUV转换,以及保存为avi文件的过程。
摘要由CSDN通过智能技术生成
查阅了很多资料,都是将YUV文件编码成H.264视频,几乎没有找到用摄像头数据直接存储为H.264文件的。

以下是我的实现方法,借鉴了网上的一些做法,整合而成。需要先安装ffshow

extern "C"

{

#include "avcodec.h"

#include "avformat.h"

#include "avio.h"

#include "avutil.h"

#include "common.h"

#include "intfloat_readwrite.h"

#include "inttypes.h"

#include "log.h"

#include "mathematics.h"

#include "mem.h"

#include "rational.h"

#include "stdint.h"

#include "swscale.h"

}


#pragma comment(lib,"avcodec.lib")

#pragma comment(lib,"avformat.lib")

#pragma comment(lib,"avutil.lib")

#define RGBTOYUV(B, G, R, Y, U, V) \

Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;\

U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128;\

V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128;


size_t BufSize = 9437184;

BYTE *pStream = new BYTE[BufSize];

BYTE* pBmp24;

int CALLBACK SnapThreadCallback(BYTE *pBuffer) //摄像头显示回调函数

{


pBmp24 = CameraISP(pBuffer);

if(pBmp24)

{

if (bVideo)

{

memcpy(pStream, pBmp24, BufSize);

}

CameraDisplayRGB24(pBmp24);

}

return TRUE;

}


void CXXDlg::OnBtnVideo() 

{

    // TODO: Add your control notification handler code here

    //CWinThread *pVedioStart;

    if (m_VideoMode != VIDEOMODE_PLAY)

    {

        GetDlgItem(IDC_BTN_VIDEO)->SetWindowText("停止录像");    

        AfxBeginThread((AFX_THREADPROC)VIDEO, this, THREAD_PRIORITY_ABOVE_NORMAL, 0, NULL);

        m_VideoMode = VIDEOMODE_PLAY;        

    }

    else

    {

        m_VideoMode = VIDEOMODE_STOP;

        GetDlgItem(IDC_BTN_VIDEO)->SetWindowText("开始录像");        

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值