Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2009, 18:59   #1
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
Вопрос Как сделать чистотный дисплей в плеер?

сновА всем привет, вот тут у мЕня ещё один вопрос, как вот сделать такую штуку? Я хочу закинуть её в плеер, но не знаю как. В bassplayer нашёл код, который рисует этот график, но не знаю как его включить. я пишу плеер с Tmediaplayer. Вот код который я использую для построения картинки.
Код:
....

procedure TForm1.DisplayFFTBand(Sender: TObject; Bands: TBandOut);
var
   tmpRect, BarRect : TRect;
   j : integer;
begin
 // To prevent flickering, use temporary image buffer and process as follows
 // 1) Draw output image on temporary image buffer.
 // 2) Copy temporary image buffer's image to display canvas

 // Copy BasicBMP's image to GaugeTempBMP(used as temporary image buffer)
   BitBlt(GaugeTempBMP.Canvas.Handle, // handle to destination device context
          GaugeRect.Left,	// x-coordinate of destination rectangle's upper-left corner
          GaugeRect.Top,	// y-coordinate of destination rectangle's upper-left corner
          GaugeTempBMP.Width,	// width of destination rectangle
          GaugeTempBMP.Height,	// height of destination rectangle
          BasicBMP.Canvas.Handle, // handle to source device context
          GaugeRect.Left,	// x-coordinate of source rectangle's upper-left corner
          GaugeRect.Top,	// y-coordinate of source rectangle's upper-left corner
          SRCCOPY);             // Copies the source rectangle directly to the destination rectangle.
 // Substituted Canvas.CopyRect with BitBlt for speed up
 // GaugeTempBMP.Canvas.CopyRect(GaugeRect, BasicBMP.Canvas, GaugeRect);

 // Draw spectrum image to GaugeTempBMP
   for j := 1 to HBlockCount do
   begin
      if Bands[j-1] > VLimit then
         Bands[j-1] := VLimit;

      if Bands[j-1] > 0 then
      begin
     // Copy partial image of DisplayBar to GaugeTempBMP
        BarRect.Left := 0;
        BarRect.Right := BlockWidth;
        BarRect.Top := VLimit - Bands[j-1];
        if BarRect.Top < 0 then
           BarRect.Top := 0;
        BarRect.Bottom := DisplayBar.Height;

        tmpRect.Left := (BlockWidth + HBlockGap) * (j - 1) + 2;
        tmpRect.Right := tmpRect.Left + BlockWidth;
        tmpRect.Top := BarRect.Top;
        tmpRect.Bottom := BarRect.Bottom;

        BitBlt(GaugeTempBMP.Canvas.Handle,
               tmpRect.Left,
               tmpRect.Top,
               BlockWidth,
               tmpRect.Bottom - tmpRect.Top + 1,
               DisplayBar.Canvas.Handle,
               BarRect.Left,
               BarRect.Top,
               SRCCOPY);
      end;

      if Bands[j-1] >= trunc(PeakValue[j]) then
      begin
         PeakValue[j] := Bands[j-1] + 0.01;  // 0.01 : to compensate round off
         PassedCounter[j] := 0;
      end else if Bands[j-1] < trunc(PeakValue[j]) then
      begin
         if trunc(PeakValue[j]) > 0 then
         begin
            with GaugeTempBMP.Canvas do
            begin
            // Draw peak line
               Pen.Color := TColor(RGB(192, 192, 192));   // color for peak line
               MoveTo((BlockWidth + HBlockGap) * (j - 1) + 2, VLimit - trunc(PeakValue[j]));
               LineTo((BlockWidth + HBlockGap) * (j - 1) + 2 + BlockWidth, VLimit - trunc(PeakValue[j]));
            end;

      // Followings are to show simillar spectrum image to WINAMP's
      //  - Put delay time before lowering peak line
      //  - Accerate lowering speed according to the time elapsed
            if PassedCounter[j] >= 8 then
                PeakValue[j] := PeakValue[j] - 0.3 * (PassedCounter[j] - 8);

            if PeakValue[j] < 0 then
               PeakValue[j] := 0
            else
               inc(PassedCounter[j]);
         end;
      end;

   end;

 // Copy GaugeTempBMP's image to GaugePaintBox
   BitBlt(GaugePaintBox.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          GaugeTempBMP.Width,
          GaugeTempBMP.Height,
          GaugeTempBMP.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          SRCCOPY);
end;

procedure TForm1.ShowBackground;
begin
BitBlt(GaugePaintBox.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          BasicBMP.Width,
          BasicBMP.Height,
          BasicBMP.Canvas.Handle,
          GaugeRect.Left,
          GaugeRect.Top,
          SRCCOPY);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BasicBMP.Free;
 GaugeTempBMP.Free;
   DisplayBar.Free;
end;
..........
Как мне подключить это всё к TMediaPlayer. Заранее спасибо
Изображения
Тип файла: jpg млеер.jpg (50.8 Кб, 176 просмотров)

Последний раз редактировалось blackstersl; 03.02.2009 в 19:23.
blackstersl вне форума Ответить с цитированием
Старый 03.02.2009, 18:59   #2
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию

продолжение

Код:
const
// Constants for frequency spectrum visualizzer
   BlockWidth = 3;
   HBlockGap = 1;
   HBlockCount = NumFFTBands;
   VLimit = 24;    // Intensity range : 0 ~ 24
    BackColor = clBlack;

var
  Form1: TForm1;
     SPS : LongInt;    // sample rate
   NowTracking : boolean;
   BasicBMP : TBitMap;
   GaugeTempBMP : TBitMap;
   DisplayBar: TBitmap;
   GaugeRect : TRect;
   EQGains : TEQGains;
   PeakValue : array[1..NumFFTBands] of single;
   PassedCounter : array[1..NumFFTBands] of integer;

    cDir, dir: String;
  min, sec, i, R, G, B: Integer; //время воспроизведения type
.......



procedure TForm1.CreateBasicImage;
var
   i : integer;
   R, G, B: Integer;
begin
   BasicBMP := TBitMap.Create;
   BasicBMP.Width := (BlockWidth + HBlockGap) * HBlockCount - HBlockGap + 3;
   BasicBMP.Height := VLimit + 1;
   GaugePaintBox.Width := BasicBMP.Width;
   GaugePaintBox.Height := BasicBMP.Height;
   GaugeTempBMP := TBitMap.Create;
   GaugeTempBMP.Width := BasicBMP.Width;
   GaugeTempBMP.Height := BasicBMP.Height;
   GaugeRect.Left := 0;
   GaugeRect.Top := 0;
   GaugeRect.Right := BasicBMP.Width;
   GaugeRect.Bottom := BasicBMP.Height;

   with BasicBMP.Canvas do
   begin
      Brush.Color := BackColor;
      Brush.Style := bsSolid;
      FillRect(Rect(0, 0, BasicBMP.Width, BasicBMP.Height));
      Pen.Color := clHighlight;
      Pen.Width := 1;
      pen.Style := psDashDotDot;
      MoveTo(0, 0);
      LineTo(0, BasicBMP.Height);        // Draw Y-axis line
      MoveTo(0, BasicBMP.Height - 1);
      LineTo(BasicBMP.Width, BasicBMP.Height - 1); // Draw X-axis line
   end;

   DisplayBar := TBitmap.Create;
   DisplayBar.PixelFormat := pf32bit;
   DisplayBar.Width := BlockWidth;
   DisplayBar.Height := VLimit;

   R := 255;
   G := 0;
   B := 0;

   for i := 0 to VLimit - 1 do
   begin
     if i > VLimit / 2 then
        Dec(R, Trunc(256 / VLimit))
     else
        Inc(G, Trunc(768 / VLimit));
     if R < 0 then R := 0;
     if G > 255 then G := 255;
     DisplayBar.Canvas.Brush.Color := TColor(RGB(R, G, B));
     DisplayBar.Canvas.FillRect(Rect(0, i, BlockWidth, i + 1));
   end;

end;
blackstersl вне форума Ответить с цитированием
Старый 03.02.2009, 19:09   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Выбираем "ПОИСК", вводим словечко такое умное - "эквалайзер" и получаем кучу ответов. Например:
http://programmersforum.ru/showthrea...E0%E9%E7%E5%F0
http://programmersforum.ru/showthrea...E0%E9%E7%E5%F0
и так далее...
Цитата:
если бы я нашёл что то нужное, я бы не создавал новую тему, а так у меня другой вопрос: Как соеденить этот код с прогой и чтоб при восспроизведении включался этот "эквалайзер".
А просто почитать то, что уже есть? Что вы соедЕнять собираетесь? Или с Фурье вы уже разобрались?

Последний раз редактировалось mihali4; 03.02.2009 в 19:21.
mihali4 вне форума Ответить с цитированием
Старый 03.02.2009, 19:17   #4
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию

если бы я нашёл что то нужное, я бы не создавал новую тему, а так у меня другой вопрос: Как соеденить этот код с прогой и чтоб при восспроизведении включался этот "эквалайзер".
blackstersl вне форума Ответить с цитированием
Старый 04.02.2009, 09:56   #5
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Я помоему говорил что можно использовать набор AudioLab. Вот посмотри пример плейера с эквлайзером и спектром. Написал за минут 10 и обошлось всё это в десятка полтора строк кода
Вложения
Тип файла: zip Player.zip (612.2 Кб, 87 просмотров)
SERG1980 вне форума Ответить с цитированием
Старый 06.02.2009, 11:52   #6
RomanSamara
 
Регистрация: 03.01.2009
Сообщений: 6
По умолчанию

Если ты пишешь плеер на основе bass.dll то там есть пример реализации.
http://www.un4seen.com/
RomanSamara вне форума Ответить с цитированием
Старый 06.02.2009, 15:55   #7
blackstersl
Форумчанин
 
Аватар для blackstersl
 
Регистрация: 23.08.2008
Сообщений: 374
По умолчанию

а если я пишу через TMediaplayer? Возмоджно ли сделать такое??
blackstersl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой Плеер Bigtyoma Софт 3 04.01.2009 19:54
Вывод данныx на дисплей по столбцам Kortes Общие вопросы C/C++ 5 23.12.2008 23:01
плеер blackstersl Общие вопросы Delphi 2 17.09.2008 16:21
MP3-плеер Egych Софт 10 14.01.2008 20:54