最近在开发一个视频系统, 涉及要保存为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;
}