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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2016, 18:13   #1
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию Авто переключение с трека на трек при воспроизведении

В этой программе всё работает. Но не могу сделать автоматическое переключение на следующий трек при воспроизведении. Может, подскажет кто-нибудь: какой нужен код для этого?

Я пытался делать так (процедура со 154 строчки) - программа компилируется, но переключения на следующий трек не происходит:

Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.MPlayer, Vcl.StdCtrls, Vcl.Menus,
  Vcl.ExtCtrls, Vcl.ComCtrls;
 
type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    Panel1: TPanel;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  SL: TStringList;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.N10Click(Sender: TObject);
begin
MediaPlayer1.Stop;
end;
 
procedure TForm1.N12Click(Sender: TObject);
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
 
procedure TForm1.N13Click(Sender: TObject);
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex-1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
 
procedure TForm1.N17Click(Sender: TObject);
begin
Self.RecreateWnd;
end;
 
procedure TForm1.N3Click(Sender: TObject);
Var
 I: Integer;
begin
 IF OpenDialog1.Execute Then
  Begin
   For I:=0 to OpenDialog1.Files.Count -1 do
    Begin
     SL.Add(OpenDialog1.Files[I]);
     ListBox1.Items.Add(ExtractFileName(OpenDialog1.Files[I]));
     TrackBar1.min:=0;
     TrackBar1.max:=100;
    End;
    End;
end;
 
procedure TForm1.N4Click(Sender: TObject);
begin
SL.Delete(ListBox1.ItemIndex);
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
 
procedure TForm1.N5Click(Sender: TObject);
begin
ListBox1.Clear;
end;
 
procedure TForm1.N7Click(Sender: TObject);
begin
Self.Close;
end;
 
procedure TForm1.N8Click(Sender: TObject);
begin
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
 
procedure TForm1.N9Click(Sender: TObject);
begin
MediaPlayer1.Pause;
end;
 
procedure TForm1.Panel1Click(Sender: TObject);
begin
MediaPlayer1.DisplayRect:=Rect(0,0,600,609);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if mediaplayer1.FileName<>'' then
trackbar1.position:=round(mediaplayer1.position*trackbar1.max/mediaplayer1.length);
end;
 
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
If TrackBar1.Position<>mediaplayer1.Position then
mediaplayer1.position:=round(trackbar1.position*mediaplayer1.length/trackbar1.max);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
SL:=TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SL.Free;
end;
 
procedure TForm1.ListBox1Click(Sender: TObject);
begin
if TrackBar1.Position > 99 then
ListBox1.ItemIndex := ListBox1.ItemIndex + 1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
 
end.
Ednikbod вне форума Ответить с цитированием
Старый 26.06.2016, 23:59   #2
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию Нашёл ответ сам.

Нашёл способ автоматического переключения воспроизведения в проигрывателе с трека на трек. Компонент проигрывателя у меня стандартный, из вкладки "System".

Вот код полностью рабочей программы:


Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.MPlayer, Vcl.StdCtrls, Vcl.Menus,
  Vcl.ExtCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    Panel1: TPanel;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure MediaPlayer1Notify(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SL: TStringList;

implementation

{$R *.dfm}

procedure TForm1.N10Click(Sender: TObject);
begin
MediaPlayer1.Stop;
Self.RecreateWnd;
end;

procedure TForm1.N12Click(Sender: TObject);
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.N13Click(Sender: TObject);
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex-1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.N17Click(Sender: TObject);
begin
Self.RecreateWnd;
end;

procedure TForm1.N3Click(Sender: TObject);
Var
 I: Integer;
begin
 IF OpenDialog1.Execute Then
  Begin
   For I:=0 to OpenDialog1.Files.Count -1 do
    Begin
     SL.Add(OpenDialog1.Files[I]);
     ListBox1.Items.Add(ExtractFileName(OpenDialog1.Files[I]));
     TrackBar1.min:=0;
     TrackBar1.max:=100;
    End;
    End;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
SL.Delete(ListBox1.ItemIndex);
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;

procedure TForm1.N5Click(Sender: TObject);
begin
ListBox1.Clear;
end;

procedure TForm1.N7Click(Sender: TObject);
begin
Self.Close;
end;

procedure TForm1.N8Click(Sender: TObject);
begin
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.N9Click(Sender: TObject);
begin
MediaPlayer1.Pause;
Self.RecreateWnd;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
MediaPlayer1.DisplayRect:=Rect(0,0,600,609);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if mediaplayer1.FileName<>'' then
trackbar1.position:=round(mediaplayer1.position*trackbar1.max/mediaplayer1.length);
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
If TrackBar1.Position<>mediaplayer1.Position then
mediaplayer1.position:=round(trackbar1.position*mediaplayer1.length/trackbar1.max);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SL:=TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SL.Free;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
 with MediaPlayer1 do
 if TrackBar1.Position = 100 then
 ListBox1.ItemIndex := ListBox1.ItemIndex +1;
 MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
 MediaPlayer1.Open;
 MediaPlayer1.Play;
end;

end.
Ednikbod вне форума Ответить с цитированием
Старый 02.07.2016, 12:19   #3
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию Поправки к коду - проигрыватель Media Player.

В вышестоящем коде, при использовании программы, есть всякие недочёты. Вот ниже код, где максимально исправлено то, что можно было исправить. В программе всё работает, но программа эта - только набросок, далёкий ещё от совершенства.

Для автоперехода с трека на трек при воспроизведении я использовал событие OnNotify в стандартном компоненте Media Player.



Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.MPlayer, Vcl.StdCtrls, Vcl.Menus,
  Vcl.ExtCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    MediaPlayer1: TMediaPlayer;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    Panel1: TPanel;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    N14: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure MediaPlayer1Notify(Sender: TObject);
    procedure N14Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SL: TStringList;

implementation

{$R *.dfm}

procedure TForm1.N10Click(Sender: TObject); \\стоп воспроизведения
begin
MediaPlayer1.Stop;
end;

procedure TForm1.N12Click(Sender: TObject); \\кнопка "вперёд"
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.N13Click(Sender: TObject); \\кнопка "назад"
begin
ListBox1.ItemIndex:=ListBox1.ItemIndex-1;
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.N14Click(Sender: TObject); \\очистить видео с дисплея
begin
Self.RecreateWnd;
end;

procedure TForm1.N17Click(Sender: TObject); \\перезагрузить
begin
Self.RecreateWnd;
SL.Clear;
end;

procedure TForm1.N3Click(Sender: TObject); \\открыть файл (файлы)
Var
 I: Integer;
begin
 IF OpenDialog1.Execute Then
  Begin
   For I:=0 to OpenDialog1.Files.Count -1 do
    Begin
     SL.Add(OpenDialog1.Files[I]);
     ListBox1.Items.Add(ExtractFileName(OpenDialog1.Files[I]));
     TrackBar1.min:=0; \\настройка трек бара для отображения шкалы воспроизведения
     TrackBar1.max:=100;
    End;
    End;
end;

procedure TForm1.N4Click(Sender: TObject); \\удалить выбранное с плей-листа
begin
SL.Delete(ListBox1.ItemIndex);
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;

procedure TForm1.N5Click(Sender: TObject); \\очистить плей-лист
begin
ListBox1.Clear;
end;

procedure TForm1.N7Click(Sender: TObject); \\выйти из программы
begin
Self.Close;
end;

procedure TForm1.N8Click(Sender: TObject); \\пуск воспроизведения
begin
MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open;
MediaPlayer1.Play;
end;

procedure TForm1.N9Click(Sender: TObject); \\пауза воспроизведения
begin
MediaPlayer1.Pause;
end;

procedure TForm1.Panel1Click(Sender: TObject); \\дисплей для показа видео
begin
MediaPlayer1.DisplayRect:=Rect(0,0,600,609); \\размеры дисплея
end;

procedure TForm1.Timer1Timer(Sender: TObject); \\таймер воспроизведения
begin
if mediaplayer1.FileName<>'' then
trackbar1.position:=round(mediaplayer1.position*trackbar1.max/mediaplayer1.length);
end;

procedure TForm1.TrackBar1Change(Sender: TObject); \\трек бар воспроизведения
begin
If TrackBar1.Position<>mediaplayer1.Position then
mediaplayer1.position:=round(trackbar1.position*mediaplayer1.length/trackbar1.max);
end;

procedure TForm1.FormCreate(Sender: TObject); \\создание формы
begin
SL:=TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject); \\уничтожение формы
begin
SL.Free;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject); \\автопереход на следующий трек
begin
 with MediaPlayer1 do
 if TrackBar1.Position = 100 then
 begin
 ListBox1.ItemIndex := ListBox1.ItemIndex +1;
 MediaPlayer1.FileName:=SL.Strings[ListBox1.ItemIndex];
 MediaPlayer1.Open;
 MediaPlayer1.Play;
 end
 else
 begin
 ListBox1.ItemIndex := ListBox1.ItemIndex;
 end;
end;

end.
Ednikbod вне форума Ответить с цитированием
Старый 18.10.2016, 10:22   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Забудьте про компонент TMediaPlayer и пользуйтесь DirectShow. Это куда более функционально. С его помощью можно воспроизводить не только видео, но и аудио-файлы тоже.
Переключение трека можно сделать, обработав событие EC_COMPLETE интерфейса IMediaEventEx
Код:

        while pMediaEvent.GetEvent(n, L1, l2, 1) = S_OK do
        begin
          if n = EC_COMPLETE then
          begin
           // тут разрушаем граф, меняем имя файла  и строим новый граф уже с новым трэком
           // или просто останавливаем дискотеку
          end;
          pMediaEvent.FreeEventParams(n, l1, l2); // про это не забываем
        end;

Последний раз редактировалось BLACK_RAIN; 18.10.2016 в 10:36.
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.10.2016, 11:17   #5
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Согласен с BLACK_RAIN, TMediaPlayer -шлак! Писал когда-то плеер на bass.dll, советую.
Replicant вне форума Ответить с цитированием
Старый 18.10.2016, 14:19   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Replicant Посмотреть сообщение
Согласен с BLACK_RAIN, TMediaPlayer -шлак! Писал когда-то плеер на bass.dll, советую.
Я сейчас пишу что-то вроде аналога TMediaPlayer'a, но с расширенным интерфейсом. То есть, можно просто задать имя файла и вызвать метод Play (при этом будет построен минимальный граф), а можно построить граф вручную с какими угодно фильтрами.
У моего плеера есть свой экран, SeekBar, VolumeBar, плейлист.
Это позволяет легко подключать плеер к любому проекту, не переписывая каждый раз интерфейс заново. И читать он будет практически любые видео, в отличии от стандартного TMediaPlayer'а, который, насколько я помню, не открывает даже AVC.
Когда доведу проект до работоспособного состояния, выложу куда-нибудь.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемотка при воспроизведении видео D!zel Общие вопросы Delphi 2 05.03.2013 15:54
Бегущая строка при воспроизведении музыки. munthrekosh Мультимедиа в Delphi 2 19.02.2012 06:46
Бегущая строка при воспроизведении музыки. munthrekosh Общие вопросы Delphi 0 18.02.2012 17:16
Авто-копирование строки вниз при заполнении текущей (или авто-отображение скрытой ниже) bygaga Microsoft Office Excel 6 25.11.2011 14:46
траблы при воспроизведении макроса invester Microsoft Office Excel 0 28.01.2010 21:41