使用DirectShow采集摄像头并对视音频进行H264和AAC实时编码后封装成MP4


使用DirectShow采集摄像头并实时进行H264和AAC编码,然后将其封装成MP4,希望对大家有用
资源截图
代码片段和文件信息
#include “stdafx.h“
#include “GetDeviceInfo.h“
#include “AudioSampleGrabber.h“


UINT AudioDealFunc(LPVOID lpVoid);

UINT AudioDealFunc(LPVOID lpVoid)
{
CAudioSampleGrabber *pManage = (CAudioSampleGrabber*)lpVoid;
if (pManage)
{
pManage->AudioDeal();
}
return 0;
}


CAudioSampleGrabber::CAudioSampleGrabber(void)
:m_mxMsgLog(FALSE NULL NULL)
{
m_hFaacEncHandle = NULL;
m_faacConfigurePtr = NULL;
m_bBeginEncode = FALSE; 
m_bEndEncode = FALSE;
m_bFirst = TRUE;
m_fpOut = NULL;
m_nInputSamples = 0;    //输入采样大小
m_nMaxOutputBytes = 0; //输出大小
//m_audioTotal = 0;
m_sSavePath = _T(““);
m_arrAudioDataInfo.RemoveAll();
m_hMainExitEvent  = CreateEvent(NULLTRUEFALSENULL);
m_bSampleBegin = TRUE;
}


CAudioSampleGrabber::~CAudioSampleGrabber(void)
{
}

ULONG STDMETHODCALLTYPE CAudioSampleGrabber::AddRef() 

return 2; 
}

ULONG STDMETHODCALLTYPE CAudioSampleGrabber::Release() 

return 1; 
}

HRESULT STDMETHODCALLTYPE CAudioSampleGrabber::QueryInterface(REFIID riid void ** ppv)
{
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )

*ppv = (void *) static_cast ( this );
return NOERROR;

        
return E_NOINTERFACE;
}

HRESULT STDMETHODCALLTYPE CAudioSampleGrabber::SampleCB(double SampleTime IMediaSample *pSample)
{

return 0;
}
        
HRESULT STDMETHODCALLTYPE CAudioSampleGrabber::BufferCB(double SampleTime BYTE *pBuffer long BufferLen)
{
CString str;
//str.Format(_T(“
 Audio--BufferLen:%ld“) BufferLen);
//OutputDebugString(str);

if(m_bBeginEncode)
{
BYTE * pcmData = new BYTE[BufferLen];
memcpy(pcmData pBuffer BufferLen);
GrabDataInfo sData;
sData.pData = pcmData;
sData.nDataSize = BufferLen;
sData.dSampleTime = SampleTime;
m_arrAudioDataInfo.Add(sData);

str.Format(_T(“
 Audio--BufferLen:%ld SampleTime:%f 
“) BufferLen SampleTime);
OutputDebugString(str);

if (m_bFirst)
{
m_bFirst = FALSE;

AfxBeginThread(AudioDealFunc this);
}
}

return 0;
}

void CAudioSampleGrabber::AudioDeal()
{
USES_CONVERSION;
string strFullPath = W2A(m_sSavePath);
m_fpOut = fopen(strFullPath.c_str() “wb“);

m_hFaacEncHandle = faacEncOpen(m_nSamplesPerSec m_nChannels &m_nInputSamples &m_nMaxOutputBytes);
if(m_hFaacEncHandle == NULL)
{
OutputDebugString(_T(“faacEncOpen failed“));
return;
}

//获取配置
m_faacConfigurePtr = faacEncGetCurrentConfiguration(m_hFaacEncHandle);
m_faacConfigurePtr->inputFormat = FAAC_INPUT_16BIT;
// 0 = Raw1 = ADTS
m_faacConfigurePtr->outputFormat = 1;
m_faacConfigurePtr->aacobjectType = MAIN;
m_faacConfigurePtr->allowMidside = 0;
m_faacConfigurePtr->useLfe = 0;
m_faacConfigurePtr->useTns = 1;

//设置配置
int nRet = faacEncSetConfiguration(m_hFaacEncHandle m_faacConfigurePtr);

m_bSampleBegin = TRUE;

while (1)
{
DWORD dwRet = WaitForSingleobject(m_hMainExitEvent 10);  
if(dwRet == WAIT_OB

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5615  2017-02-25 17:07  CameraAVEncodeExAudioSampleGrabber.cpp

     文件       2356  2017-02-25 17:16  CameraAVEncodeExAudioSampleGrabber.h

     文件   18936320  2014-05-06 10:08  CameraAVEncodeExinavcodec-55.dll

     文件   11179022  2016-05-05 12:55  CameraAVEncodeExinavcodec-56.dll

     文件     119310  2015-10-28 10:39  CameraAVEncodeExinavdevice-55.dll

     文件     147982  2016-05-05 12:54  CameraAVEncodeExinavdevice-56.dll

     文件     709646  2015-10-28 10:39  CameraAVEncodeExinavfilter-3.dll

     文件    2034688  2014-05-06 10:08  CameraAVEncodeExinavfilter-4.dll

     文件    1430542  2016-05-05 12:55  CameraAVEncodeExinavfilter-5.dll

     文件    5342720  2014-05-06 10:08  CameraAVEncodeExinavformat-55.dll

     文件    2149390  2016-05-05 12:55  CameraAVEncodeExinavformat-56.dll

     文件     418304  2014-05-06 10:08  CameraAVEncodeExinavutil-52.dll

     文件     517646  2016-05-05 12:56  CameraAVEncodeExinavutil-54.dll

     文件    2354688  2016-03-04 15:14  CameraAVEncodeExinCC_API.dll

     文件     163840  2015-12-21 11:46  CameraAVEncodeExinDEVICEIO.dll

     文件     594432  2017-02-25 17:22  CameraAVEncodeExinGetDeviceInfoD.exe

     文件      60318  2015-11-30 18:38  CameraAVEncodeExinlibasprintf-0.dll

     文件     284282  2016-03-02 20:46  CameraAVEncodeExinlibass-5.dll

     文件     144151  2015-09-02 14:24  CameraAVEncodeExinlibassuan-0.dll

     文件      38003  2016-02-09 19:03  CameraAVEncodeExinlibatomic-1.dll

     文件     298648  2015-10-05 17:14  CameraAVEncodeExinlibbluray-1.dll

     文件      76571  2016-02-29 15:50  CameraAVEncodeExinlibbz2-1.dll

     文件      61527  2015-07-08 13:44  CameraAVEncodeExinlibcaca++-0.dll

     文件     857150  2015-07-08 13:44  CameraAVEncodeExinlibcaca-0.dll

     文件    1080874  2015-10-30 14:38  CameraAVEncodeExinlibcairo-2.dll

     文件      34476  2015-10-30 14:38  CameraAVEncodeExinlibcairo-gobject-2.dll

     文件     171881  2015-10-30 14:38  CameraAVEncodeExinlibcairo-script-interpreter-2.dll

     文件      46202  2015-06-29 19:27  CameraAVEncodeExinlibcharset-1.dll

     文件     221899  2015-07-06 19:09  CameraAVEncodeExinlibcppunit-1-13-0.dll

     文件    1744718  2016-03-02 19:20  CameraAVEncodeExinlibeay32.dll

............此处省略592个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)