Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

кодеки [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо