|
Вопрос # 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)
С уважением.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|