Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение информации о звуковых файлах

Delphi , Мультимедиа , Аудио

Получение информации о звуковых файлах


// First, put a memo, button and a open dialog on an empty form.
// Then use the following code to show the information of a avi file.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ReadAviInfo(FileName: string);

  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ReadAviInfo(FileName: string);
var
  iFileHandle: Integer; // File handle

  // Needed for positioning in the avi file
  Aviheadersize: integer;
  Vheadersize: integer;
  Aviheaderstart: integer;
  Vheaderstart: integer;
  Aheaderstart: integer;
  Astrhsize: integer;

  // Temporary values
  TempTest: String[5];
  TempSize: Integer;
  TempVcodec: String[5];
  TempAcodec: integer;
  TempMicrosec: integer;
  TempLengthInFrames: integer;
  TempAchannels: integer;
  TempAsamplerate: integer;
  TempAbitrate: integer;

  // Final values
  Size: double;
  Length: string;
  Vcodec: string;
  Vbitrate: double;
  VWidth: integer;
  VHeight: integer;
  Fps: double;

  LengthInSec: double;
  Acodec: string;
  Abitrate: string;
begin
  // Open the file
  iFileHandle := FileOpen(FileName, fmOpenRead);

  // Test to see if file is AVI
  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;

  // File size
  FileSeek(iFileHandle,4,0);
  FileRead(iFileHandle, TempSize, 4);

  // Avi header size (needed to locate the audio part)
  FileSeek(iFileHandle,28,0);
  FileRead(iFileHandle, Aviheadersize, 4);

  // Avi header start (needed to locate the video part)
  Aviheaderstart := 32;

  // Microseconds (1000000 / TempMicrosec = fps)
  FileSeek(iFileHandle,Aviheaderstart,0);
  FileRead(iFileHandle, TempMicrosec, 4);

  // Length of movie in frames
  FileSeek(iFileHandle,Aviheaderstart + 16,0);
  FileRead(iFileHandle, TempLengthInFrames, 4);

  // Width
  FileSeek(iFileHandle,Aviheaderstart + 32,0);
  FileRead(iFileHandle, VWidth, 4);

  // Height
  FileSeek(iFileHandle,Aviheaderstart + 36,0);
  FileRead(iFileHandle, VHeight, 4);

  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 channels (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);

  // Close the file
  FileClose(iFileHandle);

  // Analyse the video codec (more can be added)
  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';

  // Analyse the audio codec (more can be added)
  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;

  // Some final calculations
  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;

  // Output information to memo field
  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
  OpenDialog1.Filter := 'AVI files (*.avi)|*.avi';
  if OpenDialog1.Execute then
  begin
    Memo1.Clear;
    ReadAviInfo(OpenDialog1.FileName);
  end;
end;

end.

Программа на Delphi, которая извлекает информацию из файлов AVI. Она использует компонент TForm для создания формы с кнопкой, полем ввода и диалогом открытия. Когда кнопка нажата, она открывает диалог "Открыть", позволяя пользователю выбрать файл AVI. Затем программа читает заголовок файла, чтобы извлечь информацию,such as размер, длина, кодек видео, кодек аудио, частота кадров, битрейт и т.д.

Программа состоит из следующих шагов:

  1. Она настраивает форму с кнопкой, полем ввода и диалогом открытия.
  2. В процедуре ReadAviInfo она открывает выбранный файл и читает его заголовок для извлечения информации.
  3. Она проверяет, является ли файл AVI, прочитав первые 4 байта файла.
  4. Затем она извлекает различные части информации из заголовка файла, включая:
    • Размер
    • Длина кадров
    • Кодек видео (например, "DivX;-) MPEG4 v3")
    • Кодек аудио (например, "MPEG Layer 3")
    • Частота кадров (FPS)
    • Битрейт
    • Ширина и высота видео
  5. Она рассчитывает некоторые дополнительные значения, такие как:
    • Длина файла в секундах
    • Видео битрейт
  6. Наконец, она выводит всю эту информацию в поле ввода.

Процедура Button1Click вызывается при нажатии кнопки. Она настраивает фильтр диалога открытия для отображения только файлов AVI и затем выполняет диалог. Если файл выбран, она очищает поле ввода и вызывает процедуру ReadAviInfo, чтобы извлечь информацию о файле.

Некоторые предложения по улучшению:

  • Обработка ошибок: код не обрабатывает ошибки, которые могут возникнуть при чтении или записи в файл.
  • Организация кода: процедура ReadAviInfo слишком длинная и может быть разбита на более маленькие процедуры для лучшей читаемости и поддерживаемости.
  • Имя переменных: некоторые имена переменных неясны, такие как TempTest и TempSize. Рекомендуется использовать более описательные имена.
  • Комментарии кода: нет комментариев к коду, чтобы объяснить, что он делает или почему были сделаны определенные решения. Добавление комментариев может сделать код более понятным для других (и для себя в будущем).

Получение информации о звуковых файлах с помощью Delphi, позволяет отображать размер, длину, кодек и битрейт аудио и видеопотока в AVI-файле.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Аудио ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:38:32/0.006234884262085/1