| 
| 
 | Вопрос # 105/ вопрос открыт / | 
 |  Уважаемые эксперты!Большое спасибо за помощь.
 Есть ещё пара вопросов:
 1. Как можно проиграть видеофильм с расширением .avi не используя стандартный медиаплеер делфи.
 2. Как определить окончание проигрывания такого файла, чтобы убрать экран из формы.
 Заранее благодарен.
 
|  |   Вопрос задал: Freger (статус: Посетитель)Вопрос отправлен: 15 августа 2006, 13:49
 Состояние вопроса: открыт, ответов: 3.
 |  Ответ #1. Отвечает эксперт: bruder Здравствуйте, Freger!Используй компоненты сторонних производителей. Обычно с ними идёт пример использования...
 
|  | Ответ отправил: bruder (статус: 4-ый класс)Время отправки: 15 августа 2006, 14:08
 
 |  Ответ #2. Отвечает эксперт: MFred Здравствуйте, Freger!Насчет плеера не нечем помоч. Вот если пригодится пример инфы по AVI файлам.
 Приложение:Переключить в обычный режим 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      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);     FileSeek(iFileHandle,28,0);   FileRead(iFileHandle, Aviheadersize, 4);     Aviheaderstart := 32;     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);     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.    
|  | Ответ отправил: MFred (статус: 1-ый класс)Время отправки: 15 августа 2006, 15:54
 
 |  Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович Здравствуйте, Freger!1. Скорее всего это не получится, т.к. .avi это только оболочка, а сами видеоданные могут быть кодированны разными кодерами и, соответственно для проигрывания нужны декодеры. Чем Вас не устраивает TMediaPlayer?
 2. TMediaPlayer.OnNotify вызывается при любых событиях медиаплеера (пауза, остановка и т.д). Пример реакции на окончание воспроизведения см. в приложении.
 Приложение:Переключить в обычный режим procedure TForm1.MediaPlayer1Notify(Sender: TObject);begin with Sender as TMediaPlayer do   if NotifyValue = nvSuccessful end;
 Мини-форум вопросаВсего сообщений: 1; последнее сообщение — 15 августа 2006, 16:21; участников в обсуждении: 1. 
|   | Dron (статус: Студент), 15 августа 2006, 16:21 [#1]:Могу подсказать, как отловить момент окончания воспроизведения (2), но в TMediaPlayer, что противоречит вопросу (1)   С уважением. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |