欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
关于生成DIVX/MP3编码的ASF格式文件
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 

最近在开发一个视频系统, 涉及要保存为asf格式的文件, 写出以下代码


HRESULT CStreamWriter::CreateStreamMP3(WORD nStreamNum,
          int nSamplesPerSec,
          int nBitRate)
{
 
 const GUID WMMEDIATYPE_SubType_MP3 = WMMEDIASUBTYPE_MP3;
 const DWORD  dwBufferWindow   = 1000; // default=100ms  -1 = unknown
 WCHAR *   wcStreamName     = L"MP3 Stream";
 WCHAR *   wcConnectionName = L"MP3 Connection";


 IWMStreamConfig  *pStreamConfig;
 IWMMediaProps  *pMediaProps;
 WM_MEDIA_TYPE  mt;
 
 WAVEFORMATEX *wavx;

 HRESULT    hr;
 

 hr = m_pProfile->CreateNewStream(WMMEDIATYPE_Audio, &pStreamConfig);

 hr = pStreamConfig->SetStreamNumber(nStreamNum);
 hr = pStreamConfig->SetStreamName(wcStreamName);
 hr = pStreamConfig->SetConnectionName(wcConnectionName);
 hr = pStreamConfig->SetBufferWindow(dwBufferWindow);
 hr = pStreamConfig->SetBitrate(nBitRate); 

 
 // Programmatically set the audio codec and attributes to "MPEG Layer-3, 11kHz, 16kBits/sec, mono".
   // The values for this audio codec and attributes were determined by investigating the audio codec
   wavx = (LPWAVEFORMATEX) new BYTE[sizeof(WAVEFORMATEX) + 12];
   wavx->wFormatTag  = 85;
   wavx->nChannels  = 1;
   wavx->nSamplesPerSec = nSamplesPerSec;
  //  average bytes/sec the MP3 audio codec claims for "16kHz, 16kBits/sec, mono"
   wavx->nAvgBytesPerSec = nBitRate / 8;
   wavx->nBlockAlign = 1;
   wavx->wBitsPerSample = 0;
   // The Windows MPEG Layer-3 audio codec has 12 bytes of extra data.
   // In a Win32 WAVEFORMATEX structure, this data is appended after the cbSize field.
   wavx->cbSize = 12;
   // MPEG Layer-3 audio codec extra data (in hexidecimal) for "11kHz, 16kBits/sec, mono"
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 0]  = 0x01;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 1]  = 0x00;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 2]  = 0x02;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 3]  = 0x00;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 4]  = 0x00;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 5]  = 0x00;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 6]  = 0x68;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 7]  = 0x00;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 8]  = 0x01;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 9]  = 0x00;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 10] = 0x71;
   ((BYTE *)wavx)[sizeof(WAVEFORMATEX)+ 11] = 0x05;

 
 ZeroMemory(&mt, sizeof(mt));
 mt.majortype      = WMMEDIATYPE_Audio;
 mt.subtype       = WMMEDIATYPE_SubType_MP3;
 mt.bFixedSizeSamples    = TRUE;
 mt.bTemporalCompression    = FALSE;
 mt.lSampleSize      = 1;
 mt.formattype      = WMFORMAT_WaveFormatEx;
 mt.pUnk        = NULL;
 mt.cbFormat       = sizeof(WAVEFORMATEX) + 12;
 mt.pbFormat       = (BYTE*)wavx;

 
 
 hr = pStreamConfig->QueryInterface( IID_IWMMediaProps, (void**)&pMediaProps ); 
 hr = pMediaProps->SetMediaType( &mt );

 hr = m_pProfile->AddStream(pStreamConfig);

 delete []wavx;

 pStreamConfig->Release();
 pMediaProps->Release();

 return hr;

}

HRESULT CStreamWriter::CreateStreamDIVX(WORD nStreamNum,
          int nWidth,
          int nHeight,
          int nBitRate,
          int nFramePerSecond,
          int nBitColor)
{
 const GUID WMMEDIATYPE_SubType_DivX =
  {0x58564944, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71};
 const DWORD  dwHandler   = MAKEFOURCC('D','I','V','X');
 const DWORD  dwBufferWindow   = 3000; // default=3000ms  -1 = unknown
 WCHAR *   wcStreamName     = L"DIVX Stream";
 WCHAR *   wcConnectionName = L"DIVX Connection";


 IWMStreamConfig  *pStreamConfig;
 IWMMediaProps  *pMediaProps;
 WM_MEDIA_TYPE  mt;
 WMVIDEOINFOHEADER videoInfo;
 HRESULT    hr;
 

 hr = m_pProfile->CreateNewStream(WMMEDIATYPE_Video, &pStreamConfig);

 hr = pStreamConfig->SetStreamNumber(nStreamNum);
 hr = pStreamConfig->SetStreamName(wcStreamName);
 hr = pStreamConfig->SetConnectionName(wcConnectionName);
 hr = pStreamConfig->SetBufferWindow(dwBufferWindow);
 hr = pStreamConfig->SetBitrate(nBitRate);
 

 ZeroMemory(&videoInfo, sizeof(videoInfo));
 videoInfo.bmiHeader.biSize   = sizeof(BITMAPINFOHEADER);
 videoInfo.bmiHeader.biCompression = dwHandler;
 videoInfo.bmiHeader.biBitCount  = nBitColor;
 videoInfo.bmiHeader.biWidth   = nWidth;
 videoInfo.bmiHeader.biHeight  = nHeight;
 videoInfo.bmiHeader.biPlanes  = 1;
 videoInfo.bmiHeader.biSizeImage  = 0;
 videoInfo.bmiHeader.biClrImportant = 0;
 
 videoInfo.rcSource.left    = 0;
 videoInfo.rcSource.top    = 0;
 videoInfo.rcSource.right   = videoInfo.bmiHeader.biWidth;
 videoInfo.rcSource.bottom   = videoInfo.bmiHeader.biHeight;
 videoInfo.rcTarget     = videoInfo.rcSource;
 
 videoInfo.dwBitRate     = nBitRate;
 videoInfo.dwBitErrorRate   = 0;
 videoInfo.AvgTimePerFrame   = 10000000 / nFramePerSecond;
 
 ZeroMemory(&mt, sizeof(mt));
 mt.majortype      = WMMEDIATYPE_Video;
 mt.subtype       = WMMEDIATYPE_SubType_DivX;
 mt.bFixedSizeSamples    = FALSE;
 mt.bTemporalCompression    = TRUE;
 mt.lSampleSize      = 0;
 mt.formattype      = WMFORMAT_VideoInfo;
 mt.pUnk        = NULL;
 mt.cbFormat       = sizeof(WMVIDEOINFOHEADER);
 mt.pbFormat       = (BYTE*)&videoInfo;

 
 
 hr = pStreamConfig->QueryInterface( IID_IWMMediaProps, (void**)&pMediaProps ); 
 hr = pMediaProps->SetMediaType( &mt );

 hr = m_pProfile->AddStream(pStreamConfig);

 pStreamConfig->Release();
 pMediaProps->Release();

 return hr;
}


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步