Как получить AVICOMPRESSOPTIONS без диалога AVISaveOptions?
Я пытаюсь программно сгенерировать файл AVI из растровых изображений, используя пример, который я нашел где-то в Интернете (не могу вспомнить точный источник).
Вот мой код, чтобы получить варианты
unsafe private void SetOptions() {
AVICOMPRESSOPTIONS opts = new AVICOMPRESSOPTIONS();
opts.fccType = 0; //fccType_;
opts.fccHandler = 541215044;//0;//fccHandler_;
opts.dwKeyFrameEvery = 0;
opts.dwQuality = 0; // 0 .. 10000
opts.dwFlags = 8;//0; // AVICOMRPESSF_KEYFRAMES = 4
opts.dwBytesPerSecond = 0;
opts.lpFormat = (System.IntPtr)0; //new IntPtr(0);
opts.cbFormat = 0;
opts.lpParms = (System.IntPtr)0; //new IntPtr(0);
opts.cbParms = 3232;//0;
opts.dwInterleaveEvery = 0;
AVICOMPRESSOPTIONS* p = &opts;
AVICOMPRESSOPTIONS** pp = &p;
IntPtr x = ps_;
IntPtr* ptr_ps = &x;
AVISaveOptions(0,0,1,ptr_ps,pp);
// TODO: AVISaveOptionsFree(...)
int hr = AVIMakeCompressedStream(out psCompressed_, ps_, ref opts, 0);
if (hr != 0) {
throw new AviException("AVIMakeCompressedStream");
}
BITMAPINFOHEADER bi = new BITMAPINFOHEADER();
bi.biSize = 40;
bi.biWidth = (Int32) width_;
bi.biHeight = (Int32) height_;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = 0; // 0 = BI_RGB
bi.biSizeImage = stride_*height_;
bi.biXPelsPerMeter= 0;
bi.biYPelsPerMeter= 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
hr = AVIStreamSetFormat(psCompressed_, 0, ref bi, 40);
if (hr != 0) {
throw new AviException("AVIStreamSetFormat",hr);
}
}
Однако я не хочу отображать диалог AVISaveOptions и хотел бы, чтобы все это делалось в бэкэнде, я искал несколько часов, но до сих пор не нашел ничего очень полезного, за исключением этого: https://groups.google. ком / форум /#! тема /microsoft.public.win32.programmer.mmedia/jH0d3H2orOo
Итак, мой вопрос: как бы я поступил так без отображения диалогового окна и / или как я заполнил бы параметры сжатия программно?
1 ответ
Завелось получить список всех установленных кодеков через реестр, а затем создать FourCC и использовать его для установки fccType и fccHandler.