Получение информации о AVI файле 2Delphi , Мультимедиа , ВидеоПолучение информации о AVI файле 2
Автор: Alex Kantchev { **** UBPFD *********** by delphibase.endimus.com **** >> Получение информации о AVI файле (новая версия) Unit содерйущии (пока) единственая функция для получение информации о AVI файле. function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo; Описание: Получение информации о AVI файле. Параметры: FileName: String; ErrCode: Код возвращаемый от функции; (in/out) Возвращаемая стоемость: TAVIFileInfo - структура для сохранение всей информации об фаилом. Кометарии: Новая версия. Базируется на процедуре: intermediate procedure ReadAviInfo автором на которой является [NIKEL] Зависимости: SysUtils Автор: Alex Kantchev, stoma@bitex.bg Copyright: Оригинал: [NIKEL] Модификация: Alex Kantchev Дата: 28 апреля 2003 г. ***************************************************** } unit AviInformation; interface uses SysUtils; type // // structure containing avi file info // TAVIFileInfo = packed record AVIFileName: string; FileSize: double; ClipLength: double; VideoCodec: string[32]; ClipBitrate: double; ClipWidth: Integer; ClipHeight: Integer; ClipFPS: double; AudioCodec: string[32]; AudioBitRate: Integer; AudioSampleRate: Integer; AudioChannelCnt: Byte; end; function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo; implementation // // Function for reading avi file // function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo; var // хэндл файла iFileHandle: Integer; // Для позционирования в AVI файле Aviheadersize: integer; Vheadersize: integer; Aviheaderstart: integer; Vheaderstart: integer; Aheaderstart: integer; Astrhsize: integer; // Временные переменные TempFExt: string[5]; TempSize: Integer; TempVcodec: string[5]; TempAcodec: integer; TempMicrosec: integer; TempLengthInFrames: integer; TempAchannels: integer; TempAsamplerate: integer; TempAbitrate: integer; //Выходные данные Size: double; Length: double; Vcodec: string; Vbitrate: double; VWidth: integer; VHeight: integer; Fps: double; LengthInSec: double; Acodec: string; Abitrate: Integer; RetVal: TAVIFileInfo; begin ErrCode := 0; TempAcodec := 0; TempAbitrate := 0; TempAsamplerate := 0; TempAchannels := 0; if not FileExists(FileName) then begin ErrCode := 1; exit; end; // Открываем iFileHandle := FileOpen(FileName, fmOpenRead); // Грубая проверка на подлинность файла FileSeek(iFileHandle, 7, 0); FileRead(iFileHandle, TempFExt, 5); if copy(TempFExt, 0, 4) <> 'AVI ' then begin ErrCode := 2; exit; end; // Размер файла FileSeek(iFileHandle, 4, 0); FileRead(iFileHandle, TempSize, 4); // Размер хедера (needed to locate the audio part) FileSeek(iFileHandle, 28, 0); FileRead(iFileHandle, Aviheadersize, 4); // старт хедера (needed to locate the video part) Aviheaderstart := 32; // Милисекунды (1000000 / TempMicrosec = fps) FileSeek(iFileHandle, Aviheaderstart, 0); FileRead(iFileHandle, TempMicrosec, 4); // Размер во фреймах FileSeek(iFileHandle, Aviheaderstart + 16, 0); FileRead(iFileHandle, TempLengthInFrames, 4); // Ширина FileSeek(iFileHandle, Aviheaderstart + 32, 0); FileRead(iFileHandle, VWidth, 4); // Высота FileSeek(iFileHandle, Aviheaderstart + 36, 0); FileRead(iFileHandle, VHeight, 4); //calculate header size FileSeek(iFileHandle, Aviheaderstart + Aviheadersize + 4, 0); FileRead(iFileHandle, Vheadersize, 4); Vheaderstart := Aviheaderstart + Aviheadersize + 20; // Video Codec FileSeek(iFileHandle, Vheaderstart + 3, 0); FileRead(iFileHandle, TempVCodec, 5); Aheaderstart := Vheaderstart + Vheadersize + 8; FileSeek(iFileHandle, Aheaderstart - 4, 0); FileRead(iFileHandle, Astrhsize, 5); // Audio codec FileSeek(iFileHandle, Aheaderstart + Astrhsize + 8, 0); FileRead(iFileHandle, TempACodec, 2); // Audio каналы (1 = mono, 2 = stereo) FileSeek(iFileHandle, Aheaderstart + Astrhsize + 10, 0); FileRead(iFileHandle, TempAchannels, 2); // Audio samplerate FileSeek(iFileHandle, Aheaderstart + Astrhsize + 12, 0); FileRead(iFileHandle, TempAsamplerate, 4); // Audio bitrate FileSeek(iFileHandle, Aheaderstart + Astrhsize + 16, 0); FileRead(iFileHandle, TempAbitrate, 4); // закрываем файл FileClose(iFileHandle); // анализируем видео кодек (можно добавить больше) Vcodec := copy(TempVcodec, 0, 4); if Vcodec = 'div2' then Vcodec := 'MS MPEG4 v2' else if Vcodec = 'DIV2' then Vcodec := 'MS MPEG4 v2' else if Vcodec = 'div3' then Vcodec := 'DivX;-) MPEG4 v3' else if Vcodec = 'DIV3' then Vcodec := 'DivX;-) MPEG4 v3' else if Vcodec = 'div4' then Vcodec := 'DivX;-) MPEG4 v4' else if Vcodec = 'DIV4' then Vcodec := 'DivX;-) MPEG4 v4' else if Vcodec = 'div5' then Vcodec := 'DivX;-) MPEG4 v5' else if Vcodec = 'DIV5' then Vcodec := 'DivX;-) MPEG4 v5' else if Vcodec = 'divx' then Vcodec := 'DivX 4' else if Vcodec = 'mp43' then Vcodec := 'Microcrap MPEG4 v3'; // тоже с аудио case TempAcodec of 0: Acodec := 'PCM'; 1: Acodec := 'PCM'; 85: Acodec := 'MPEG Layer 3'; 353: Acodec := 'DivX;-) Audio'; 8192: Acodec := 'AC3-Digital'; else Acodec := 'Unknown (' + IntToStr(TempAcodec) + ')'; end; //Audio bitrate case (Trunc(TempAbitrate / 1024 * 8)) of 246..260: Abitrate := 128; 216..228: Abitrate := 128; 187..196: Abitrate := 128; 156..164: Abitrate := 128; 124..132: Abitrate := 128; 108..116: Abitrate := 128; 92..100: Abitrate := 128; 60..68: Abitrate := 128; else Abitrate := Round(TempAbitrate / 1024 * 8); end; // тут некоторые вычисления Size := TempSize / 1024 / 1024; Fps := 1000000 / TempMicrosec; // FPS // Length in seconds LengthInSec := TempLengthInFrames / fps; //length in minutes Length := LengthInSec / 60; //Round(LengthInSec - (Int(LengthInSec / 60) * 60))); Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8; //fill up the file info structure RetVal.AVIFileName := FileName; RetVal.FileSize := Size; RetVal.ClipLength := Length; RetVal.VideoCodec := VCodec; RetVal.ClipBitrate := Vbitrate; RetVal.ClipWidth := VWidth; RetVal.ClipHeight := VHeight; RetVal.ClipFPS := FPS; RetVal.AudioCodec := Acodec; RetVal.AudioBitRate := Abitrate; RetVal.AudioSampleRate := TempAsamplerate; RetVal.AudioChannelCnt := TempAchannels; ReadAviInfo := RetVal; end; end. Пример использования: unit AVIInfo; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AviInformation; type // // structure containing avi file info // TAVIFileInfo = packed record AVIFileName: string; FileSize: double; ClipLength: double; VideoCodec: string[32]; ClipBitrate: double; ClipWidth: Integer; ClipHeight: Integer; ClipFPS: double; AudioCodec: string[32]; AudioBitRate: Integer; AudioSampleRate: Integer; AudioChannelCnt: Byte; end; TForm1 = class(TForm) Button1: TButton; AVIVideoInfo: TMemo; OpenDialog1: TOpenDialog; AVIAudioInfo: TMemo; AVIGenInfo: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } // function ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var FInfo: AviInformation.TAVIFileInfo; ErrCode: Byte; begin if OpenDialog1.Execute then begin FInfo := AviInformation.ReadAviInfo(OpenDialog1.FileName, ErrCode); AviGenInfo.Clear; AVIVideoInfo.Clear; AVIAudioInfo.Clear; if ErrCode > 0 then exit; AviGenInfo.Lines.Add('AVI INFORMATION'); AviGenInfo.lines.Add('FileName: ' + FInfo.AVIFileName); AviGenInfo.lines.Add('Size: ' + FormatFloat('#.## MB', FInfo.FileSize)); AviGenInfo.Lines.Add('Length: ' + FormatFloat('#.## min.', FInfo.ClipLength)); AVIVideoInfo.Lines.Add('VIDEO INFORMATION'); AVIVideoInfo.Lines.Add('Codec: ' + FInfo.VideoCodec); AVIVideoInfo.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s', Finfo.ClipBitrate)); AVIVideoInfo.lines.Add('Width: ' + IntToStr(Finfo.ClipWidth) + ' px'); AVIVideoInfo.lines.Add('Height: ' + IntToStr(Finfo.ClipHeight) + ' px'); AVIVideoInfo.Lines.Add('FPS: ' + FormatFloat('#.##', Finfo.ClipFPS)); AVIAudioInfo.Lines.Add('AUDIO INFORMATION'); AVIAudioInfo.Lines.Add('Codec: ' + Finfo.AudioCodec); AVIAudioInfo.Lines.Add('Bitrate: ' + FormatFloat('#.##', Finfo.AudioBitRate)); AVIAudioInfo.Lines.Add('Audio sample Rate: ' + IntToStr(FInfo.AudioSampleRate)); AVIAudioInfo.Lines.Add('Audio Channel Count: ' + IntToStr(FInfo.AudioChannelCnt)); end; end; {function TForm1.ReadAviInfo(FileName: string; var ErrCode: Byte): TAVIFileInfo; var // хэндл файла iFileHandle: Integer; // Для позционирования в AVI файле Aviheadersize: integer; Vheadersize: integer; Aviheaderstart: integer; Vheaderstart: integer; Aheaderstart: integer; Astrhsize: integer; // Временные переменные TempFExt: String[5]; TempSize: Integer; TempVcodec: String[5]; TempAcodec: integer; TempMicrosec: integer; TempLengthInFrames: integer; TempAchannels: integer; TempAsamplerate: integer; TempAbitrate: integer; //Выходные данные Size: double; Length: double; Vcodec: string; Vbitrate: double; VWidth: integer; VHeight: integer; Fps: double; LengthInSec: double; Acodec: string; Abitrate: Integer; RetVal: TAVIFileInfo; begin ErrCode := 0; TempAcodec := 0; TempAbitrate := 0; TempAsamplerate := 0; TempAchannels := 0; if not FileExists(FileName) then begin ErrCode := 1; exit; end; // Открываем iFileHandle := FileOpen(FileName, fmOpenRead); // Грубая проверка на подлинность файла FileSeek(iFileHandle, 7, 0); FileRead(iFileHandle, TempFExt, 5); if copy(TempFExt, 0, 4) <> 'AVI ' then begin ErrCode := 2; exit; end; // Размер файла FileSeek(iFileHandle,4,0); FileRead(iFileHandle, TempSize, 4); // Размер хедера (needed to locate the audio part) FileSeek(iFileHandle,28,0); FileRead(iFileHandle, Aviheadersize, 4); // старт хедера (needed to locate the video part) Aviheaderstart := 32; // Милисекунды (1000000 / TempMicrosec = fps) FileSeek(iFileHandle,Aviheaderstart,0); FileRead(iFileHandle, TempMicrosec, 4); // Размер во фреймах FileSeek(iFileHandle,Aviheaderstart + 16,0); FileRead(iFileHandle, TempLengthInFrames, 4); // Ширина FileSeek(iFileHandle,Aviheaderstart + 32,0); FileRead(iFileHandle, VWidth, 4); // Высота FileSeek(iFileHandle,Aviheaderstart + 36,0); FileRead(iFileHandle, VHeight, 4); //calculate header size FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0); FileRead(iFileHandle, Vheadersize, 4); Vheaderstart := Aviheaderstart + Aviheadersize + 20; // Video Codec FileSeek(iFileHandle,Vheaderstart + 3,0); FileRead(iFileHandle, TempVCodec, 5); Aheaderstart := Vheaderstart + Vheadersize + 8; FileSeek(iFileHandle,Aheaderstart - 4,0); FileRead(iFileHandle, Astrhsize, 5); // Audio codec FileSeek(iFileHandle,Aheaderstart + Astrhsize + 8,0); FileRead(iFileHandle, TempACodec, 2); // Audio каналы (1 = mono, 2 = stereo) FileSeek(iFileHandle,Aheaderstart + Astrhsize + 10,0); FileRead(iFileHandle, TempAchannels, 2); // Audio samplerate FileSeek(iFileHandle,Aheaderstart + Astrhsize + 12,0); FileRead(iFileHandle, TempAsamplerate, 4); // Audio bitrate FileSeek(iFileHandle,Aheaderstart + Astrhsize + 16,0); FileRead(iFileHandle, TempAbitrate, 4); // закрываем файл FileClose(iFileHandle); // анализируем видео кодек (можно добавить больше) Vcodec := copy(TempVcodec, 0, 4); if Vcodec = 'div2' then Vcodec := 'MS MPEG4 v2' else if Vcodec = 'DIV2' then Vcodec := 'MS MPEG4 v2' else if Vcodec = 'div3' then Vcodec := 'DivX;-) MPEG4 v3' else if Vcodec = 'DIV3' then Vcodec := 'DivX;-) MPEG4 v3' else if Vcodec = 'div4' then Vcodec := 'DivX;-) MPEG4 v4' else if Vcodec = 'DIV4' then Vcodec := 'DivX;-) MPEG4 v4' else if Vcodec = 'div5' then Vcodec := 'DivX;-) MPEG4 v5' else if Vcodec = 'DIV5' then Vcodec := 'DivX;-) MPEG4 v5' else if Vcodec = 'divx' then Vcodec := 'DivX 4' else if Vcodec = 'mp43' then Vcodec := 'Microcrap MPEG4 v3'; // тоже с аудио case TempAcodec of 0: Acodec := 'PCM'; 1: Acodec := 'PCM'; 85: Acodec := 'MPEG Layer 3'; 353: Acodec := 'DivX;-) Audio'; 8192: Acodec := 'AC3-Digital'; else Acodec := 'Unknown (' + IntToStr(TempAcodec) + ')'; end; //Audio bitrate case (Trunc(TempAbitrate / 1024 * 8)) of 246..260: Abitrate := 128; 216..228: Abitrate := 128; 187..196: Abitrate := 128; 156..164: Abitrate := 128; 124..132: Abitrate := 128; 108..116: Abitrate := 128; 92..100: Abitrate := 128; 60..68: Abitrate := 128; else Abitrate := Round(TempAbitrate / 1024 * 8); end; // тут некоторые вычисления Size := TempSize / 1024 / 1024; Fps := 1000000 / TempMicrosec; // FPS // Length in seconds LengthInSec := TempLengthInFrames / fps; //length in minutes Length := LengthInSec / 60; //Round(LengthInSec - (Int(LengthInSec / 60) * 60))); Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8; //fill up the file info structure RetVal.AVIFileName := FileName; RetVal.FileSize := Size; RetVal.ClipLength := Length; RetVal.VideoCodec := VCodec; RetVal.ClipBitrate := Vbitrate; RetVal.ClipWidth := VWidth; RetVal.ClipHeight := VHeight; RetVal.ClipFPS := FPS; RetVal.AudioCodec := Acodec; RetVal.AudioBitRate := Abitrate; RetVal.AudioSampleRate := TempAsamplerate; RetVal.AudioChannelCnt := TempAchannels; ReadAviInfo := RetVal; end; } end. Программный модуль на языке Delphi, который предоставляет функцию чтения информации из файла AVI. Функция Вот шаг за шагом, что код делает:
Пример использования в конце показывает, как вызывать эту функцию и отображать извлеченную информацию в контроле memo на форме. Обратите внимание, что это код низкого уровня и может не работать правильно с некоторыми файлами AVI, особенно теми, которые имеют сложные или нестандартные заголовки. Кроме того, он плохо обрабатывает ошибки и исключения, поэтому вам может потребоваться добавить обработку ошибок и исключений для сделать код более устойчивым. Получение информации о AVI файле: программно-инструментарный комплекс для чтения и анализа информации о видеофайле формата AVI. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |