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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2017, 05:22   #1
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию Проигрыватель. не работает автоматический переход на следующий трек в плей-листе.

Никто не может подсказать: в чём ошибка кода?
Компилирована программа на "Делфи 7.0". Компонент media player взят из группы system, но процедура для него не создана. Работает плохо, кнопки работают не все. Главная проблема: не работает автоматический переход на следующий трек в плей-листе.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Panel1: TPanel;
    MediaPlayer1: TMediaPlayer;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    TrackBar1: TTrackBar;
    Timer1: TTimer;
    N3: TMenuItem;
    procedure N2Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Z: Integer;
  Strings: TStrings;

implementation

{$R *.dfm}

procedure TForm1.N2Click(Sender: TObject);
begin
OpenDialog1.Execute;
MediaPlayer1.FileName:=OpenDialog1.FileName;
MediaPlayer1.Open;
for z:=0 to OpenDialog1.Files.Count -1 do
Listbox1.Items.Strings[ListBox1.ItemIndex]:= OpenDialog1.Files[z];
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.Timer1Timer(Sender: TObject);
begin
if MediaPlayer1.FileName <>'' then
TrackBar1.Position:= Round(MediaPlayer1.Position*TrackBar1.max/MediaPlayer1.Length);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
 if TrackBar1.Position = 100 then
 ListBox1.ItemIndex:= ListBox1.ItemIndex+1;
 MediaPlayer1.Open;
 MediaPlayer1.Play;
begin
if ListBox1.ItemIndex = ListBox1.Count-1 then
MediaPlayer1.Stop;
end;
end;

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

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

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

Цитата:
Сообщение от Ednikbod Посмотреть сообщение
Главная проблема: не работает автоматический переход на следующий трек в плей-листе.
а где прописан код перехода с трэка на трэк?
что нужно сделать? простой аудиоплеер?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.03.2017, 13:57   #3
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию

Переход с трека на трек у меня сделан вот в этой процедуре:

Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
 if TrackBar1.Position = 100 then
 ListBox1.ItemIndex:= ListBox1.ItemIndex+1;
 MediaPlayer1.Open;
 MediaPlayer1.Play;
begin
if ListBox1.ItemIndex = ListBox1.Count-1 then
MediaPlayer1.Stop;
end;
end;
Сама программа у меня уже сделана по другому, всё в ней работает. Но переход с трека на трек так до сих пор и не могу сделать. Пробовал менять код в компонентах TrackBar и Timer -это помогало, но переставали нормально работать другие функции в программе (например: плавное движение трекбара при воспроизведении). Надо знать код (все его варианты) - а где эту информацию взять, где учиться (если денег на учёбу нет). В интернете этой информации нет, а в учебниках - одна пустая, безконкретная муть.
Ednikbod вне форума Ответить с цитированием
Старый 01.04.2017, 12:04   #4
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Ednikbod Посмотреть сообщение
Переход с трека на трек у меня сделан вот в этой процедуре:
На какой строчке у вас вылазит ошибка?
И зачем нужно это: if TrackBar1.Position = 100 then?
попробуйте сделать
Код:
 MediaPlayer1.Stop;
перед
Код:
 MediaPlayer1.Open;
Что вы пытаетесь играть - аудио или видео?
BLACK_RAIN вне форума Ответить с цитированием
Старый 02.04.2017, 15:09   #5
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию

Программу эту я делаю сейчас в компиляторе "Борланд девелопер студия 2006" (Делфи). Программа эта - проигрыватель для всех медиафайлов - в фильтре открываемых файлов стоит *.* (все файлы, поддерживаемые компонентом TMediaPlayer из вкладки System).

Сейчас эта программа выглядит так (всё в ней работает нормально):
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Panel1: TPanel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    OpenDialog1: TOpenDialog;
    MediaPlayer1: TMediaPlayer;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure Panel1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  I: Integer;

implementation

{$R *.dfm}

procedure TForm1.ListBox1Click(Sender: TObject);
begin
MediaPlayer1.FileName:= ListBox1.Items.Strings[ListBox1.ItemIndex];
end;

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

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

procedure TForm1.N2Click(Sender: TObject);
begin
OpenDialog1.Execute();
begin
for I:= 0 to OpenDialog1.Files.Count - 1 do
begin
MediaPlayer1.FileName:= OpenDialog1.FileName;
MediaPlayer1.Open();
ListBox1.Items.Add(ExtractFileName(OpenDialog1.Files[i]));
TrackBar1.Min:= 0;
TrackBar1.Max:= 100;
end;
end;
end;


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

procedure TForm1.N5Click(Sender: TObject);
begin
MediaPlayer1.Open();
MediaPlayer1.Play();
end;

procedure TForm1.N6Click(Sender: TObject);
begin
MediaPlayer1.Pause();
end;

procedure TForm1.N7Click(Sender: TObject);
begin
MediaPlayer1.Stop();
MediaPlayer1.Position:= 0;
end;

procedure TForm1.N8Click(Sender: TObject);
begin
MediaPlayer1.Step;
MediaPlayer1.Position:= TrackBar1.Position +20000;
MediaPlayer1.Play();
end;

procedure TForm1.N9Click(Sender: TObject);
begin
MediaPlayer1.Back;
MediaPlayer1.Position:= TrackBar1.Position -20000;
MediaPlayer1.Play();
end;

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

procedure TForm1.Panel1DblClick(Sender: TObject);
begin
MediaPlayer1.DisplayRect:= Panel1.ClientRect;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MediaPlayer1.FileName <>'' then
begin
TrackBar1.Max:= MediaPlayer1.Length;
TrackBar1.Position:= MediaPlayer1.Position;
end;
end;

end.
Но не могу сделать автопереключение с трека на трек при воспроизведении. Например, я открываю группу файлов MP3 (скажем, два файла). После нажатия "пуск" начинается проигрывание первого файла. Мне надо: чтобы после окончания первого файла воспроизведение автоматически переключалось на второй файл (и так далее). Ошибка возникает, когда заканчивает играть первый файл: воспроизведение останавливается и автоперехода на второй трек не происходит. Мне нужно, чтобы воспроизведение перескакивало на второй трек, когда ползунок Трекбара доходит до конца (то есть до 100). Переход с трека на трек должен осуществляться в плей-листе. Поэтому я пытался изменять код в этой процедуре:
Код:
procedure TForm1.ListBox1Click(Sender: TObject);
begin
ListBox1.ItemIndex:= ListBox1.ItemIndex+1;
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
Как это сделать - не могу понять. У меня воспроизведение останавливается после завершения первого файла и автоперехода на следующий трек не происходит.
Ednikbod вне форума Ответить с цитированием
Старый 08.04.2017, 20:10   #6
pas2
Пользователь
 
Регистрация: 02.01.2016
Сообщений: 42
По умолчанию

Можно сделать так
Код:
type
  TPlayerMode = (Stop, Play, Paused); // режим воспроизведения
Var Mode: TPlayerMode;
После вызова процедуры воспроизведения
Код:
procedure TForm1.ListBox2DblClick(Sender: TObject);
begin
//выбираем файл из плейлиста при двойном клике для воспроизведения
 i:=ListBox2.Itemindex;
 ListBox1.Itemindex:=i;

 Filename:=ListBox1.Items.Strings[i];
mode:=stop;

 //вызываем процедуру проигрывания файла
 player;
end;

procedure TForm1.Player;
//процедура проигрывания файла
begin
if mode<>paused then begin
//проверяем существует ли файл загружаемый из PlayList
//если файл не существует, то выходим
if ListBox1.ItemIndex = -1 then begin ShowMessage('Файл не существует');exit;end;
//Запускаем процедуру проигрывания
Player1.Play(FileName); mode:=play;
      end;

Последний раз редактировалось Alex11223; 08.04.2017 в 20:16.
pas2 вне форума Ответить с цитированием
Старый 10.04.2017, 11:45   #7
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию

Спасибо за вашу подсказку! Обязательно попробую то, как вы мне говорите.

Но я нашёл самостоятельно: как всё исправить. Сейчас в программе работает всё: и продвиг кадра (вперёд\назад), и переход следующий трек (и на предыдущий) по нажатию кнопки, и автопереход на следующий трек при воспроизведении. Для осуществления последнего обязательно надо использовать событие компонента media player "OnNotify". В процедуре OnNotify обратите внимание на написание кода между IF и THEN - именно в этом была загвоздка! А также правильно должен быть написан код для Timer (таймера).

Вот код теперешней (полностью рабочей) программы. Программа создана в компиляторе "Борланд девелопер студия 2006".
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Panel1: TPanel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    OpenDialog1: TOpenDialog;
    MediaPlayer1: TMediaPlayer;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    Timer1: TTimer;
    TrackBar1: TTrackBar;
    procedure MediaPlayer1Notify(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure Panel1DblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  I: Integer;

implementation

{$R *.dfm}

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

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

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

procedure TForm1.N2Click(Sender: TObject);
begin
OpenDialog1.Execute();
begin
for I:= 0 to OpenDialog1.Files.Count - 1 do
begin
MediaPlayer1.FileName:= OpenDialog1.FileName;
MediaPlayer1.Open();
ListBox1.Items.Add(ExtractFileName(OpenDialog1.Files[i]));
TrackBar1.Min:= 0;
TrackBar1.Max:= 100;
end;
end;
end;


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

procedure TForm1.N5Click(Sender: TObject);
begin
MediaPlayer1.Open();
MediaPlayer1.Play();
end;

procedure TForm1.N6Click(Sender: TObject);
begin
MediaPlayer1.Pause();
end;

procedure TForm1.N7Click(Sender: TObject);
begin
MediaPlayer1.Stop();
MediaPlayer1.Position:= 0;
end;

procedure TForm1.N8Click(Sender: TObject);
begin
MediaPlayer1.Step;
MediaPlayer1.Position:= TrackBar1.Position +20000;
MediaPlayer1.Play();
end;

procedure TForm1.N9Click(Sender: TObject);
begin
MediaPlayer1.Back;
MediaPlayer1.Position:= TrackBar1.Position -20000;
MediaPlayer1.Play();
end;

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

procedure TForm1.Panel1DblClick(Sender: TObject);
begin
MediaPlayer1.DisplayRect:= Panel1.ClientRect;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MediaPlayer1.FileName <>'' then
begin
TrackBar1.Max:= MediaPlayer1.Length;
TrackBar1.Position:= MediaPlayer1.Position;
end;
end;

end.
У меня не удалось только добиться автоостановки воспроизведения после проигрывания последнего трека в списке. Если кто знает: как это сделать - подскажите!

Последний раз редактировалось Ednikbod; 10.04.2017 в 11:48.
Ednikbod вне форума Ответить с цитированием
Старый 10.04.2017, 12:43   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Ednikbod Посмотреть сообщение
У меня не удалось только добиться автоостановки воспроизведения после проигрывания последнего трека в списке. Если кто знает: как это сделать - подскажите!
интересно, какие попытки вы предпринимали?
Код:
procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
if MediaPlayer1.Position = TrackBar1.Max then
begin
  if ListBox1.ItemIndex = ListBox1.Items.count-1 then
  begin
    mediaplayer1.stop;
    showmessage('это был последний файл');
    exit;
  end;
ListBox1.ItemIndex := ListBox1.ItemIndex +1;
MediaPlayer1.FileName:= ListBox1.Items.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open();
MediaPlayer1.Play();
end;
end;
BLACK_RAIN вне форума Ответить с цитированием
Старый 10.04.2017, 22:05   #9
Ednikbod
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 21
По умолчанию

Большое спасибо за подсказку!
Я вариантов испробовал много, но ошибку делал в том, что пытался mediaplayer1.stop писать в конце этой процедуры, а не в начале, как у вас. То есть: писал после
Код:
ListBox1.ItemIndex := ListBox1.ItemIndex +1;
MediaPlayer1.FileName:= ListBox1.Items.Strings[ListBox1.ItemIndex];
MediaPlayer1.Open();
MediaPlayer1.Play();
Логически мне мыслилось: что остановка воспроизведения должна писаться после того, как совершён переход на следующий трек.

Последний раз редактировалось Ednikbod; 10.04.2017 в 22:10.
Ednikbod вне форума Ответить с цитированием
Старый 11.04.2017, 12:08   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Ednikbod Посмотреть сообщение
Логически мне мыслилось: что остановка воспроизведения должна писаться после того, как совершён переход на следующий трек.
Как можно перейти на трек, которого не существует? и зачем?
по-идее, ваш код должен выдавать ошибку List index out of bounds после:
Код:

ListBox1.ItemIndex := ListBox1.ItemIndex +1;
если это был последний файл.
Странно, если этого не происходило.

Последний раз редактировалось BLACK_RAIN; 11.04.2017 в 12:49.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переключение треков в плей-листе по нажатию кнопки "Вперёд" Ednikbod Мультимедиа в Delphi 1 21.06.2016 22:11
Проигрыватель медиа с плей-листом. Ednikbod Мультимедиа в Delphi 3 21.06.2016 10:08
Перенести всю строку на следующий лист 2 при определенному значению ячейки на листе 1 sasha555 Microsoft Office Excel 10 24.03.2016 21:43
автоматический пересчет данных на листе - код peq Microsoft Office Excel 4 15.10.2010 13:17
Про автоматический переход на след. трек KatCH Мультимедиа в Delphi 7 14.03.2010 17:55