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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 771

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

Уважаемые эксперты, как можно зная только путь к картинки или айви файлу изнать его разрешение (например 800х600) вообще мне надо узнать разрешение swf ролика но я думаю пример с айви сюда подойдёт.

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

Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 20 июля 2007, 10:05
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Матвеев Мефодий Олегович!
Всё как раз на оборот. SWF - это закрытый формат. И ковырять его надо. а с ави - всё просто. в приложении вы найдёте пример, который с ави файла вычитывает много интересной инфы. Не забудьте на форму положить Memo1: TMemo, Button1: TButton, OpenDialog1: TOpenDialog;

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


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 20 июля 2007, 12:02
Оценка за ответ: 5

Комментарий к оценке: А как получить разрешение swf ролика?

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

Всего сообщений: 2; последнее сообщение — 20 июля 2007, 19:06; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 20 июля 2007, 15:33 [#1]:

Сам немного ковырял. но вытянуть удалось только некоторые данные. к тому же, для swf роликов не всегда корректно говорить о длине, так как это как бы программа, а не видео. Тоесть, вы можете нажать на кнопку в каком-то фрейме, и видео будет длинее.
Галочка "подтверждения прочтения" - вселенское зло.
Аксион

Аксион (статус: 4-ый класс), 20 июля 2007, 19:06 [#2]:

Меня не интересует длина, мне надо сколько высота и ширина у ролика, тоесть как у картинки width heigh, МНЕ НАДО ЧТОБЫ РАЗМЕР ФОРМЫ БЫЛ РАВЕН РАЗМЕРУ РОЛИКА.

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

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