Хорошо, я занимаюсь этим 2 дня и нуждаюсь в помощи с этой последней частью.
У меня есть камера Microsoft LifeCam Cinema, и я использую .NET DirectShowLib для захвата видеопотока. Ну, на самом деле я использую WPFMediaKit, но сейчас я в исходном коде, который напрямую связан с прямой библиотекой.
У меня есть работа: - Просмотр видеовыхода камеры - Запись видеовыхода камеры в ASF или AVI (только 2 MediaType поддерживается с помощью ICaptureGraphBuilder2)
Проблема заключается в следующем: я могу сохранить его как .avi. Это работает отлично и с разрешением 1280x720, но сохраняет файл в RAW-выходе. Это примерно 50-60 МБ в секунду. Слишком высокий уровень.
Или я могу переключить его на .asf, и он выводит WMV, но когда я делаю это, захват и вывод оба идут на разрешение 320x240.
В WPFMediaKit есть функция, которую я изменил, потому что, по-видимому, с камерами Microsoft LifeCam Cinema у многих людей есть эта проблема. Поэтому вместо того, чтобы создавать или изменять AMMediaType, вы перебираете и затем используете это для вызова SetFormat.
///* Make the VIDEOINFOHEADER 'readable' */
var videoInfo = new VideoInfoHeader();
int iCount = 0, iSize = 0;
videoStreamConfig.GetNumberOfCapabilities(out iCount, out iSize);
IntPtr TaskMemPointer = Marshal.AllocCoTaskMem(iSize);
AMMediaType pmtConfig = null;
for (int iFormat = 0; iFormat < iCount; iFormat++)
{
IntPtr ptr = IntPtr.Zero;
videoStreamConfig.GetStreamCaps(iFormat, out pmtConfig, TaskMemPointer);
videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(pmtConfig.formatPtr, typeof(VideoInfoHeader));
if (videoInfo.BmiHeader.Width == DesiredWidth && videoInfo.BmiHeader.Height == DesiredHeight)
{
///* Setup the VIDEOINFOHEADER with the parameters we want */
videoInfo.AvgTimePerFrame = DSHOW_ONE_SECOND_UNIT / FPS;
if (mediaSubType != Guid.Empty)
{
int fourCC = 0;
byte[] b = mediaSubType.ToByteArray();
fourCC = b[0];
fourCC |= b[1] << 8;
fourCC |= b[2] << 16;
fourCC |= b[3] << 24;
videoInfo.BmiHeader.Compression = fourCC;
// pmtConfig.subType = mediaSubType;
}
/* Copy the data back to unmanaged memory */
Marshal.StructureToPtr(videoInfo, pmtConfig.formatPtr, true);
hr = videoStreamConfig.SetFormat(pmtConfig);
break;
}
}
/* Free memory */
Marshal.FreeCoTaskMem(TaskMemPointer);
DsUtils.FreeAMMediaType(pmtConfig);
if (hr < 0)
return false;
return true;
Когда это было реализовано, я мог наконец просмотреть захваченное видео как 1280x720, пока я установил SetOutputFilename в MediaType.Avi.
Если я устанавливаю его в MediaType.Asf, он переходит к 320x240, и вывод одинаков.
Или AVI работает и выводится в правильном формате, но делает это в RAW-видео, следовательно, очень большой размер файла. Я попытался добавить компрессор к графику, но не повезло, это далеко от моего опыта.
Я ищу 1 из 2 ответов.
- Запись ASF при 1280x720
- Добавление компрессора к графику, чтобы размер файла моего AVI файла был небольшим.