创建或替换实时流示例(c++)
HRESULT CreateOrReplaceLiveStream(IltmsServer* server, LPCTSTR路径,LPCTSTR视频设备,LPCTSTR音频设备)
{
HRESULT人力资源;
长streamcount;
长streamindex;
CComPtr < IltmsLiveStreams >流;
CComPtr < IltmsLiveStream >流;
CComPtr < IltmsLiveStreamDevConfig > devconfig;
hr = server->GetLiveStreams(&streams);
如果(失败(人力资源)
转到错误;
//搜索具有相同路径的现有流
hr = streams->get_Count(&streamcount);
如果(失败(人力资源)
转到错误;
为(streamindex = 0;Streamindex < streamcount;streamindex + +)
{
CComBSTR v;
hr = streams->GetLiveStream(streamindex, &stream);
如果(失败(人力资源)
转到错误;
hr = stream->get_Path(&v);
如果(失败(人力资源)
转到错误;
如果(CStringW(path).CompareNoCase(v) == 0)
打破;
stream = NULL;
}
如果(流)
{
//创建一个新的流
Streamindex = -1;
hr = streams-> createliestream (&stream);
如果(失败(人力资源)
转到错误;
}
//启用流
hr = stream->put_Enable(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
//启用硬件解码
hr = stream->put_QSVDecoding(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
hr = stream-> put_cudadcoding (VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
//设置activate-on-demand
hr = stream->put_ActivateOnDemand(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
//将激活-按需空闲超时设置为5分钟
hr = stream->put_IdleTimeOut(300000);
如果(失败(人力资源)
转到错误;
//设置流的路径
hr = stream->put_Path(CComBSTR(path));
如果(失败(人力资源)
转到错误;
//设置重新压缩。将其更改为VARIANT_TRUE以使用设备的内置压缩
hr = stream->put_UseDeviceEncoding(VARIANT_FALSE);
如果(失败(人力资源)
转到错误;
//选择视频设备
{
CComPtr < IltmsDevices >设备;
长Index = -1;
流- > get_VideoDevices(设备);
如果(videodevice)
{
查找(CComBSTR(videodevice), &index);
如果(失败(人力资源)
转到错误;
}
hr = devices->put_Selection(索引);
如果(失败(人力资源)
转到错误;
}
//选择音频设备
{
CComPtr < IltmsDevices >设备;
长Index = -1;
流- > get_AudioDevices(设备);
如果(audiodevice)
{
查找(CComBSTR(audiodevice), &index);
如果(失败(人力资源)
转到错误;
}
#如果1
hr = devices->put_Selection(索引);
如果(失败(人力资源)
转到错误;
#其他的
//选择方法
如果(索引>= 0)
{
CComPtr < IltmsDevice >设备;
hr = devices->Item(index, &device);
如果(失败(人力资源)
转到错误;
hr = device->put_Selected(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
}
其他的
{
hr = devices->put_Selection(-1);
如果(失败(人力资源)
转到错误;
}
# endif
}
//锁定设备,以便编辑其属性
hr = stream->get_DeviceConfig(&devconfig);
如果(失败(人力资源)
转到错误;
hr = devconfig->LockDevices();
如果(失败(人力资源)
转到错误;
//显示主视频设备属性页,如果有的话
//查看ltms.h ltmsLiveStreamDlg枚举获取更多属性页选项
{
VARIANT_BOOL v;
hr = devconfig->HasDialog(ltmsLiveStreamDlg_VideoDevice, &v);
如果(失败(人力资源)
转到错误;
如果(v != VARIANT_FALSE)
{
hr = devconfig->ShowDialog(ltmsLiveStreamDlg_VideoDevice, NULL);
如果(失败(人力资源)
转到错误;
}
}
//显示主音频设备属性页,如果有的话
//查看ltms.h ltmsLiveStreamDlg枚举获取更多属性页选项
{
VARIANT_BOOL v;
hr = devconfig->HasDialog(ltmsLiveStreamDlg_AudioDevice, &v);
如果(失败(人力资源)
转到错误;
如果(v != VARIANT_FALSE)
{
hr = devconfig->ShowDialog(ltmsLiveStreamDlg_AudioDevice, NULL);
如果(失败(人力资源)
转到错误;
}
}
//设置输出视频
{
VARIANT_BOOL v;
hr = devconfig->get_IsVideoEncoded(&v);
如果(失败(人力资源)
转到错误;
//视频已经编码,视频输出设置被忽略
如果(v != VARIANT_FALSE)
{
hr = stream->put_UseVideoInputSize(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
//如果UseVideoInputSize为VARIANT_TRUE,则忽略宽度和高度
hr = stream->put_VideoWidth(320);
如果(失败(人力资源)
转到错误;
hr = stream->put_VideoHeight(240);
如果(失败(人力资源)
转到错误;
hr = stream->put_UseVideoInputFrameRate(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
//如果UseVideoInputFrameRate为VARIANT_TRUE,则忽略帧速率
hr = stream->put_VideoFrameRate(29.97);
如果(失败(人力资源)
转到错误;
hr = stream->put_VideoBitRate(700000);
如果(失败(人力资源)
转到错误;
hr = stream->put_QSVAcceleration(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
hr = stream->put_CUDAAcceleration(VARIANT_TRUE);
如果(失败(人力资源)
转到错误;
}
}
//设置输出音频
{
VARIANT_BOOL v;
hr = devconfig->get_IsAudioEncoded(&v);
如果(失败(人力资源)
转到错误;
//音频已经编码,音频输出设置被忽略
如果(v != VARIANT_FALSE)
{
长计数;
CComPtr < IltmsAudioTypes > audiotypes;
hr = stream->get_AudioTypes(&audiotypes);
如果(失败(人力资源)
转到错误;
hr = audiotypes->get_Count(&count);
如果(失败(人力资源)
转到错误;
为(长索引= 0;Index < count;指数+ +)
{
CComPtr < IltmsAudioType > audiotype;
长渠道;
长比特率;
长samplerate;
hr = audiotypes->项目(索引,&audiotype);
如果(失败(人力资源)
转到错误;
hr = audiotype->get_Channels(&channels);
如果(失败(人力资源)
转到错误;
hr = audiotype->get_BitRate(&bitrate);
如果(失败(人力资源)
转到错误;
hr = audiotype->get_SampleRate(&samplerate);
如果(失败(人力资源)
转到错误;
如果(通道== 2 &&比特率== 192000 &&采样率== 44100)
{
#如果1
audiotype - > put_Selected (VARIANT_TRUE);
#其他的
//选择方法
audiotypes - > put_Selection(指数);
# endif
打破;
}
}
}
}
//设置输出片段大小
hr = stream->put_MinimumFragmentDuration(2.0);
如果(失败(人力资源)
转到错误;
//添加或替换流
如果(streamindex < 0)
hr = streams->AddLiveStream(流);
其他的
hr = streams->SetLiveStream(streamindex, stream);
如果(失败(人力资源)
转到错误;
hr = server->SetLiveStreams(流);
如果(失败(人力资源)
转到错误;
错误:
如果(devconfig)
devconfig - > UnlockDevices ();
返回人力资源;
}