Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/24: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
#1

Как зациклить проигрывание музыки(звуки) в TMediaPlayer

28.10.2011, 23:42. Просмотров 4317. Ответов 13
Метки нет (Все метки)

Что прописать или параметр какой выставить, чтобы объет TMediaPlayer после того как открыл файл и выполнил фун-ию Play() проигрывал файл бесконечно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 23:42
Ответы с готовыми решениями:

Как у компонента TMediaPlayer изменить громкость?
Всем доброго времени суток) Я использую компонет TMediaPlayer через нево...

Как зациклить программу?
int x=1.; while (x=1.) { char line; FILE *stream; stream =...

Как зациклить всю программу
Пишу программу, на данном моменте все ок, но не могу понять как зациклить всю...

DirectShow, как зациклить воспроизведение аудио?
В программе проигрывается музыка в фоне: void __fastcall...

Как зациклить загрузку xml файла с сайта
Добрый день сразу к сути в общем пытаюсь подгрузить файл чтоб потом его парсить...

13
LK
Заблокирован
29.10.2011, 00:22 #2
информация к размышлению:
How do I loop an MP3 using the TMediaPlayer component?

You can use the OnNotify event of the TMediaplayer to continue to play the mp3 again after it has stopped playing successfully.

Set AutoRewind = true and put this code on the OnNotify event
Pascal
1
2
3
4
5
6
Loop : Boolean {Global Variable}
 
if MediaPlayer1.NotifyValue = nvSuccessful and Loop=true then begin
MediaPlayer1.Play;
MediaPlayer1.Notify := true;
end;
Some code you would use on a Button,
Pascal
1
2
3
4
5
procedure TForm1.StopButtonClick(Sender: TObject);
Loop := false;
MediaPlayer1.Stop;
MediaPlayer1.Notify := true;
end;
On Play Button Click
Pascal
1
2
3
4
5
procedure TForm1.PlayButtonClick(Sender: TObject);
Loop := true;
MediaPlayer1.Play;
MediaPlayer1.Notify := true;
end;
I get some error saying that the Loop boolean expression is not valid. I think I placed some of the code in the wrong place, but have re-written it several times?

You can try to declare this right after Implementation
Pascal
1
2
var
Loop : Boolean; {Global Variable}
Also you can chage the lines below
Pascal
1
2
3
4
if (MediaPlayer1.NotifyValue = nvSuccessful) and Loop then begin
MediaPlayer1.Play;
MediaPlayer1.Notify := true;
end;
That should be all you can change a bit. Otherwise should work.
с переводом проблем быть не должно.
1
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
29.10.2011, 02:17  [ТС] #3
Спасибки.

Самый простой на мой взгляд способ
C++
1
2
3
4
5
    
//перед проигрыванием 
MediaPlayer1->FileName=char("Data/Menu/Melville");
MediaPlayer1->Play();
MediaPlayer1->Notify=true;//true означает, что после выполнения очередной фун-ии TMediaPlayer , тоесть закончится Play() выполниться функция OnNotify
в Event'ах MediaPlayer
C++
1
2
3
4
void __fastcall TMain::MediaPlayer1Notify(TObject *Sender)
{
        MediaPlayer1->Play();
}
Про то как остановить, я еще не думал)))))

Добавлено через 2 минуты
Ну можно в OnNotify проверять какое нибудь значение bool типо true проигрывать или false соответственно
0
LK
Заблокирован
29.10.2011, 02:59 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void __fastcall TForm2::btOpenClick(TObject *Sender)
{
  TOpenDialog* OpenMediaDialog;
  OpenMediaDialog = new TOpenDialog(this);
  OpenMediaDialog->Filter = "All Video Files (*.avi)|*.avi";
  // There are avi files in
  // C:\Documents and Settings\All Users\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\CoolStuff.
  if (OpenMediaDialog->Execute()) {
    /* Assign a file to the media player. */
    MediaPlayer1->FileName = OpenMediaDialog->FileName;
    /* Check if the file exists and is not a directory .*/
    if ((FileExists(OpenMediaDialog->FileName)) &&
        (!DirectoryExists(OpenMediaDialog->FileName))) {
      /* Open the files. */
      MediaPlayer1->Wait = true;
      MediaPlayer1->Open();
      MediaPlayer1->Play();
      /* Override automatic button controlling. */
      MediaPlayer1->EnabledButtons =
                           TButtonSet() <<
                           TMPBtnType::btPause <<
                           TMPBtnType::btStop <<
                           TMPBtnType::btPlay;
      /* Enable the Stop button. */
      btStop->Enabled = true;
      btOpen->Enabled = false;
    }
  }
  delete OpenMediaDialog;
}
//
void __fastcall TForm2::btStopClick(TObject *Sender)
{
    /* Stop and close the media. */
    MediaPlayer1->Stop();
    MediaPlayer1->Close();
    MediaPlayer1->EnabledButtons = TButtonSet();
    /* Enable the Open button again. */
    btOpen->Enabled = true;
}
// 
__fastcall TForm2::TForm2(TComponent* Owner)
  : TForm(Owner)
{
  /* Disable all the buttons.*/
  MediaPlayer1->AutoEnable = false;
  MediaPlayer1->EnabledButtons = TButtonSet();
}
//
void __fastcall TForm2::MediaPlayer1PostClick(TObject *Sender,
          TMPBtnType Button)
{
  if (Button == TMPBtnType::btStop)
    btStop->Click();
}
Цитата Сообщение от Deimon Посмотреть сообщение
OnNotify проверять какое нибудь значение bool типо true проигрывать или false соответственно
там про это есть:
Pascal
1
Loop : Boolean {Global Variable}
т.е., глобальная переменная
C++
1
bool Loop;
и про "остановить" тоже есть
Pascal
1
2
3
4
5
procedure TForm1.StopButtonClick(Sender: TObject);
Loop := false; // Loop = false;
MediaPlayer1.Stop; // MediaPlayer1->Stop;
MediaPlayer1.Notify := true; // MediaPlayer1->Notify = true;
end;
1
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
29.10.2011, 05:11  [ТС] #5
Цитата Сообщение от LK Посмотреть сообщение
MediaPlayer1.Stop; // MediaPlayer1->Stop;
Стоит добавить, что Stop() в OnNotify нельзя использовать, т.к. виснет (теоритически (и скорее всего) из-за бесконечного цикла)
0
LK
Заблокирован
29.10.2011, 05:24 #6
добавка была бесполезной, учитывая, что сие происходит при событии OnStopButtonClick (см. выше) , а не при OnNotify .

Добавлено через 8 минут
и я думал, что сложности с переводом тех фрагментов быть не должно, видимо, ошибался... сказали бы ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool Loop;
//...
// это в OnNotify , я так понимаю, простите, никогда с MediaPlayer не работал :(
if (MediaPlayer1->NotifyValue==nvSuccessful && Loop==true) {
  MediaPlayer1->Play;
  MediaPlayer1->Notify = true;
}
// Notify Stop Button Click
Loop = false;
MediaPlayer1->Stop;
MediaPlayer1->Notify = true;
// On Play Button Click
Loop = true;
MediaPlayer1->Play;
MediaPlayer1->Notify = true;
//
// You can try to declare this right after Implementation
bool Loop;
// Also you can chage the lines below
if (MediaPlayer1->NotifyValue==nvSuccessful && Loop) {
  MediaPlayer1->Play;
  MediaPlayer1->Notify = true;
}
1
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
29.10.2011, 05:34  [ТС] #7
Цитата Сообщение от LK Посмотреть сообщение
добавка была бесполезной, учитывая, что сие происходит при событии OnStopButtonClick (см. выше) , а не при OnNotify .
Да не... я комментирую для тех кто тему читать будет, чтобы не пробывали.

То что вы мне дали это больше походит на код медиа проигрывателя. Он мне был полезен, спасибо. У меня все простенько, без кнопок, просто фоновая музыка которая время от времени сама меняет композиции. Без кнопок.
0
LK
Заблокирован
29.10.2011, 05:38 #8
то, что в OnNotify и есть без кнопок, а остановить можно при выходе, прописав код из нажатия кнопки Стоп, например, в событие OnCloseQuerry формы, или другое событие согласно логики программы.
0
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
29.10.2011, 05:40  [ТС] #9
А почему везде пишется
C++
1
MediaPlayer1->Notify = true;
?
0
LK
Заблокирован
29.10.2011, 05:57 #10
видимо, потому, что вы имеете намерение "уведомить" проигрыватель о чем-нибудь

TCustomControl.OnNotify

OnNotify Наступает после завершения очередного метода, если свойство Notify было установлено в true. После этого события свойство Notify следует установить в true, если хотеть, чтобы произошло следующее событие OnNotify.

Ниже приведен обработчик события OnNotify медиа-плейера MediaPlayer1, в котором в метке отображается состояние мультимедийного устройства.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "filectrl.hpp"
AnsiString ModeStr[7] = {"Не готово",
"Остановлено","Воспроизведение",
"Запись","Поиск","Пауза","Открыто"};
 
void __fastcall TForm1::MediaPlayer1Notify(
TObject *Sender)
{
  Label1->Caption = "Состояние: " +
  ModeStr[MediaPlayer1->Mode];
  // Переустановка Notify,
  // чтобы событие произошло в следующий раз
  MediaPlayer1->Notify = true;
}
1
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
29.10.2011, 16:24  [ТС] #11
Цитата Сообщение от Цитата с сайта
После возникновения события OnNotify свойство Notify должно быть установлено в True, иначе будущие события OnNotify генерироваться не будут
Как я понял, они хотят сказать что после события OnNotify, переменная Notify будет автоматически выставлена в false.
Но я один раз установил Notify
C++
1
2
3
4
5
6
7
__fastcall TMain::TMain(TComponent* Owner)
    : TForm(Owner)
{
    MediaPlayer1->FileName=char("Data/Menu/Melville");
    MediaPlayer1->Play();
    MediaPlayer1->Notify=true;
}
C++
1
2
3
4
void __fastcall TMain::FormClick(TObject *Sender)
{
    if (start_menu.OnClick(mp.x,mp.y)==13) Close();
}
и музыка повторялась неоднократно. Я Обитель Зла успел посмотреть и музыка продолжала играть (где-то час). Может это в разных ОС Notify так себя ведет или перевод неточный, или логика программы проигрывателя не тчательно проработана.
0
LK
Заблокирован
29.10.2011, 19:22 #12
я нигде там не нашел упоминания об автоматическом установлении в false
Событие OnNotify происходит, когда Notify имеет значение True и вызван какой-либо метод элемента управления мультимедиа.
соответственно, когда Notify имеет значение false, событие OnNotify не происходит .
0
Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 178
29.10.2011, 19:45  [ТС] #13
Цитата Сообщение от LK Посмотреть сообщение
я нигде там не нашел упоминания об автоматическом установлении в false
Я именно так и понял предложение:
"После возникновения события OnNotify свойство Notify должно быть установлено в True, иначе будущие события OnNotify генерироваться не будут"

Там в примере не где не было Notify=false;
0
LK
Заблокирован
29.10.2011, 20:05 #14
более понятной, наверное, была бы запись
C++
1
2
3
4
5
// чтобы событие произошло в следующий раз
if (MediaPlayer1->Notify==true) {
  Label1->Caption = "Состояние: "+
                    ModeStr[MediaPlayer1->Mode];
}
0
29.10.2011, 20:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 20:05

Проблема с TMediaPlayer
проблема в том что TMediaPlayer в с++ Builder 6 не может открыть видео при...

Громкость в TMediaPlayer
Требуется возможность изменения громкости при воспроизведении видео/музыки...

TMediaPlayer и Видео
Доброго времени суток.Поискал по всему Нэту ошибку с которой столкнулся при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru