Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Как узнать имя кодека, которым сжат видеофайл   Найти похожие ветки 

 
Master_ ©   (2007-02-05 16:18) [0]

Доброго времени суток, Мастера.
Писал на раздел форума MEDIA, но успехов нету в моем вопросе((
САБЖ, а именно интересует компонент или пример кода, для просмотра информации о видеокодеке и аудио кодеке, как это сделано например в Лайт Алой медиаплейере.


 
Плохиш ©   (2007-02-05 16:19) [1]


> Писал на раздел форума MEDIA

Вообще-то здесь за спамские сообщения не отвечают, а убивают быстрее...


 
Master_ ©   (2007-02-05 16:23) [2]

Просто мне кажется здесь поактивнее отвечают чем там, пускай иногда и не в тему.


 
Правильный Вася   (2007-02-05 16:36) [3]

тебе только кодек или медиаконтейнер тоже?


 
Master_ ©   (2007-02-05 16:46) [4]


> Правильный Вася

Достаточно только имя кодека Видео и Аудио


 
Rouse_ ©   (2007-02-05 20:27) [5]

Ня:

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.


 
Master_ ©   (2007-02-05 21:26) [6]


> Rouse_

Спасибо большое за пример, есть все что надо мне, а то эксперимнтировал с модулем WFV.pas . По мне - слишком навернутый модуль. А тут все - и одной процедурой - самое то !!!


 
Nostradamus ©   (2007-02-06 15:27) [7]

Слушай Rouse, а по другим контейнерам у тебя что нибудь есть? Может хотя юы ссылка, где подробно всё описано?


 
Rouse_ ©   (2007-02-06 15:45) [8]


> Nostradamus ©   (06.02.07 15:27) [7]

По каким другим?
Вообще описание большинства форматов доступно в интернете...


 
Nostradamus ©   (2007-02-06 16:18) [9]


> По каким другим?

Ну скажем divx, matroska и т.д.


> Вообще описание большинства форматов доступно в интернете.
> ..

Да я вот всё ищу, но пока не удалось найти достаточно полную по всем (или хотя бы) большинству контейнеров


 
Правильный Вася   (2007-02-06 16:34) [10]

 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";

и че, везде одинаковый битрейт?


 
Rouse_ ©   (2007-02-06 16:34) [11]

Не, я про matroska вообще первый раз слышу :)


 
Rouse_ ©   (2007-02-06 16:35) [12]


> и че, везде одинаковый битрейт?

понятия не имею - модуль не мой :)



Страницы: 1 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
1-1190540404
Tack
2007-09-23 13:40
2007.12.09
Отладчик BDS2006 некорректно отображает значения Int64


1-1189937644
Vendict
2007-09-16 14:14
2007.12.09
Memo и прокрутка


5-1163762981
Vitebsky
2006-11-17 14:29
2007.12.09
TRichEdit - просмотр стилей


15-1194520607
Делать_нечего
2007-11-08 14:16
2007.12.09
"Код"


11-1180165434
Vladimir Kladov
2007-05-26 11:43
2007.12.09
Версия 2.63