visual-c++ - Visual C++ AVI编写器函数将位图( 640 x480 ) 推送到AVI文件?

  显示原文与译文双语对照的内容
0 0

我有一个视频采集卡,带有 Visual C++的SDK 。 ( 640 x 480 )的颜色帧可以通过从SDK调回来的30帧来提供给我。 在一个单独的线程--中,一个单独的线程( 每小时1 个文件),或者每小时大约 10 GB,这是我写的整个图像序列,这是不能管理的。 我希望将这些传入帧改为一个AVI文件,可以选择压缩。 我从哪里开始? 到目前为止,浏览 MSDN DirectShow文档已经让我。 这里有更好的例子? 我已经了解了一些例子,但我并不确定rtc是否将该卡识别为捕获设备。 另外,我已经把框架 ,我只需要把它们放到一些消费者线程中,而不备份我的生产者线程的AVI 。 感谢你的帮助。

时间: 原作者:

0 0

我以前使用过 CAviFile 。 它工作得非常好,我必须调整一下,以允许用户选择编解码器。 我从 CAviGenerator 那段代码。 CAviFile接口非常简单,下面是一些示例代码:


CAviFile *Avi = new CAviFile(fileName.c_str(), 0, 10);

HRESULT res = Avi->AppendNewFrame(Width, Height, ImageBuffer, BitsPerPixel);
if (FAILED(res))
{
 std::cout <<"Error recording AVI:" <<Avi->GetLastErrorMessage() <<std::endl;
}

delete Avi;

显然你必须确保ImageBuffer包含正确格式的数据,但一旦我得到了这种类型的东西,它就会有效。

原作者:
0 0

你需要在你的捕获卡上附加一个( CLSID_AviDest ) 复用器。 然后需要附加一个文件编写器( CLSID_FileWriter ),它将为你写出所有内容。

诚然,设置捕获图并不一定容易,因为DirectShow让你跳过了一百万个和一个。

使用ICaptureGraphBuilder2接口更容易。 幸好微软已经给出了一个非常好的总结。

http://msdn.microsoft.com/en-us/library/dd318627.aspx

添加编码器并不容易,而且方便地在该链接中进行注释。

下面是如何枚举我为我的一个MFC应用程序编写的系统中所有视频压缩器的示例。


BOOL LiveInputDlg::EnumerateVideoCompression()
{
 CComboBox* pVideoCompression = (CComboBox*)GetDlgItem( IDC_COMBO_VIDEOCOMPRESSION );
 pVideoCompression->SetExtendedUI( TRUE );

 pVideoCompression->SetCurSel( pVideoCompression->AddString( _T("<None>" ) ) );


 ICreateDevEnum* pDevEnum = NULL;
 IEnumMoniker* pEnum = NULL;

 HRESULT hr = S_OK;
 hr = CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pDevEnum );
 if ( FAILED( hr ) )
 {
 return FALSE;
 }

 hr = pDevEnum->CreateClassEnumerator( CLSID_VideoCompressorCategory, &pEnum, 0 );

 pDevEnum->Release();
 if ( FAILED( hr ) )
 {
 return FALSE;
 }

 if ( pEnum )
 {
 IMoniker* pMoniker = NULL;
 hr = pEnum->Next( 1, &pMoniker, NULL );
 while( hr == S_OK )
 {
 IPropertyBag* pPropertyBag = NULL;
 hr = pMoniker->BindToStorage( NULL, NULL, IID_IPropertyBag, (void**)&pPropertyBag );
 if ( FAILED( hr ) )
 {
 pMoniker->Release();
 pEnum->Release();
 return FALSE;
 }

 VARIANT varName;
 VariantInit( &varName );
 hr = pPropertyBag->Read( L"Description", &varName, NULL );
 if ( FAILED( hr ) )
 {
 hr = pPropertyBag->Read( L"FriendlyName", &varName, NULL );
 if ( FAILED( hr ) )
 {
 pPropertyBag->Release();
 pMoniker->Release();
 pEnum->Release();

 return FALSE;
 }
 }

 IBaseFilter* pBaseFilter = NULL;
 pMoniker->BindToObject( NULL, NULL, IID_IBaseFilter, (void**)&pBaseFilter );

 {
 USES_CONVERSION;
 TCHAR* pName = OLE2T( varName.bstrVal );
 int index = pVideoCompression->AddString( pName );
 pVideoCompression->SetItemDataPtr( index, pMoniker );

 VariantClear( &varName );
 pPropertyBag->Release();
 }

 hr = pEnum->Next( 1, &pMoniker, NULL );
 }

 pEnum->Release();
 }
 return TRUE;
}

祝你好运 !

原作者:
...