Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Информация о AVI файле, (разбор заголовка AVI) 
:(
    Опции темы
Poseidon
Дата 19.5.2005, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



Код
unit Unit1; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls; 

Type 
  TForm1 = class(TForm) 
    Memo1: TMemo; 
    OpenDialog1: TOpenDialog; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
  Public 
    procedure ReadAviInfo(FileName: String); 
  End; 

var 
  Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.ReadAviInfo(FileName: String); 
var 
  iFileHandle: Integer; // хэндл файла 

  // Для позмционирования в AVI файле 
  Aviheadersize: Integer; 
  Vheadersize: Integer; 
  Aviheaderstart: Integer; 
  Vheaderstart: Integer; 
  Aheaderstart: Integer; 
  Astrhsize: Integer; 

  // Временные переменные 
  TempTest: String[5]; 
  TempSize: Integer; 
  TempVcodec: String[5]; 
  TempAcodec: Integer; 
  TempMicrosec: Integer; 
  TempLengthInFrames: Integer; 
  TempAchannels: Integer; 
  TempAsamplerate: Integer; 
  TempAbitrate: Integer; 

  //Выходные данные 
  Size: Double; 
  Length: String; 
  Vcodec: String; 
  Vbitrate: Double; 
  VWidth: Integer; 
  VHeight: Integer; 
  Fps: Double; 

  LengthInSec: Double; 
  Acodec: String; 
  Abitrate: String; 
begin 
  // Открываем 
  iFileHandle := FileOpen(FileName, fmOpenRead); 

  // Грубая проверка на подлинность файла 
  FileSeek(iFileHandle, 7, 0); 
  FileRead(iFileHandle, TempTest, 5); 
  If copy(TempTest, 0, 4) <> 'AVI ' then 
  begin 
    MessageDlg('Could not open ' + FileName + ' because it is not a valid video file', mtError, [mbOk], 0); 
    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); 

  FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0); 
  FileRead(iFileHandle, Vheadersize, 4); 

  Vheaderstart := Aviheaderstart + Aviheadersize + 20; 

  // кодек 
  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; 

  Case (Trunc(TempAbitrate / 1024 * 8)) of 
    246..260: Abitrate := '128 Kbit/s'; 
    216..228: Abitrate := '128 Kbit/s'; 
    187..196: Abitrate := '128 Kbit/s'; 
    156..164: Abitrate := '128 Kbit/s'; 
    124..132: Abitrate := '128 Kbit/s'; 
    108..116: Abitrate := '128 Kbit/s'; 
    92..100: Abitrate := '128 Kbit/s'; 
    60..68: Abitrate := '128 Kbit/s'; 
  Else 
    Abitrate := FormatFloat('# Kbit/s', TempAbitrate / 1024 * 8); 
  End; 

  // тут некоторые вычисления 
  Size := TempSize / 1024 / 1024; 
  Fps := 1000000 / TempMicrosec; // FPS 
  LengthInSec := TempLengthInFrames / fps; // Length In seconds 
  Length := FormatFloat('# min', Int(LengthInSec / 60)) + FormatFloat(' # sec', 
    Round(LengthInSec - (Int(LengthInSec / 60) * 60))); 
  Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8; 

  // Выводим инфу в мемо 
  Memo1.Lines.Add('AVI INFORMATION'); 
  Memo1.lines.Add('Size: ' + FormatFloat('#.## MB',Size)); 
  Memo1.Lines.Add('Length: ' + Length); 
  Memo1.Lines.Add(''); 
  Memo1.Lines.Add('VIDEO INFORMATION'); 
  Memo1.Lines.Add('Codec: ' + Vcodec); 
  Memo1.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s', Vbitrate)); 
  Memo1.lines.Add('Width: ' + IntToStr(VWidth) + ' px'); 
  Memo1.lines.Add('Height: ' + IntToStr(VHeight) + ' px'); 
  Memo1.Lines.Add('FPS: ' + FormatFloat('#.##', fps)); 
  Memo1.Lines.Add(''); 
  Memo1.Lines.Add('AUDIO INFORMATION'); 
  Memo1.Lines.Add('Codec: ' + Acodec); 
  Memo1.Lines.Add('Bitrate: ' + Abitrate); 
End; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  If OpenDialog1.Execute Then ReadAviInfo(OpenDialog1.FileName); 
End; 

end. 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0760 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.