下面的代码可以用来创建一个文件有两个互斥的音频流:
型型;
装运箱帧;
HRESULT人力资源;
USES_CONVERSION;
如果(m_pConvert = = NULL)
返回;
/ /创建配置文件管理器对象:
hr = CoCreateInstance (CLSID_ltmmWMProfileManager, NULL, CLSCTX_INPROC_SERVER IID_IltmmWMProfileManager (无效* *)&m_pProfMan);
/ /创建一个空的简介:
hr = m_pProfMan - > CreateEmptyProfile (ltmmWMT_VER_7_0 &m_pProf);
/ /设置配置文件名称和描述
hr = m_pProf - > put_Name (L“互斥Stream_test”);
hr = m_pProf - > put_Description (L“示例代码”);
/ /添加2音频流不同的比特率
hr = AddAudioStream (CODEC_AUDIO_MSAUDIO下,概要文件,1日,8000年,8000年,1,假);
hr = AddAudioStream (CODEC_AUDIO_MSAUDIO下,概要文件,2日,16000年,16000年,1,假);
/ /使它们相互排斥
hr = AddMutexObject(资料,1、2);
/ /配置文件添加到转换对象
hr = m_pConvert - > put_WMProfile (m_pProf);
m_pProf - >释放();
m_pProfMan - >释放();
/ /设置目标格式
hr = m_pConvert - > put_TargetFormat (ltmmConvert_TargetFormat_Asf_Compressor_Mux);
/ /设置源文件名称;源文件包含多个音频流:
hr = m_pConvert - > put_SourceFile (L“London.avi”);
/ /设置输出文件名称:
hr = m_pConvert - > put_TargetFile (“London.asf”);
/ /转换
hr = m_pConvert - > StartConvert ();
HRESULT AddVideoStream (IltmmWMProfileManager *下,
IltmmWMProfile *概要文件,
使用UINT nStreamNum,
DWORD dwFourCC,
ULONG nBitRate,
ULONG nWidth,
ULONG nHeight,
ULONG国家中心,
ULONG nQuality,
ULONG nSecPerKey)
{
长cCodecs;
IltmmWMStreamConfig *流=零;
IltmmMediaTypeDisp * pmt =零;
VIDEOINFOHEADER * pVIH =零;
varFormat变体;
VariantInit (&varFormat);
/ /得到MEDIATYPE_Video编解码器
型型=:SysAllocString (ltmmMEDIATYPE_Video);
HRESULT hr =经理- > GetCodecInfoCount (&cCodecs型);
::SysFreeString(型);
/ /搜索匹配的编解码器
为(长我= 0;!我流& & < cCodecs;我+ +)
{
长cFormats;
/ /得到MEDIATYPE_Video数编码格式
型型=:SysAllocString (ltmmMEDIATYPE_Video);
HRESULT hr =经理- > GetCodecFormatCount(型,我,&cFormats);
::SysFreeString(型);
为(长j = 0;j < cFormats;j + +)
{
/ /得到MEDIATYPE_Video流配置界面
型=:SysAllocString (ltmmMEDIATYPE_Video);
hr =经理- > GetCodecFormat(流型,i, j);
::SysFreeString(型);
如果(成功(人力资源)
{
/ /得到这种格式的媒体类型
人力资源- > =流GetMediaType (pmt);
如果(成功(人力资源)
{
hr = pmt - > get_FormatType(型);
如果(成功(人力资源)
{
/ /只检查FORMAT_VideoInfo格式
如果(!wcsicmp(型、ltmmFORMAT_VideoInfo))
{
&varFormat pmt - > GetFormatData(1日);
SafeArrayAccessData (V_ARRAY (&varFormat), (无效* *)&pVIH);
如果(pVIH - > bmiHeader。biCompression = = dwFourCC)
{
::SysFreeString(型);
打破;
}
SafeArrayUnaccessData (V_ARRAY (&varFormat));
VariantClear (&varFormat);
}
::SysFreeString(型);
}
pmt - >释放();
pmt =零;
}
流- >释放();
流=零;
}
}
}
/ /返回一个错误,如果我们不找到一个好的候选人
如果(流)
返回E_FAIL;
pVIH - > dwBitRate = nBitRate;
pVIH - > rcSource。正确的= nWidth;
pVIH - > rcSource。底= nHeight;
pVIH - > rcTarget。正确的= nWidth;
pVIH - > rcTarget。底= nHeight;
pVIH - > bmiHeader。biWidth = nWidth;
pVIH - > bmiHeader。biHeight = nHeight;
pVIH - > AvgTimePerFrame =((龙龙)10000000)/((龙龙)国家中心);
varFormat pmt - > SetFormatData(1日);
人力资源- > =流put_Quality (nQuality);
hr =流- > put_MaxKeyFrameSpacing ((双)nSecPerKey);
流- > put_StreamNumber (nStreamNum);
型=::SysAllocString (L“视频”);
流- > put_StreamName(型);
::SysFreeString(型);
型=::SysAllocString (L“视频”);
流- > put_ConnectionName(型);
::SysFreeString(型);
流- > put_Bitrate (nBitRate);
流- > SetMediaType (pmt);
配置文件- > AddStream(流);
流- >释放();
pmt - >释放();
SafeArrayUnaccessData (V_ARRAY (&varFormat));
VariantClear (&varFormat);
返回S_OK;
}
HRESULT AddAudioStream (IltmmWMProfileManager *下,
IltmmWMProfile *概要文件,
使用UINT nStreamNum,
使用UINT nFormatTag,
ULONG nBitRate,
ULONG nSamplesPerSec,
使用UINT nChannels,
BOOL bVideo)
{
长cCodecs;
varSave变体;
VariantInit (&varSave);
/ /得到MEDIATYPE_Audio编解码器
型型=:SysAllocString (ltmmMEDIATYPE_Audio);
HRESULT hr =经理- > GetCodecInfoCount (&cCodecs型);
::SysFreeString(型);
/ /搜索匹配的编解码器
为(长我= 0;我< cCodecs;我+ +)
{
长cFormats;
/ /得到MEDIATYPE_Audio数编码格式
型型=:SysAllocString (ltmmMEDIATYPE_Audio);
HRESULT hr =经理- > GetCodecFormatCount(型,我,&cFormats);
::SysFreeString(型);
为(长j = 0;j < cFormats;j + +)
{
/ /得到MEDIATYPE_Audio流配置界面
IltmmWMStreamConfig *格式;
型=:SysAllocString (ltmmMEDIATYPE_Audio);
hr =经理- > GetCodecFormat(型,我,j,格式);
::SysFreeString(型);
如果(成功(人力资源)
{
/ /得到这种格式的媒体类型
IltmmMediaTypeDisp * pmt;
hr =格式- > GetMediaType (pmt);
如果(成功(人力资源)
{
hr = pmt - > get_FormatType(型);
如果(成功(人力资源)
{
/ /只检查FORMAT_WaveFormatEx格式
如果(!wcsicmp(型、ltmmFORMAT_WaveFormatEx))
{
变量var;
VariantInit (var);
pmt - > get_Format (var);
WAVEFORMATEX * pWfx;
SafeArrayAccessData (V_ARRAY (var), (无效* *)&pWfx);
/ /这个格式看起来是一个不错的候选人
长nDiff = (长)(pWfx - > nAvgBytesPerSec * 8 - nBitRate);
如果(nDiff < 250 & &
nDiff > -250 & &
pWfx - > nSamplesPerSec = = nSamplesPerSec & &
pWfx - > nChannels = = nChannels & &
pWfx - > wFormatTag = = nFormatTag)
{
如果(V_VT (&varSave) ! = VT_EMPTY)
{
WAVEFORMATEX * pSaveWFX;
SafeArrayAccessData (V_ARRAY (&varSave), (无效* *)&pSaveWFX);
如果(bVideo)
{
/ /
/ /音频/视频配置,我们想
/ /找到nBlockAlign越小。在这种情况下,
/ / nBlockAlign比较大,所以我们想
/ /使用旧格式。
/ /
如果(pWfx - > nBlockAlign < = pSaveWFX - > nBlockAlign)
{
SafeArrayUnaccessData (V_ARRAY (&varSave));
VariantClear (&varSave);
VariantCopy (&varSave var);
}
}
其他的
{
/ /否则,我们想要更大的nBlockAlign
如果(pWfx - > nBlockAlign > = pSaveWFX - > nBlockAlign)
{
SafeArrayUnaccessData (V_ARRAY (&varSave));
VariantClear (&varSave);
VariantCopy (&varSave var);
}
}
}
其他的
{
VariantClear (&varSave);
VariantCopy (&varSave var);
}
}
SafeArrayUnaccessData (V_ARRAY (var));
VariantClear (var);
}
::SysFreeString(型);
}
pmt - >释放();
}
格式- >释放();
}
}
}
/ /返回一个错误,如果我们不找到一个好的候选人
如果(V_VT (&varSave) = = VT_EMPTY)
返回E_FAIL;
WAVEFORMATEX * pSaveWFX;
SafeArrayAccessData (V_ARRAY (&varSave), (无效* *)&pSaveWFX);
IltmmMediaTypeDisp * pmt;
hr = CoCreateInstance (CLSID_ltmmMediaType, NULL, CLSCTX_INPROC_SERVER IID_IltmmMediaTypeDisp (无效* *)pmt);
/ /设置新流的媒体类型
型=:SysAllocString (ltmmMEDIATYPE_Audio);
pmt - > put_Type(型);
::SysFreeString(型);
装运箱;
s.Format (_T (“{% .8x - 0000 - 0010 - 8000 - 00 - aa00389b71}”),(单位)pSaveWFX - > wFormatTag);
= s.AllocSysString型();
pmt - > put_Subtype(型);
::SysFreeString(型);
pmt - > put_FixedSizeSamples (VARIANT_TRUE);
pmt - > put_TemporalCompression (VARIANT_FALSE);
pmt - > put_SampleSize (pSaveWFX - > nBlockAlign);
型=:SysAllocString (ltmmFORMAT_WaveFormatEx);
pmt - > put_FormatType(型);
::SysFreeString(型);
pmt - > SetFormatData (1 l, varSave);
IltmmWMStreamConfig *流;
型=:SysAllocString (ltmmMEDIATYPE_Audio);
hr =概要文件- > CreateNewStream(流型);
::SysFreeString(型);
流- > put_StreamNumber (nStreamNum);
型=::SysAllocString (L“音频流”);
流- > put_StreamName(型);
::SysFreeString(型);
型=::SysAllocString (L“音频”);
流- > put_ConnectionName(型);
::SysFreeString(型);
流- > put_Bitrate (pSaveWFX - > nAvgBytesPerSec * 8);
人力资源- > =流SetMediaType (pmt);
hr =概要文件- > AddStream(流);
流- >释放();
pmt - >释放();
SafeArrayUnaccessData (V_ARRAY (&varSave));
VariantClear (&varSave);
返回S_OK;
}
使用UINT nBaseStream HRESULT AddMutexObject (IltmmWMProfile *配置文件,使用UINT nStreamCount)
{
IltmmWMMutualExclusion * excl =零;
/ /创建一个排斥对象
HRESULT hr =概要文件- > CreateNewMutualExclusion (&excl);
/ /标记的所有流相互排斥
为(使用UINT i = 0;我< nStreamCount;我+ +)
{
hr = excl - > AddStream (nBaseStream + i);
}
/ /表明流不同的比特率
/ /看到CLSID_WMMUTEX_Bitrate WMSDK
型型=::SysAllocString (L“{d6e22a01 - 35 - da - 11 - d1 - 9034 - 00 - a0c90349be}”);
hr = excl - > put_Type(型);
::SysFreeString(型);
/ /分配排除对象配置文件
hr =概要文件- > AddMutualExclusion (excl);
excl - >释放();
返回人力资源;
}
帮助收藏
光栅net|C API|c++类库|HTML5 JavaScript
文档net|C API|c++类库|HTML5 JavaScript
医疗net|C API|c++类库|HTML5 JavaScript
医疗Web查看器net
188宝金博怎么下载
支持的平台上
net, Java, Android和iOS / macOS组件
C / c++类库的API
HTML5 JavaScript库
你的邮件已经发送到支持!有人应该联系!如果你的问题是紧急请回到聊天。
聊天时间:
周一——周五,上午6点等
谢谢你的反馈!
请填写表单重新开始一个新的聊天。
所有代理目前离线。
聊天时间:
周一-周五
早上8:30 - 6点
联系我们请填写这张表格,我们将通过电子邮件联系你。