Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать время bitrate... [D6, WinXP]


Unitay ©   (2006-03-10 10:36:00) 

Как узнать время, количество кадров и др. параметры таких видео-файлов как *.ogg *.ogm *.mkv средствами Delphi?
PS Как узнать количество аудио-потоков(количество звуковых дорожек) обычного avi файла?


AbrosimovA   (2006-03-10 15:44:00) [1]

uses ..., MMSystem, VFW;

................................

var
  hFile : PAVIFile;
  nameFile : array[0..254] of Char;
  infoFile : TAVIFileInfo;
  infoVStream, infoAStream : TAVIStreamInfo;
  VideoStream, AudioStream : PAVIStream;
  Res: HResult;
  tStream: string;
  AudioFormat: TWAVEFORMATEX;
  AudioSize: DWord;
begin
if OpenDialog1.Execute then begin
  StrPCopy(nameFile,OpenDialog1.FileName);

{---------------------Получение данных файла--------------------}
  AVIFileInit; // иниц. API
  Res:=AVIFileOpen (hFile, nameFile, OF_READ, nil); // открытие файла
  if Res<>S_OK then Exit;
  AVIFileInfo (hFile, @infoFile, SizeOf(infoFile)); // получение инфы файла
  with ListBox1.Items, infoFile do
  begin
    Clear;
    Add('Файл: ' + nameFile);
    Add('');
    Add('Число потоков: ' + IntToStr(dwStreams));
  end;

{------------------Получение данных видеопотока-----------------}
  AVIStreamInit;
  Res:=AVIFileGetStream(hFile, VideoStream, streamtypeVIDEO, OF_READ);
  if Res<>S_OK then Exit;
  AVIStreamInfo(VideoStream, @infoVStream, SizeOf(infoVStream));
{---------------------------------------------------------------}
  with ListBox1.Items, infoVStream do
  begin
    case fccType of
     STREAMTYPEVIDEO: tStream:='Видео (vids)';
    end;
    Add('');
    Add('Тип потока: ' + tStream);
    Add('Ширина: '+IntToStr(rcFrame.Right)+' точек');
    Add('Высота: '+IntToStr(rcFrame.Bottom)+' точек');
    Add('Частота кадров: ' + IntToStr(Round(dwRate/dwScale)) + ' кадров/сек');
    Add('');
  end;
{------------------Получение данных аудиопотока------------------}
  Res:=AVIFileGetStream(hFile, AudioStream, streamtypeAUDIO, OF_READ);
  if Res<>S_OK then Exit;
  AVIStreamInfo(AudioStream, @infoAStream, SizeOf(infoAStream));
{----------------------------------------------------------------}
  with ListBox1.Items, infoAStream do
  begin
    case fccType of
     streamtypeAUDIO: tStream:='Аудио (auds)';
    end;
    Add('');
    Add('Тип потока: ' + tStream);
    Add('Длительность: ' + TimeToStr(dwLength/(dwRate/dwScale) /
                               SecsPerDay));
  end;
{----------------Дополнительные данные аудиопотока---------------}
  AVIStreamFormatSize(AudioStream,0,@AudioSize);
  AVIStreamReadFormat(AudioStream,0,@AudioFormat,@AudioSize);
  with ListBox1.Items, AudioFormat do
  begin
    case nChannels of
     1: Add('Канал звука: Моно');
     2: Add('Канал звука: Стерео');
    end;
    Add('Частота: '+IntToStr(nSamplesPerSec div 1000)+' кГц');
    Add('BPS: '+IntToStr(nAvgBytesPerSec div 1000));
    Add('');
  end;
  AVIStreamRelease(VideoStream);
  AVIStreamExit;
  AVIFileRelease (hFile); // закрытие файла
  AVIFileExit; // закрытие API
end;


antonn   (2006-03-10 11:48:00) [2]

поищи в поисковике Audio Tools Library, найдешь архив с классами, организующих работу с этими форматами (и даже больше). Под Delphi7 мог бы дать компонент, собраный на этих классах, упрощающий применение.


Наверх

Титульная страница Поиск, карта сайта Написать письмо