![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
-= .AVI видео и информация о нем =- [D5, D6, D7, Win95/98, WinME, Win2k]
_DemiK © (2005-01-16 03:59:00)В видео файлах есть что-то типо тегов где имеется инфа о артисте и т.д. Как их от туда всех извлечь, как, к примеру, теги из МР3?
Спасибо!
NailMan (2005-07-25 11:34:00) [1]описания типов и констант:
type
FCC_Type = array[0..3] of char;
Const
FCC_RIFF : FCC_Type = 'RIFF';
FCC_hdrl : FCC_Type = 'hdrl';
FCC_AVI : FCC_Type = 'AVI ';
FCC_avih : FCC_Type = 'avih';
FCC_strl : FCC_Type = 'strl';
FCC_strh : FCC_Type = 'strh';
FCC_strf : FCC_Type = 'strf';
FCC_strd : FCC_Type = 'strd';
FCC_strn : FCC_Type = 'strn';
FCC_MOVI : FCC_Type = 'movi';
FCC_LIST : FCC_Type = 'LIST';
FCC_JUNK : FCC_Type = 'JUNK';
FCC_indx : FCC_Type = 'indx';
FCC_vids : FCC_Type = 'vids';
FCC_MPEG : FCC_Type = chr($0)+ chr($0) + chr($01)+ chr($BA);
TYPE
TFOURCC = array[0..3] of char;
TVidsFormat = record
BMfmt : TBITMAPINFOHEADER;
DVFmt : TDVINFO;
end;
TVideoStream = record
st : TAVIStreamHeader;
FMT : TVidsFormat;
end;
TAudioStream = record
st : TAVIStreamHeader;
WAVFmt : TWaveFormatEx;
end;
TAviInfo = record
AVIHeader : TAVIMainHeader;
audstreams : DWORD;
vids : TvideoStream;
auds : Array[0..4] of TAudioStream;
CRC : Int64;
end;
Function ConvertFCCToDWORD(fcc:FCC_Type):dword;
begin
move(fcc,result,4);
end;
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
NailMan (2005-07-25 11:32:00) [2][8] NailMan © (25.07.05 11:26)
нашел в закромах родины своего плеера. Вырезано из контекста, комментарии излишни. Часто встречаются лишние операцииmove(PD^,FCC,4);- это для отладки - видно где я стою в файле если заголовок нестандартный(помогает написать распознавание левой секции и ее обработать в дальнейшем).
Function ReadAVIHeader(Const FName:String;Var Avi:TAviInfo):Cardinal;
var f:Integer;
p,PD:pointer;
NulDD,i,leng:Cardinal;
audstreams:dword;
FCC,FCC2 : Array[0..3] of char;
MH : ^TAVIMainHeader;
SH : ^TAVIStreamHeader;
VFH : ^TVidsFormat;
WVH : ^TWaveFormatEx;
begin
Result:=1; //По умолчанию - AVIVideo
Zeromemory(@AVi,sizeof(TAviInfo));
if FileAutoDetection then avi.CRC:=getfilecrc(fname);
F:=Fileopen(fname,fmopenread or fmsharedenynone);
fileread(f,fcc,4); //RIFF
fileread(f,nuldd,4);
fileread(f,fcc2,4); //AVI_
if (fcc=fcc_riff) and (fcc2<>FCC_AVI) then
begin
result:=0;
Fileclose(F);
exit;
end;
if (fcc<>fcc_riff) then
begin
If FCC=FCC_mpeg then result:=2
else
result:=0;
Fileclose(F);
exit;
end;
Fileread(f,fcc,4); //LIST
fileread(f,nuldd,4);
getmem(p,nuldd+1024);
fileread(f,p^,nuldd);
fileclose(f);
PD:=P; //stay on 'hdrl'
inc(DWORD(PD),4); //stay on 'avih'
MH:=PD;
AVi.AVIHeader.dwMicroSecPerFrame:=MH^.dwMicroSecPerFrame;
avi.AVIHeader.dwMaxBytesPerSec:=mh^.dwMaxBytesPerSec;
avi.AVIHeader.dwFlags:=mh^.dwFlags;
avi.AVIHeader.dwTotalFrames:=mh^.dwTotalFrames;
avi.AVIHeader.dwStreams:=mh^.dwStreams;
inc(DWORD(PD),sizeof(TAVIMainHeader)); //Stay on LIST
audstreams:=0;
move(PD^,FCC,4);
For i:=0 to avi.AVIHeader.dwStreams-1 do
Begin
inc(DWORD(PD),4); //stay on 'strl' length
move(PD^,FCC,4);
inc(DWORD(PD),4); //Stay on 'strl'
move(PD^,FCC,4);
inc(DWORD(PD),4); //stay on 'strh'
move(PD^,FCC,4);
SH:=PD;
if SH^.fccType=ConvertFCCToDWORD(FCC_vids) then
begin
avi.vids.st:=sh^;
inc(DWORD(PD),sh^.cb+8); //stay on 'strf'
move(PD^,FCC,4);
inc(DWORD(PD),4); //stay on length 'strf'
move(PD^,leng,4);
inc(DWORD(PD),4); //stay on 'strf' data
VFH:=PD;
avi.vids.FMT.BMfmt:=VFH^.BMfmt;
if leng>56 then
avi.vids.FMT.DVFmt:=VFH^.DVFmt;
inc(DWORD(PD),leng);//stay on LIST
move(PD^,FCC,4);
end;
if SH^.fccType=ConvertFCCToDWORD('auds') then begin
avi.auds[audstreams].st:=SH^;
inc(DWORD(PD),sh^.cb+8); //stay on 'strf'
move(PD^,FCC,4);
inc(DWORD(PD),4); //stay on length 'strf'
move(PD^,leng,4);
inc(DWORD(PD),4); //stay on 'strf' data
WVH:=PD;
avi.auds[audstreams].WAVFmt:=WVH^;
inc(DWORD(PD),leng);
inc(audstreams);
end;
Move(PD^,FCC,4);//Stay on JUNK or 'strn'
If (FCC=FCC_JUNK) or (FCC=FCC_strn) or (FCC=FCC_strd) or (FCC=FCC_indx) then
begin
inc(DWORD(PD),4);
move(PD^,nuldd,4);
If nuldd mod 2<>0 then inc(nuldd);
inc(DWORD(PD),4+NULDD);
move(PD^,FCC,4);
end;
End;
avi.audstreams:=audstreams;
freemem(p);
end;
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
NailMan (2005-07-25 11:26:00) [3]извлечь тех-информацию можно распотрошив заголовок AVI, а сделать это грамотно можно с помощью DirectX SDK, там все подробнейше расписано впро все стандартныесекции заголовков RIFF - медиафайлов(AVI, WAV etc)
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
Simon (2005-07-23 12:27:00) [4]А может кто знает как проделать тоже самое но с VOB или IFO файлами?
Очень бы хотелось почитать...
Заранее благодарен.
Киби (2005-07-19 17:15:00) [5]http://abcavi.kibi.ru/docs/avi_bitrate.htm- там как раз про вычисление характеристик AVI файла написано.
К вопросу о всяко-разных способах изменения информации в AVI тэгах всё-таки лучше зайти непосредственно на страницу для разработчиков: http://abcavi.kibi.ru/developer.htm
Там и примеры есть с исходными кодами, и DLL для работы с AVI файлами, и технические описания.
Black&White (2005-07-11 12:47:00) [6]Вот здесь есть то о чем ты спрашиваешь!
http://abcavi.kibi.ru/index_rus.htm
Называется поддержка расширенного набора INFO тэгов (Extended INFO tags)
есть только "технические" характеристики.
Встречное предложение
помогите, пожалуйста, извлечь техническую информацию из заголовка AVI файл
cydvb (2005-04-14 11:50:00) [7]инфа об артисте есть, во всяком случае когда в адоп премьере делаеш аувишку можеш запихивать свою инфу, и винда её с удовольствием показывает в свойствах.
Antonn (2005-01-16 15:14:00) [8]_DemiK (16.01.05 15:04) [2]
За базаром... Сначала научись нормально вопрос ставить. Вот как найдешь информацию об артисте в *.avi тогда и ори.
_DemiK (2005-01-16 15:04:00) [9]Удалено модератором
Примечание: Предупреждение тебе.
Antonn (2005-01-16 05:12:00) [10]
> инфа о артисте
разве такие есть? есть только "технические" характеристики.