问题描述
我有一个应用程序,它可以从配置的摄像头流式传输视频。还有可选的配置属性来指定精确的分辨率。为了不破坏应用程序,我首先检查是否支持分辨率。我就是这样做的
public static List<CameraInfo> GetAllAvailableResolution(DsDevice vidDev)
{
try
{
int bitCount = 0;
var AvailableResolutions = new List<CameraInfo>();
VideoInfoHeader v;
var m_Filtergraph2 = new Filtergraph() as IFiltergraph2;
int hr = m_Filtergraph2.AddSourceFilterForMoniker(vidDev.Mon,null,vidDev.Name,out IBaseFilter sourceFilter);
var pRaw2 = DsFindPin.ByCategory(sourceFilter,PinCategory.Capture,0);
IAMStreamConfig videoStreamConfig = pRaw2 as IAMStreamConfig;
videoStreamConfig.GetNumberOfCapabilities(out int iCount,out int iSize);
IntPtr TaskMemPointer = Marshal.AllocCoTaskMem(iSize);
for (int iFormat = 0; iFormat < iCount; iFormat++)
{
IntPtr ptr = IntPtr.Zero;
videoStreamConfig.GetStreamCaps(iFormat,out AMMediaType pmtConfig,TaskMemPointer);
v = (VideoInfoHeader)Marshal.PtrToStructure(pmtConfig.formatPtr,typeof(VideoInfoHeader));
if (v.BmiHeader.Size != 0 && v.BmiHeader.BitCount != 0)
{
if (v.BmiHeader.BitCount > bitCount)
{
AvailableResolutions.Clear();
bitCount = v.BmiHeader.BitCount;
}
var cameraInfo = new CameraInfo()
{
FrameRate = 10000000.0 / v.AvgTimePerFrame,Resolution = $"{v.BmiHeader.Width}x{v.BmiHeader.Height}"
};
AvailableResolutions.Add(cameraInfo);
}
DsUtils.FreeAMMediaType(pmtConfig);
}
Marshal.FreeCoTaskMem(TaskMemPointer);
m_Filtergraph2.disconnect(pRaw2);
m_Filtergraph2.Abort();
return AvailableResolutions;
}
catch (Exception)
{
return new List<CameraInfo>();
}
}
问题在于,对于某些相机,它似乎让它保持忙碌或打开状态,或者其他任何东西,我都无法从中进行流式传输。我发现 m_Filtergraph2
是实际问题。尝试了一切来“处理”它,但没有生效。对于我有问题的相机,如果我删除对此方法的调用并直接设置分辨率,一切都很好。如果重要的话,我将 ffmpeg libav 用于实际的视频流。如何处置/彻底关闭?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)