Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/47: Рейтинг темы: голосов - 47, средняя оценка - 4.94
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35

MP3 плеер. Переключение треков по списку.

04.01.2010, 17:31. Показов 9575. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. Надо сделать расчетку, делфи мы учили пар 5-6 от силы, смесь гремучая, и стипендию получать надо.)
Нашел в интернете туториал, на простенький медиаплеер. Там предлагают пользоваться TMediaPlayer. С горем пополам я сделал по туториалу плеер, но мне он кажеться сильно простеньким, поетому я хотел бы добавить что-то для "весу".
Покачто со всеми проблемами разбирался, но тут столкнулся с такой проблемой:
Я решил прикрутить переключение треков в плейлисте (ЛистБокс). Мне удалось ето сделать, но только с кнопкой btStop. Вот как я ето делаю (немного модифицированый код запуска на проигрывание файла):
Delphi
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
procedure TForm1.PlayaClick(Sender: TObject; Button: TMPBtnType;
  var DoDefault: Boolean);
   var mp3File: string;
begin
if button=btStop then 
begin
 if ListBox1.Items.Count=0 then exit;
  if ListBox1.ItemIndex+1=ListBox1.Items.count then  {проверяет, не заканчиваеться ли список}
  begin
  ListBox1.ItemIndex:=0-1;
  end;
  mp3File := Concat(StaticText1.Caption, ListBox1.Items.Strings[ListBox1.ItemIndex+1]);
  ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
 
  if not FileExists(mp3File) then begin
   ShowMessage('Ôàéë '+#13#10+ mp3File +#13#10+' íå ñóùåñòâóåò!');
   exit;
  end;
  FillID3TagInformation(mp3File, Title, Artist, Album);      {в оригинале отправляло теги файла  в едиты, но я отправляю их в лейблы}
  Progress.Max:=0;
  playa.Close;
  playa.FileName:=mp3File;
  playa.Open;
  Progress.Max := playa.Length;       {нужно для прогресс бара}
  end;
end;
Собственно в чем проблема:
если написать if button=btStop в событии MediaPlayerClick, то можно прикрутить какое-нибудь действие (я так сделал нормальнцю остановку трека), а вот если написать if button=btNext\btPrev оно думает, что ети переменные типа TUDBtnType, т.к. они где-то там используються при переключении каких-то стрелок. (Как я вычитал в хелпе делфи.)
И естественно выдает такое:
Unit1.pas(201): Incompatible types: 'TMPBtnType' and 'TUDBtnType'.
Как от такой штуки избавиться? Мне надо, что бы при событии ОнКлик оно брало не btNext:TUDBtnType, а btNext:TMPBtnType.

Прошу совета у людей знающих. Если сильно безграмотная программа - прошу не пинать, т.к. знаний моих увы мало.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.01.2010, 17:31
Ответы с готовыми решениями:

Переключение треков в MediaPlayer-е
Привет всем. У меня такая проблема есть 2 mp3 файла как сделать так чтобы после окончания первой сразу начинала играть вторая вот код: ...

Музыкальный плеер с под загрузкой треков
Как реализовать скрипт под загрузки треков в плеер музыки после нажатия на ссылку из плейлиста без перегрузки страницы? Я не знаю JS, но...

Ускоренное проигрывание mp3 треков
Добре, njdfhboxb. Недавно, приятель установил мне заново wXP? всё вроде ничего, но вот большинство mp3 проигрываются немного в ускоренном...

22
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
04.01.2010, 20:33
Воспльзуйтесь компонентом TBassPlayer! Он написан с использованием библиотеки BASS, и гараздо удобнее!
А вопрос по поводу перехода на следующий Itemindex в Листбоксе решается так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Next: Tbutton;
List:Tlistbox;
Bass:Tbassplayer;
 
Procedure NextClick(..);
Var
Playing:integer;
begin
if 
if List.itemindex < 0 then exit;
if List.itemindex >= 0 then begin
Playing:=List.itemindex+1;
bass.open(list.items.strings[playing]);
bass.play;
Примерно, как то так!
код из головы писал!
1
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
04.01.2010, 20:48  [ТС]
Спасибо большое!
Я уже немного нахимичил, вроде работатет, буду задавать еще вопросы, т.к. работа не закончена.
А на счет TBassPlayer, то я его видел, но т.к. знаний вообще 0, а времени изначально было несколько дней (нас очень обрадовали сдачей расчетки до нг), я решил делать по туториалу, т.к. там все поетапно было расписано.
Но потом оказалось, что можно сдавать и после нг, вот я и решил усовершенствовать программу. Боюсь не потяну бассплеер.(
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
04.01.2010, 21:22
Уважаемый я вас уверяю там всё очень легко, напишу вам и поясню основные комманды:
Code
1
2
Bassplayer1.open() - открывает аудио поток!
Bassplayer1.play - пишем после открытия, чтобы поток проиграть!
Code
1
Bassplayer1.pause(true or false) - пауза
Code
1
2
3
4
Bassplayer1.Mode - проверяет :
Проигрывание - PlmPlaying;
Пауза - PlmPaused;
Стоп - PlmStopped;
Code
1
Bassplayer1.Position - позиция проигрываемого файла;
Code
1
Bassplayer1.PlayLength - проигрывание закончено
Напишу вам простенький пример:

Code
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
[B]File:TOpendialog;
Open:Tbutton;
Play:Tbutton;
Pause:Tbutton;
AutoNext:Ttimer;
List:Tlistbox;
Bass:TBassPlayer;[/B]
 
[B]procedure OpenClick(...);
var
i : integer;[/B]
begin
if file.execute then
list.items.add(file.filename);
end;
 
[B]procedure Playclick (...);
begin[/B]
if list.itemindex <> -1 then 
Bass.open(list.items.strings[list.itemindex]);
bass.play;
AutoNext.enabled:=true;
end;
 
[B]procedure PauseClick (...);
begin[/B]
if bass.mode = PlmPlaying
bass.pause(true);
end else begin
bass.pause(false);
end;
end.

Написал всё по памяти но уверен вы разберётесь!
Удачи!!!
1
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
05.01.2010, 14:33  [ТС]
Спасибо большое, возьму себе на заметку!
0
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
07.01.2010, 16:12  [ТС]
Прошу прощения за даблпост, но по правилам у меня нет возможности редактировать верхний пост.
Я, всетаки, решил продолжить работу с TMediaPlayer, т.к. начал в нем разбираться, да и перескакивать на что-то новое особо времени нет. Реализовал практически все, что хотел.
Но осталась единственная проблема:
В туториале было описано процедуру (procedure ChangeID3Tag)которая позволяет изменять теги мп3 файла. Там она нигде не использовалась, был толкьо сам текст и предлогалось добавить ее применение самому. В свой плеер я решил добавить ету функцию на отдельную форму. У меня все вышло - но проблема в том, что программа не отсылает теги, а портит их. В винампе потом теги (ID3v1) оказуються выключены.
Сами теги в программе представлены так:
Delphi
1
2
3
4
5
6
TID3Rec = packed record
    Tag     : array[0..2] of Char;
    Title,
    Artist,
    Album   : array[0..29] of Char;
  end;
Вот текст процедуры из туториала:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure ChangeID3Tag(NewID3: TID3Rec; mp3FileName: string);
var
  fMP3: file of Byte;
  OldID3 : TID3Rec;
begin
  try
    AssignFile(fMP3, mp3FileName);
    Reset(fMP3);
    try
      Seek(fMP3, FileSize(fMP3) - 128);
      BlockRead(fMP3, OldID3, SizeOf(OldID3));
      if OldID3.Tag = 'TAG' then
        { Replace old tag }
        Seek(fMP3, FileSize(fMP3) - 128)
      else
        { Append tag to file because it doesn't exist }
        Seek(fMP3, FileSize(fMP3));
      BlockWrite(fMP3, NewID3, SizeOf(NewID3));
    finally
    end;
  finally
    CloseFile(fMP3);
  end;
end;
А вот текст который вышел у меня:

Delphi
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
procedure TForm3.BitBtn1Click(Sender: TObject);
var
  {fMP3: file of Byte;  } 
  OldID3 : TID3Rec;
  mp3FileName:string;
  fmp3: TFileStream;  // я решил воспользоваться потоками, но результат ето не изменило.
begin
for i:= 0 to length(Artist.Text) do NewID3.Artist[i]:=Artist.Text[i];   //здесь я заполняю новые теги, что бы потом отправить их вместо старых
for j:= 0 to length(Album.Text) do NewID3.Album[j]:=Album.Text[j];
for k:= 0 to length(Title.Text) do NewID3.Title[k]:=Title.Text[k];
label2.Caption:='p='+p+'Artist='+NewID3.Artist[1]+'r='+inttostr(r);
mp3FileName:=Concat(StaticText1.Caption, ListBox1.Items.Strings[ListBox1.ItemIndex]);
Label1.Caption:=mp3FileName;
try
 fmp3:=TFileStream.Create(mp3FileName, fmOpenReadWrite);
 try
  fmp3.position:=fmp3.size-128;
  fmp3.Read(OldID3,SizeOf(OldID3));
 
  if OldID3.Tag = 'TAG' then
   fmp3.position:=fmp3.size-128
  else fmp3.position:=fmp3.size;
  fmp3.Write(NewID3,SizeOf(OldID3));
  finally
  end;
  finally
  fmp3.Free;
 
{try                         //Все через АссигнФайл
    AssignFile(fMP3, mp3FileName);
    Reset(fMP3);
    try
      Seek(fMP3, FileSize(fMP3) - 128);
      BlockRead(fMP3, OldID3, SizeOf(OldID3));
      if OldID3.Tag = 'TAG' then
 
        Seek(fMP3, FileSize(fMP3) - 128)
      else
 
        Seek(fMP3, FileSize(fMP3));
      BlockWrite(fMP3, NewID3, SizeOf(NewID3));
    finally
    end;
  finally
    CloseFile(fMP3);
  end; }
 end;
end;
Вобщем я не знаю - либо ошибка еще на етапе заполнения новых тегов (хотя я експерементальным путем я понял, что они всетаки заполняються), либо я из-за не знания я правлю файл не там где надо.
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
08.01.2010, 18:29
Подключите в uses - id3v2
Delphi
1
2
uses
[COLOR="Red"]ID3V2[/COLOR];
Delphi
1
2
var
  Tags:TID3V2;

Delphi
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
Tags:=TID3V2.Create;
end;
далее пишем функцию:

Delphi
1
2
3
 public
    { Public declarations }
    function Tags_for_File(filename:string):string;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function TForm1.Tags_for_File(filename: string): string;
begin
if fileexists(filename) then begin Tags.ReadFromFile(Filename);
           if  (Tags.Artist='') and (Tags.Album='') then
           result:= '['+extractfilename(changefileext(filename, ''))+']:|:[Unknown Album' +']';
           if  (Tags.Artist<>'') and (Tags.Album='') then
           result:= '['+Tags.Artist + ']:|:[Unknown Album]';
           if  (Tags.Artist='') and (Tags.Album<>'') then
           result:= '['+extractfilename(changefileext(filename, ''))+ ']:|:[' + Tags.Album+']';
           if  (Tags.Artist<>'') and (Tags.Album<>'') then
           result:= '['+Tags.Artist +']:|:['+Tags.Album+']';
 
 
end;


чтобы использовать данную функцию, я делаю так:
1. создаём процедуру:

Delphi
1
2
3
 public
    { Public declarations }
    procedure PaintImage(List: TListBox; Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
вот сама процедура:


Delphi
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
procedure TForm1.PaintImage(List: TListBox;
  Control: TWinControl; Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
  const W = 5;
      H = 14;
var BMPRect: TRect;
begin
with List.canvas do
begin
if (State = [odFocused, odSelected]) or (State = [odSelected]) then
begin
    FillRect(Rect);
    BagsList.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic);
    BMPRect := Bounds(Rect.Left, Rect.Top, W, H);
Font.Color := clBlue;
Font.Size := 9;
Brush.Style := bsClear;
SetBkMode(Handle, TRANSPARENT);
TextOut(Rect.Left + W + 2, Rect.Top, IntToStr(Index + 1) + '. ' +  Tags_for_File(List.Items[index]));
end
else if PlayedItem = Index then //IDPlay 
begin
    FillRect(Rect);
    BagsList.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic);
    BMPRect := Bounds(Rect.Left, Rect.Top, W, H);
Font.Color := clYellow;
Font.Size := 9;
Brush.Style := bsClear;
Pen.Color := $001A1A1A;
SetBkMode(list.Handle, TRANSPARENT);
Rectangle(Rect);
TextOut(Rect.Left + W + 2, Rect.Top, IntToStr(Index + 1) + '. '+Tags_for_File(List.Items[index]));
end
else
begin
    FillRect(Rect);
    BagsList.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic);
    BMPRect := Bounds(Rect.Left, Rect.Top, W, H);
Font.Color := clGray;
Brush.Style := bsClear;
Font.Size := 9;
SetBkMode(list.Handle, TRANSPARENT);
TextOut(Rect.Left + W + 2, Rect.Top, IntToStr(Index + 1) + '. '+Tags_for_File(List.Items[index]));
end;
end;
в данной процедуре мы рисуем картинку в начале итеминдекса и сразу мы выводим тэг для файла в этот же итеминдекс, но полный путь остаётся в итеминдексе

Используем данную процедуру вот так:

Delphi
1
2
3
4
5
procedure TForm1.Listbox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
PaintImage(Listbox1,Control,Index,Rect,State);
end;
пользуйся всё работает!!!
в листбоксе свойство
style = lbOwnerDrawFixed;
Вложения
Тип файла: rar ID3v2.rar (13.1 Кб, 164 просмотров)
1
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
09.01.2010, 16:44  [ТС]
Ого, спасибо конечно, но если честно, сложноватая программа. И я так и не разобрался в тексте, где именно я буду редактировать теги?
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
10.01.2010, 00:11
ID3V2 - как раз таки и вытаскивает тэги из фалов!
вот пример наклепал надеюсь разберётесь!
Прокомментировал в проекте самое главное!
Песни переключать на DBlClick в Листбоксе!
Вложения
Тип файла: rar TagPrimers.rar (23.7 Кб, 198 просмотров)
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
10.01.2010, 00:25
blinds извините немного не допонял ваш 6 пост но уверен этот пример вам тоже поможет!
На счёт шестого поста постараюсь завтра выложить пример!
0
4 / 4 / 1
Регистрация: 22.02.2009
Сообщений: 35
10.01.2010, 20:37  [ТС]
Не стоит напрягаться из-за меня, и так большое спосибо! Темболее, что мне уже завтра здаваться с работой надо!)
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 7
10.01.2010, 20:43
Цитата Сообщение от Ferz-2009 Посмотреть сообщение
blinds извините немного не допонял ваш 6 пост но уверен этот пример вам тоже поможет!
На счёт шестого поста постараюсь завтра выложить пример!
Вижу ты експерт в вопросе проигрывателя звуков. Стандартный компонент очень не удобный - если допустим удалить музыкальный файл (или путь некоректный задан) - программа даже не запустится. Будильник делаю, в сети нет нормального даже платного.
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
11.01.2010, 17:42
Increazon вот кое что сделал! но конечно требуются доработки!
Да кстати: Вам придётся таскать bass.dll в папке!
архив прилагаю там mp3 файл! поэтому архив так много весит!
Вложения
Тип файла: rar Budilnik.rar (5.22 Мб, 110 просмотров)
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 7
11.01.2010, 19:49
PHP
1
А где *.exe файл?
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
11.01.2010, 20:07
А скомпилировать проэкт?
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 7
11.01.2010, 21:04
Цитата Сообщение от Ferz-2009 Посмотреть сообщение
А скомпилировать проэкт?
Шутка!


0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
11.01.2010, 21:30
с EXE*шником!
Вложения
Тип файла: rar Budilnik.rar (5.42 Мб, 80 просмотров)
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 7
11.01.2010, 21:43
Вот что в выполняемой программе http://gunsmoker.blogspot.com/... elphi.html
0
 Аватар для Ferz-2009
23 / 23 / 2
Регистрация: 26.12.2009
Сообщений: 51
11.01.2010, 21:54
Я предполагал что у меня индюк поэтому и не хотел компилить
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 7
12.01.2010, 01:24
Цитата Сообщение от Ferz-2009 Посмотреть сообщение
с EXE*шником!
Я могу быть уверен что она не запустилась бы на компюторе где не установлен делфи так как в свойствах компилятора ты не выключил отладочную информацию

Вот твоя программа без вируса, может кто интересуется пусть посмотрит
Вложения
Тип файла: 7z Budilnik_to_sent.7z (3.37 Мб, 45 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2010, 01:24
Помогаю со студенческими работами здесь

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

Переключение аудио и видео треков, Находясь в другой программе
В общем, прога чисто для моего пользования и полезная для меня вполне очень. Использую простой медиа плеир. Суть программы: находясь в...

Как настроить плеер для проигрывания треков со своего сайта
Здравствуйте, подскажите можно ли настроить плеер podfm на свой собственный сайт, чтобы воспроизводились mp3 файлы размещенные на...

Создать класс "Плеер", с помощью которого можно управлять списком треков
Создать класс Плеер, с помощью которого можно управлять списком треков (создать класс Трек за полями: Название трека, продолжительность)....

Переключение треков в плей-листе по нажатию кнопки "Вперёд"
Есть программа - проигрыватель медиа. Мучаюсь, не могу сделать, чтоб поочерёдно переключалось проигрывание всех треков вперёд (с одного на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru