![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
кодеки [D6, WinXP]
Senator © (2004-05-14 16:03:00)Кто подскажет, как узнать какими кодеками (видео, аудио) был сжат avi файл ??
Senator (2004-05-14 16:46:00) [1]ок, пасибо, ща почитаю
NailMan (2004-05-14 16:26:00) [2]Формат AVI(RIFF) лучше всего описан в SDK("AVI RIFF File Reference").
Вот выдержка(*.DOC) из этой части - разбирайся что к чему.
http://www.cyborghome.ru/nailman/zakroma/AVI_RIFF_Format.doc
В модуле MMSystem.Pas все структуры заголовков AVI есть.
---
WBR, NailMan aka 2:5020/3337.13
NailMan (2004-05-14 16:18:00) [3]Получаешь FCC видеопотока(проще всего вытащить его напрямую из заголовка ручками) и юзаешь такую функцию:
Function GetVideoCodec(FCC:DWORD):String;
label _exit;
var pSysDevEnum : ICreateDevEnum;
pEnumCat : IEnumMoniker;
pMoniker : IMoniker;
pPropBag : IPropertyBag;
cFetched : DWORD;
FCCStr : String;
OLEvar : OLEVariant;
n : string;
FCCH: TFOURCC;
begin
result:='Незарегистированный кодек';
move(FCC,FCCH,4);
FCCStr:=string(FCCH);
pSysDevEnum:=nil;
pEnumCat:=nil;
pPropBag:=nil;
pMoniker:=nil;
CoCreateInstance(CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC, IID_ICreateDevEnum,
pSysDevEnum);
if not assigned(pSysDevEnum) then exit;
pSysDevEnum.CreateClassEnumerator(CLSID_VideoCompressorCategory, pEnumCat, 0);
while pEnumCat.Next(1, pMoniker, @cFetched) = S_OK do
begin
pMoniker.BindToStorage(nil, nil, IID_IPropertyBag, pPropBag);
pPropBag.Read('FccHandler', OLEVar, nil);
N:=VarToStr(OLEVar);
If uppercase(n)=uppercase(FCCstr) then
begin
pPropBag.Read('FriendlyName', OLEvar, nil);
result:=VarToStr(OLEVar);
goto _exit;
end;
OLEVar:='';
pPropBag:=nil;
pMoniker:=nil;
end;
_exit:
pPropBag:=nil;
pMoniker:=nil;
pEnumCat:=nil;
pSysDevEnum:=nil;
end;
Точно также получаешь индентификатор кодека из заголовка AVI(ручками, ручками) и юзаешь эту функцию:
Function GetAudioCodec(AcmId:DWORD):String;
label _exit;
var pSysDevEnum : ICreateDevEnum;
pEnumCat : IEnumMoniker;
pMoniker : IMoniker;
pPropBag : IPropertyBag;
cFetched : DWORD;
OLEvar,
olevar2 : OLEVariant;
VM : TVariantManager;
NN : DWORD;
begin
result:='Неизвестный кодек';
pSysDevEnum:=nil;
pEnumCat:=nil;
pPropBag:=nil;
pMoniker:=nil;
GetVariantManager(VM);
CoCreateInstance(CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC, IID_ICreateDevEnum,
pSysDevEnum);
if not assigned(pSysDevEnum) then exit;
pSysDevEnum.CreateClassEnumerator(CLSID_AudioCompressorCategory, pEnumCat, 0);
while pEnumCat.Next(1, pMoniker, @cFetched) = S_OK do
begin
pMoniker.BindToStorage(nil, nil, IID_IPropertyBag, pPropBag);
pPropBag.Read('AcmId', OLEVar, nil);
if VarIsType(OLEVar,[varLongWord,varInteger]) then
Begin
NN:=VM.VarToInt(OLEVar);
If AcmId = NN then
begin
pPropBag.Read('FriendlyName', OLEvar2, nil);
result:=VarToStr(OLEVar2);
goto _exit;
end;
End;
pPropBag:=nil;
pMoniker:=nil;
end;
_exit:
pPropBag:=nil;
pMoniker:=nil;
pEnumCat:=nil;
pSysDevEnum:=nil;
end;
---
WBR, NailMan aka 2:5020/3337.13