Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 105

/ вопрос открыт /

Уважаемые эксперты!
Большое спасибо за помощь.
Есть ещё пара вопросов:
1. Как можно проиграть видеофильм с расширением .avi не используя стандартный медиаплеер делфи.
2. Как определить окончание проигрывания такого файла, чтобы убрать экран из формы.
Заранее благодарен.

Freger Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Freger (статус: Посетитель)
Вопрос отправлен: 15 августа 2006, 13:49
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: bruder

Здравствуйте, Freger!
Используй компоненты сторонних производителей. Обычно с ними идёт пример использования...

Ответ отправил: bruder (статус: 4-ый класс)
Время отправки: 15 августа 2006, 14:08

Ответ #2. Отвечает эксперт: MFred

Здравствуйте, Freger!
Насчет плеера не нечем помоч. Вот если пригодится пример инфы по AVI файлам.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. Type
  10. TForm1 = class(TForm)
  11. Memo1: TMemo;
  12. OpenDialog1: TOpenDialog;
  13. Button1: TButton;
  14. procedure Button1Click(Sender: TObject);
  15. Public
  16. procedure ReadAviInfo(FileName: String);
  17. End;
  18.  
  19. var
  20. Form1: TForm1;
  21.  
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. procedure TForm1.ReadAviInfo(FileName: String);
  27. var
  28.  
  29.  
  30.  
  31. Aviheadersize: Integer;
  32. Vheadersize: Integer;
  33. Aviheaderstart: Integer;
  34. Vheaderstart: Integer;
  35. Aheaderstart: Integer;
  36. Astrhsize: Integer;
  37.  
  38.  
  39. TempTest: String[5];
  40. TempSize: Integer;
  41. TempVcodec: String[5];
  42. TempAcodec: Integer;
  43. TempMicrosec: Integer;
  44. TempLengthInFrames: Integer;
  45. TempAchannels: Integer;
  46. TempAsamplerate: Integer;
  47. TempAbitrate: Integer;
  48.  
  49.  
  50. Size: Double;
  51. Length: String;
  52. Vcodec: String;
  53. Vbitrate: Double;
  54. VWidth: Integer;
  55. VHeight: Integer;
  56. Fps: Double;
  57.  
  58. LengthInSec: Double;
  59. Acodec: String;
  60. Abitrate: String;
  61. begin
  62.  
  63. iFileHandle := FileOpen(FileName, fmOpenRead);
  64.  
  65.  
  66. FileSeek(iFileHandle, 7, 0);
  67. FileRead(iFileHandle, TempTest, 5);
  68. If copy(TempTest, 0, 4) <> 'AVI ' then
  69. begin
  70. MessageDlg('Could not open ' + FileName + ' because it is not a valid video file', mtError, [mbOk], 0);
  71. Exit;
  72. End;
  73.  
  74.  
  75. FileSeek(iFileHandle,4,0);
  76. FileRead(iFileHandle, TempSize, 4);
  77.  
  78.  
  79. FileSeek(iFileHandle,28,0);
  80. FileRead(iFileHandle, Aviheadersize, 4);
  81.  
  82.  
  83. Aviheaderstart := 32;
  84.  
  85.  
  86. FileSeek(iFileHandle,Aviheaderstart,0);
  87. FileRead(iFileHandle, TempMicrosec, 4);
  88.  
  89.  
  90. FileSeek(iFileHandle,Aviheaderstart + 16,0);
  91. FileRead(iFileHandle, TempLengthInFrames, 4);
  92.  
  93.  
  94. FileSeek(iFileHandle,Aviheaderstart + 32,0);
  95. FileRead(iFileHandle, VWidth, 4);
  96.  
  97.  
  98. FileSeek(iFileHandle,Aviheaderstart + 36,0);
  99. FileRead(iFileHandle, VHeight, 4);
  100.  
  101. FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0);
  102. FileRead(iFileHandle, Vheadersize, 4);
  103.  
  104. Vheaderstart := Aviheaderstart + Aviheadersize + 20;
  105.  
  106.  
  107. FileSeek(iFileHandle,Vheaderstart + 3,0);
  108. FileRead(iFileHandle, TempVCodec, 5);
  109.  
  110. Aheaderstart := Vheaderstart + Vheadersize + 8;
  111.  
  112. FileSeek(iFileHandle,Aheaderstart - 4,0);
  113. FileRead(iFileHandle, Astrhsize, 5);
  114.  
  115. // Audio codec
  116. FileSeek(iFileHandle,Aheaderstart + Astrhsize + 8,0);
  117. FileRead(iFileHandle, TempACodec, 2);
  118.  
  119.  
  120. FileSeek(iFileHandle,Aheaderstart + Astrhsize + 10,0);
  121. FileRead(iFileHandle, TempAchannels, 2);
  122.  
  123. // Audio samplerate
  124. FileSeek(iFileHandle,Aheaderstart + Astrhsize + 12,0);
  125. FileRead(iFileHandle, TempAsamplerate, 4);
  126.  
  127. // Audio bitrate
  128. FileSeek(iFileHandle,Aheaderstart + Astrhsize + 16,0);
  129. FileRead(iFileHandle, TempAbitrate, 4);
  130.  
  131.  
  132. FileClose(iFileHandle);
  133.  
  134.  
  135. Vcodec := copy(TempVcodec, 0, 4);
  136. If Vcodec = 'div2' then Vcodec := 'MS MPEG4 v2'
  137. Else If Vcodec = 'DIV2' then Vcodec := 'MS MPEG4 v2'
  138. Else If Vcodec = 'div3' then Vcodec := 'DivX;-) MPEG4 v3'
  139. Else If Vcodec = 'DIV3' then Vcodec := 'DivX;-) MPEG4 v3'
  140. Else If Vcodec = 'div4' then Vcodec := 'DivX;-) MPEG4 v4'
  141. Else If Vcodec = 'DIV4' then Vcodec := 'DivX;-) MPEG4 v4'
  142. Else If Vcodec = 'div5' then Vcodec := 'DivX;-) MPEG4 v5'
  143. Else If Vcodec = 'DIV5' then Vcodec := 'DivX;-) MPEG4 v5'
  144. Else If Vcodec = 'divx' then Vcodec := 'DivX 4'
  145. Else If Vcodec = 'mp43' then Vcodec := 'Microcrap MPEG4 v3';
  146.  
  147.  
  148. Case TempAcodec of
  149. 0: Acodec := 'PCM';
  150. 1: Acodec := 'PCM';
  151. 85: Acodec := 'MPEG Layer 3';
  152. 353: Acodec := 'DivX;-) Audio';
  153. 8192: Acodec := 'AC3-Digital';
  154. Else
  155. Acodec := 'Unknown (' + IntToStr(TempAcodec) + ')';
  156. End;
  157.  
  158. Case (Trunc(TempAbitrate / 1024 * 8)) of
  159. 246..260: Abitrate := '128 Kbit/s';
  160. 216..228: Abitrate := '128 Kbit/s';
  161. 187..196: Abitrate := '128 Kbit/s';
  162. 156..164: Abitrate := '128 Kbit/s';
  163. 124..132: Abitrate := '128 Kbit/s';
  164. 108..116: Abitrate := '128 Kbit/s';
  165. 92..100: Abitrate := '128 Kbit/s';
  166. 60..68: Abitrate := '128 Kbit/s';
  167. Else
  168. Abitrate := FormatFloat('# Kbit/s', TempAbitrate / 1024 * 8);
  169. End;
  170.  
  171.  
  172. Size := TempSize / 1024 / 1024;
  173. Fps := 1000000 / TempMicrosec; // FPS
  174. LengthInSec := TempLengthInFrames / fps; // Length In seconds
  175. Length := FormatFloat('# min', Int(LengthInSec / 60)) + FormatFloat(' # sec',
  176. Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
  177. Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8;
  178.  
  179.  
  180. Memo1.Lines.Add('AVI INFORMATION');
  181. Memo1.lines.Add('Size: ' + FormatFloat('#.## MB',Size));
  182. Memo1.Lines.Add('Length: ' + Length);
  183. Memo1.Lines.Add('');
  184. Memo1.Lines.Add('VIDEO INFORMATION');
  185. Memo1.Lines.Add('Codec: ' + Vcodec);
  186. Memo1.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s', Vbitrate));
  187. Memo1.lines.Add('Width: ' + IntToStr(VWidth) + ' px');
  188. Memo1.lines.Add('Height: ' + IntToStr(VHeight) + ' px');
  189. Memo1.Lines.Add('FPS: ' + FormatFloat('#.##', fps));
  190. Memo1.Lines.Add('');
  191. Memo1.Lines.Add('AUDIO INFORMATION');
  192. Memo1.Lines.Add('Codec: ' + Acodec);
  193. Memo1.Lines.Add('Bitrate: ' + Abitrate);
  194. End;
  195.  
  196. procedure TForm1.Button1Click(Sender: TObject);
  197. begin
  198. If OpenDialog1.Execute Then ReadAviInfo(OpenDialog1.FileName);
  199. End;
  200.  
  201. end.
  202.  
  203.  
  204.  


Ответ отправил: MFred (статус: 1-ый класс)
Время отправки: 15 августа 2006, 15:54

Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Freger!
1. Скорее всего это не получится, т.к. .avi это только оболочка, а сами видеоданные могут быть кодированны разными кодерами и, соответственно для проигрывания нужны декодеры. Чем Вас не устраивает TMediaPlayer?
2. TMediaPlayer.OnNotify вызывается при любых событиях медиаплеера (пауза, остановка и т.д). Пример реакции на окончание воспроизведения см. в приложении.

Приложение:
  1. procedure TForm1.MediaPlayer1Notify(Sender: TObject);
  2. begin
  3. with Sender as TMediaPlayer do
  4. if NotifyValue = nvSuccessful
  5.  
  6. end;


Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 16 августа 2006, 11:43


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 15 августа 2006, 16:21; участников в обсуждении: 1.
Dron

Dron (статус: Студент), 15 августа 2006, 16:21 [#1]:

Могу подсказать, как отловить момент окончания воспроизведения (2), но в TMediaPlayer, что противоречит вопросу (1) :-)
С уважением.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.