Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 48

MP3 Плеер

08.12.2018, 16:49. Показов 5481. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем пишу плеер по учебнику для курсовой работы на билдере 6. Многое не получается, а через неделю надо сдать работу. Помогите реализовать правильную перемотку файла в соответствии с временем песни (чтобы ползунок Трекбара перемещался в соответствии с текущим временем воспроизведения песни и заканчивался тогда, когда время трека подойдёт к концу), также по книге кнопка "Играть" имеет 2 режима: играть и стоп, когда я нажимаю на отдельную кнопку "Паузы" для остановки трека, а затем снова кнопку "Играть" для продолжения проигрывания песни с того момента, на котором остановился, трек начинает играть сначала, а не с того места на котором остановился. Время проигрывания песни (общее и текущее) также коряво отображается. И ещё такая проблема в книге была реализована только возможность добавлять в ЛистБокс целую директорию, я добавил возможность добавления одного или нескольких треков через OpenFileDialog и собственно когда я загружаю песни из разных папок(путей) программа крашится, а если всё из одной папки то всё нормально работает и играет. Помогите очень сильно требуется помощь!
Вот собственно сам код:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <vcl.h>
#include <MPlayer.hpp>
#include "FileCtrl.hpp"
#include  "mmsystem.hpp"
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
TMediaPlayer *MediaPlayer1;
 
AnsiString SoundPath;
int min, sec, msec;
int mode = 0;
 
union TVolume {
    unsigned long Volume;
    struct {
       Word Left;
       Word Right;
       };
       } volume;
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  MediaPlayer1 = new TMediaPlayer (Form1->Handle);
}
 
//---------------------------------------------------------------------------
 void __fastcall TForm1::PlayList (AnsiString path)
 {
 TSearchRec SearchRec;
 ListBox1->Clear();
 if (FindFirst(path + "*.mp3", faAnyFile, SearchRec) != 0) {
 SpeedButton2->Enabled = false;
  SpeedButton4-> Enabled = false;
  Label1->Caption = "";
  return;
  }
  ListBox1->Items->Add(SearchRec.Name);
  while (FindNext (SearchRec) ==0)
  ListBox1->Items->Add(SearchRec.Name);
   ListBox1->ItemIndex = 0;
   Label1->Caption =  ListBox1->Items->Strings[ListBox1->ItemIndex];
   SpeedButton2->Enabled = false;
   if (ListBox1->Count == 1)
   SpeedButton4->Enabled = false;
   else
   SpeedButton4->Enabled = true;
   }
   //-------------------------------------------------------------
 void __fastcall TForm1::Play()
 {
 Label1->Caption = ListBox1->Items->Strings[ListBox1->ItemIndex];
 MediaPlayer1->FileName = SoundPath + ListBox1->Items->Strings[ListBox1->ItemIndex];
 MediaPlayer1->Open();
 MediaPlayer1->Play();
 min = 0;
 sec = 0;
 Timer1->Enabled = true;
 }
 void __fastcall TForm1::Stop()
 {
 MediaPlayer1->Stop();
 Timer1->Enabled = false;
 Label2->Caption = "0:";
 Label3->Caption = "00";
 }
 void __fastcall TForm1::Pause()
 {
 MediaPlayer1->Pause();
 Timer1->Enabled = false;
 }
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
PlayList("");
waveOutGetVolume (0, &volume.Volume);
TrackBar1->Position = - volume.Left;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (sec < 59){
sec++;
if (sec < 10)
 Label3->Caption = "0" + IntToStr(sec);
 else
 Label3->Caption = IntToStr(sec);
 } else{
 sec = 0;
 min++;
 Label2->Caption = IntToStr(min) + ":";
 Label3->Caption = "00";
 }
 if (MediaPlayer1->Position < MediaPlayer1->Length)
 return;
 Stop();
 if (ListBox1->ItemIndex < ListBox1->Count - 1)
 {
 ListBox1->ItemIndex += 1;
 Play();
 if (ListBox1->ItemIndex == ListBox1->Count - 1)
 SpeedButton4->Enabled = false;
 } else {
 mode = 0;
 }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
 if (mode == 1)
 Stop();
ListBox1->ItemIndex -= 1;
Label1->Caption = ListBox1->Items->Strings[ListBox1->ItemIndex];
 
if (!SpeedButton4->Enabled)
SpeedButton4->Enabled = true;
 if (ListBox1->ItemIndex == 0)
SpeedButton2->Enabled = false;
if (mode == 1)
Play();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
if (MediaPlayer1->Mode == 2) {
Stop();
Play();
msec = MediaPlayer1->Length;
min = msec / 60000;
sec =(msec / 1000) % 60;
Label4->Caption = IntToStr(min)+':'+IntToStr(sec);
}
if (ListBox1->ItemIndex == 0)
SpeedButton2->Enabled = false;
else
SpeedButton2->Enabled = true;
if ( ListBox1->ItemIndex == ListBox1->Count - 1)
SpeedButton4->Enabled = false;
else
 SpeedButton4->Enabled = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
if ( mode == 1)
{
Stop();
mode = 0;
}
else {
Play();
mode = 1;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
if (mode == 1)
Stop();
ListBox1->ItemIndex += 1;
Label1->Caption = ListBox1->Items->Strings[ListBox1->ItemIndex];
if (ListBox1->ItemIndex == ListBox1->Count - 1)
SpeedButton4->Enabled = false;
if (!SpeedButton2->Enabled)
SpeedButton2->Enabled = true;
if (mode == 1)
Play();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
volume.Left = - TrackBar1->Position;
volume.Right = - TrackBar1->Position;
waveOutSetVolume(0, volume.Volume);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
AnsiString dir;
if (SelectDirectory("Выберите каталог", "", dir))
{
if (mode == 1)
{
Stop();
mode = 0;
}
SoundPath = dir + "\\";
PlayList(SoundPath);
}
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
MediaPlayer1->Stop();
MediaPlayer1->Position = MediaPlayer1->Length * TrackBar2->Position / TrackBar2->Max;
MediaPlayer1->Play();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::N2Click(TObject *Sender)
{
if (OpenDialog1->Execute()) {
  for (int i = 0; i<OpenDialog1->Files->Count; i++) {
    ListBox1->Items->Add(ExtractFileName(OpenDialog1->Files->Strings[i]));
  }
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
if (ListBox1->ItemIndex != -1)
        ListBox1->Items->Delete(ListBox1->ItemIndex);
else
        ShowMessage("Выберите элемент");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SpeedButton6Click(TObject *Sender)
{
Pause();
mode = 0;
}
//---------------------------------------------------------------------------
Сам проект:
123.rar
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2018, 16:49
Ответы с готовыми решениями:

Как определить длительность Mp3 файла. MP3 плеер на библиотеке BASS 2.4
В процессе поиска ответов я наткнулся на эту тему https://www.cyberforum.ru/delphi-beginners/thread83454.html Судя по всему, создателю...

MP3-плеер
В свое время увлекся программированием, но по специальности программистом не являюсь.Недавно начал работу над MP3-плеером.Я решил сделать...

mp3 плеер
собственно при попытке запуска мп3 файла вылезает ошибка Не удается загрузить DLL &quot;winnm.dll&quot; знакомый сказал что проблема в...

11
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
09.12.2018, 16:04
Если песня на паузе, то для продолжения воспроизведения попробуй сделать еще раз
C++
1
MediaPlayer->Pause();
А вообще на форуме много нужных тебе тем, например:
Плеер: как реализовать полосу прокрутки?
Плеер на Builder-е
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 48
09.12.2018, 18:50  [ТС]
Да, спасибо, я и сам сделал это (я про паузу), трекбар заменил скроллбаром и совместил его с таймером, теперь всё нормально отсчитывает и перематывает. Единственная проблема (и главная) так и осталась, а именно с крашем программы при попытке загрузить в листбокс треки из разных путей. В исходнике была только возможность добавления целого каталога с песнями в листбокс. Я же добавил возможность с помощью openfiledialog и меню добавление 1 или нескольких треков. Так получается что вся программа была построена именно на загрузке 1 каталога со всеми песнями (только 1 путь) и как исправить это, чтобы загружались любые песни откуда захочется в листбокс и проигрывались без ошибок я не знаю
Именно с этим нужна помощь!
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 48
10.12.2018, 14:55  [ТС]
Я понял в чём причина, при загрузке новых песен из 1 папки, если уже в плейлисте были песни из 2 папки, путь к песням становится путём к песням из папки №1 (т.е. старый путь к песням из 2 папки пропадает), и получается каждый раз МедиаПлеер пытается проиграть песню с несуществующим путём.
Как мне запоминать путь для каждой песни? ( SoundPath )
Если выводить в плейлист полный путь песни, то тогда всё нормально работает, но это не красиво. Нужно чтобы только были имена треков и разрешение в листбоксе.
0
61 / 50 / 12
Регистрация: 25.01.2010
Сообщений: 257
11.12.2018, 17:48
Лучший ответ Сообщение было отмечено AlienZz как решение

Решение

Цитата Сообщение от AlienZz Посмотреть сообщение
Как мне запоминать путь для каждой песни? ( SoundPath )
Если выводить в плейлист полный путь песни, то тогда всё нормально работает, но это не красиво. Нужно чтобы только были имена треков и разрешение в листбоксе.
Сохранить в StringList полное имя а в ListBox выводить только имя файла и воспроизводить StringList->Strings[ListBox->ItemIndex]. Надеюсь идея понятна. Можно использовать вместо ListBox ListView и путь к файлу помещать в скрытую колонку.
1
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 48
12.12.2018, 00:24  [ТС]
Да! Спасибо большое, всё прекрасно работает!

Добавлено через 1 час 18 минут
У меня есть последний вопрос, не хочу создавать отдельную тему для этого. Как мне теперь сохранить мой плейлист в файл и загрузить его в ListBox. При сохранении получается, что я сохраняю в файл плейлист с полными путями песен. И когда я загружаю плейлист в ListBox'е отображаются полные пути песен. Опять надо чтобы в ListBox были одни имена, а пути были отдельно допустим в StringList.

Добавлено через 1 час 59 минут
Update: Сделал сохранение плейлиста и загрузку через 2 OpenFileDialog'a и SaveFileDialoga'a : сначала сохраняется/загружается путь (StringList), потом сохраняется/загружается название (ListBox->Items). Неудобно конечно, но работает.
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
12.12.2018, 04:47
Цитата Сообщение от AlienZz Посмотреть сообщение
Сделал сохранение плейлиста и загрузку через 2 OpenFileDialog'a и SaveFileDialoga'a

Не по теме:

Хм-м-м... Пан знает толк в извращениях...


Зачем Вам вообще сохранять содержимое ListBox? У Вас есть СтрингЛист с полными путями - этого вполне достаточно... Сохраняйте только его...
Цитата Сообщение от AlienZz Посмотреть сообщение
Опять надо чтобы в ListBox были одни имена, а пути были отдельно допустим в StringList
C++
1
2
3
4
5
6
7
8
9
10
11
12
TStringList *sPList = new(TStringList);
...
//Загрузка плэйлиста из файла при помощи OpenDialog
if(!OpenDialog1->Execute()) return;
sPList->LoadFromFile(OpenDialog1->FileName);
for(int i = 0; i < sPList->Count; i++)
 ListBox1->Items->Add(ExtractFileName(sPList->Strings[i]));
...
//Добавление в плэйлист при помощи OpenDialog
if(!OpenDialog1->Execute()) return;
sPList->Add(OpenDialog1->FileName);
ListBox1->Items->Add(ExtractFileName(OpenDialog1->FileName));
P.S. Писал прямо тут, в теме, могут быть опечатки - проверяйте
P.P.S. Вы не указали свою версию Билдера, поэтому просто замечу, что в RAD Studio поиск файлов по маске *.mp3, хоть простой, хоть рекурсивный, делается НАМНОГО проще, чем у Вас...
1
61 / 50 / 12
Регистрация: 25.01.2010
Сообщений: 257
12.12.2018, 12:57
Цитата Сообщение от D1973 Посмотреть сообщение
в RAD Studio поиск файлов по маске *.mp3, хоть простой, хоть рекурсивный, делается НАМНОГО проще
А можно поподробнее, пожалуйста?
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
12.12.2018, 14:30
C++
1
2
3
#include <System.IOUtils.hpp>
...
TStringDynArray A = TDirectory::GetFiles("C:\\DIR", "*.mp3", TSearchOption::soAllDirectories);
Вот собственно и все: в строковый массив A записаны полные, с путями, имена файлов по маске *.mp3 из каталога C:\DIR и всех его подкаталогов

Добавлено через 7 минут
Так же, пользуясь функциями этого модуля, можно без лишних выкрутасов, добавить в ListBox имена файлов не только без путей, но и без расширений, например:
C++
1
ListBox1->Items->Add(TPath::GetFileNameWithoutExtension(OpenDialog1->FileName));
2
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 48
12.12.2018, 15:53  [ТС]
D1973
Извините, вы не подскажите как реализовать ваш код (сохранение и загрузку) с помощью отдельного класса и затем работать с ним.
C++
1
2
3
4
5
6
7
8
9
10
11
12
TStringList *sPList = new(TStringList);
...
//Загрузка плэйлиста из файла при помощи OpenDialog
if(!OpenDialog1->Execute()) return;
sPList->LoadFromFile(OpenDialog1->FileName);
for(int i = 0; i < sPList->Count; i++)
 ListBox1->Items->Add(ExtractFileName(sPList->Strings[i]));
...
//Добавление в плэйлист при помощи OpenDialog
if(!OpenDialog1->Execute()) return;
sPList->Add(OpenDialog1->FileName);
ListBox1->Items->Add(ExtractFileName(OpenDialog1->FileName));
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,354
Записей в блоге: 3
12.12.2018, 16:11
Цитата Сообщение от AlienZz Посмотреть сообщение
код (сохранение и загрузку) с помощью отдельного класса
Честно говоря, я не совсем понимаю, зачем это надо... Ваш плэйлист - и так, по сути экземпляр класса TStringList, там свои методы есть сохранения и загрузки...
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 48
12.12.2018, 16:13  [ТС]
D1973
Просто мне необходимо написать свой класс, выполняющий определённую задачу и вот я думаю сохранение и загрузка плейлистов как раз подходят для этого. По заданию я должен создать класс, вот и прошу помочь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2018, 16:13
Помогаю со студенческими работами здесь

MP3 плеер
Здравствуйте. Хочу написать плеер. Нашел кучу библиотек, но во всех чего-то не хватает. Нужно всего лишь старт, пауза, стоп, перемотка,...

Mp3 плеер
Здравствуйте кодеры) Ситуация в следующем: написал плеер, работает нормально, но есть один баг. Сделал так что по двойному щелчку на мп3...

MP3 плеер
Ребят вот есть такая штучка, nexx nf - 355! пишет при подключении в состоянии устройства вот такую ошибку Это устройство было остановлено,...

mp3 плеер
Подскажите, пожалуйста, хороший плеер для mp3!

MP3 плеер
Всем привет, необходимо сделать MP3 плеер. Чтобы было переключение треков по списку, после окончания каждого трека, и была возможность...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru