Пятница, 19.04.2024, 01:59
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
Как работать с плейлистом в delphi на библиотеке BASS.DLL?
Filo$oFДата: Среда, 30.05.2012, 22:20 | Сообщение # 46
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
Я так и делаю теперь, а если оставить Channel, то плейлист начинает сума сходить smile
Но всё ровно 99.
Code

function TForm_player.KhzToStr: string;
  var
  H: Extended;
  bi: BASS_CHANNELINFO;
  Channel1:DWORD;
  begin
  BASS_StreamFree(Channel1);
  //пытаемся загрузить файл и получить дескриптор канала
  Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
  BASS_ChannelGetInfo(Channel1, bi);
  H := bi.freq / 1000;
  Result := IntToStr(Round(H)) + ' KHz';
   BASS_StreamFree(Channel1);
  end;
 
xaramamburuДата: Среда, 30.05.2012, 22:42 | Сообщение # 47
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Вот кусок моей процедуры:

Пишем сразу после раздела uses перед type:
Code
type
TTag = record
    len: string;
    Title: string;
    freq: string;
end;


Это в разделе Type описания компонентов формы:
Code
function Tagi(filename1:string):Ttag;


Это сама процедура:
Code
function Tform2.Tagi(filename1:string):Ttag;
var
Channel1    : DWORD;
H: Extended;
bi: BASS_CHANNELINFO;

begin
//освобаждаем канал
BASS_StreamFree(Channel1);
//пытаемся загрузить файл и получить дескриптор канала
Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
//получаем время воспроизведения
Tagi.len:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE))/(24*3600));
Tagi.Title:=ChannelGetTagTitle(Channel1);
BASS_ChannelGetInfo(Channel1, bi);
H := bi.freq / 1000;
Tagi.freq := IntToStr(Round(H)) + ' KHz';
//освобаждаем канал
BASS_StreamFree(Channel1);
end;


Это добавляем в процедуру отрисовки:
Code
TextOut(Rect.Left + 10, Rect.Top, IntToStr(Index) + '. ' + form2.Tagi(form2.Listbox1.Items[index]).Title);
TextOut(rect.right-50, rect.top, form2.Tagi(form2.Listbox1.Items[index]).freq);

smile
 
Filo$oFДата: Суббота, 02.06.2012, 12:37 | Сообщение # 48
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu

Работает, спсибо smile

Добавлено (02.06.2012, 12:37)
---------------------------------------------
Пытаюсь осуществить перемотку listboxa движением image1 по image2. как это было сделано со звуком и треком.

Code

procedure TForm_player.scrollbMouseMove(Sender: TObject; Shift: TShiftState;
   X, Y: Integer);
      var l:integer;
   begin
  if ssleft in shift then
  begin
  if (mouse.CursorPos.y-yn2>=scroll.Top) and ((mouse.CursorPos.y-yn2+scrollb.Top )<=(scroll.top+scroll.Height)) then
    scrollb.top:=mouse.CursorPos.y-yn2;
   l:=percent(y*2.5, scroll.Height );
List[number_list].ItemIndex:=Trunc(y * List[number_list].Items.Count / scroll.height);
  end;
end;

procedure TForm_player.scrollbMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
yn2:=mouse.CursorPos.y-(scrollb.top);
end;


listbox прокручивается, но вот картинка либо не двигается, либо движется до середины а дальше останавливается, но строки продолжают прокручиваться. Что тут не так?
 
BM_GORAДата: Понедельник, 25.06.2012, 18:45 | Сообщение # 49
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
вставил код для создания m3U плейлиста , но при запуске выдает ошибки:
[DCC Error] mp3.pas(493): E2003 Undeclared identifier: 'SaveList'
[DCC Error] mp3.pas(497): E2003 Undeclared identifier: 'MinToSec'
[DCC Error] mp3.pas(505): E2003 Undeclared identifier: 'tim'
[DCC Error] mp3.pas(508): E2008 Incompatible types
[DCC Error] mp3.pas(509): E2003 Undeclared identifier: 'result'
[DCC Error] mp3.pas(512): E2003 Undeclared identifier: 'SaveList'
[DCC Error] mp3.pas(519): E2003 Undeclared identifier: 'SaveFile'
[DCC Error] mp3.pas(522): E2003 Undeclared identifier: 'ListBox1'
[DCC Error] mp3.pas(525): E2003 Undeclared identifier: 'lentime'
[DCC Error] mp3.pas(525): E2008 Incompatible types
[DCC Error] mp3.pas(529): E2029 Declaration expected but identifier 'Closefile' found
[DCC Error] mp3.pas(530): E2029 '.' expected but ';' found
[DCC Error] mp3.pas(7): F2063 Could not compile used unit 'mp3'

а вот сам код:

Code
procedure TForm_player.Button9Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then
SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u');
end;
end;

function TForm_player.MinToSec(tim: string): string;

var n: integer;
a: string;
begin
n := 1;
a := '';
repeat
a := a + tim[n];
Inc(n);
until tim[n] = ':';
Delete(tim, 1, Length(a) + 1);
result := IntToStr((StrToInt(a) * 60) + StrToInt(tim));
end;

procedure TForm_player.SaveList(SaveFile: string);

var List: TStringList;
i: integer;
s: string;
F:TextFile;
begin
Assignfile(F,SaveFile);
Rewrite(F);
Writeln(F,'#EXTM3U');
for i := 0 to ListBox1.Items.Count - 1 do
begin
s:='';
s:=copy(lentime(Listbox1.Items[i]),4,5);
Writeln(F,'#EXTINF:' + MinToSec(s));
Writeln(F,ListBox1.Items.Strings[i]);
end;
Closefile(F);
end;


Добавлено (25.06.2012, 18:37)
---------------------------------------------
вот я не пойму, Button9Click это клик по кнопке, а вот это что MinToSec, SaveList? на сколько я понял это не компоненты из Tool Palette так как я их там не нашол )

Добавлено (25.06.2012, 18:45)
---------------------------------------------
и насколько я понял:
1 вариант - нужно эти процедуры прописать в разделе type (вот только что именно писать);
2 вариант - нужно обозначить их в разделе var (опять же что писать);
3 вариант - если не 1 и не 2 тогда я хз что это ))
 
xaramamburuДата: Понедельник, 25.06.2012, 22:01 | Сообщение # 50
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Процедура MinToSec переводит минуты в секунды. Процедура SaveList сохраняет файл в формате M3U. В разделе type нужно прописывать заголовки процедур: function MinToSec(tim: string): string;, procedure .SaveList(SaveFile: string); .
Вообщем советую вам почитать умную книжку по основам Delphi. Кстати, скачать несколько таких книжек можно в каталоге файлов на сайте.)))
 
BM_GORAДата: Вторник, 26.06.2012, 00:07 | Сообщение # 51
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
ок, спасибо за совет, над будет как нить почитать, все таки на программиста учусь ))))))

Добавлено (26.06.2012, 00:07)
---------------------------------------------
а что делать с lentime ? вот попытался так function Lentime : string; не пашет, наверное надо как то так function Lentime(тут чето написать : string ) : string; если ошибаюсь пожалуйста поправте меня ))

 
xaramamburuДата: Вторник, 26.06.2012, 09:09 | Сообщение # 52
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
lentime - функция вычисления времени проигрывания трека. Смотри сообщение №10 в этой ветке форума, там эта функция расписана.)))))
 
BM_GORAДата: Вторник, 26.06.2012, 17:34 | Сообщение # 53
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
в общем вот что теперь выдает :
[DCC Warning] mp3.pas(472): H2164 Variable 'List' is declared but never used in 'TForm_player.SaveList'
[DCC Error] mp3.pas(80): E2065 Unsatisfied forward or external declaration: 'TForm_player.Lentime'
[DCC Error] mp3.pas(7): F2063 Could not compile used unit 'mp3'

и красным светится вот это описание function Lentime(filename1:string):string;

Добавлено (26.06.2012, 17:34)
---------------------------------------------
стоп! чето я совсем запутался.
1 - нужно запихнуть function Lentime(filename1:string):string; в раздел type ?, если да то почему ошибки
2 - или же нужно запихнуть вот это куда нибуть ? :
Code
    
function Tform_player.lentime(filename1:string):string;
     var
      TrackLen: Double;
      ValLen: Double;
     Channel1    : DWORD;
     begin
     //освобаждаем канал
     BASS_StreamFree(Channel1);
     //пытаемся загрузить файл и получить дескриптор канала
     Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
     //получаем время воспроизведения
     TrackLen:=BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE));
     ValLen:=TrackLen / (24 * 3600);
      Lentime:=FormatDateTime('hh:mm:ss',ValLen);
     //освобаждаем канал
     BASS_StreamFree(Channel1);
     end;


Сообщение отредактировал BM_GORA - Вторник, 26.06.2012, 17:41
 
xaramamburuДата: Вторник, 26.06.2012, 22:32 | Сообщение # 54
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
[DCC Warning] - это предупреждение. Не обращай на него внимания.

Unsatisfied forward or external declaration: 'TForm_player.Lentime' - данная ошибка скорее всего означает, что у вас функция Lentime расположена ниже процедуры которая ее вызывает и компилятор ее не видит. Т.е вам необходимо перенести эту функцию перед procedure TForm_player.SaveList(SaveFile: string); из которой она вызывается или в самое начало кода (после раздела implementation).))))
 
BM_GORAДата: Вторник, 26.06.2012, 22:58 | Сообщение # 55
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
нет вы меня немного не поняли, этой процедуры у меня нет.
я делаю кнопку сохранения m3u файла.
итак , что есть у меня. у меня в разделе type прописано вот это function Lentime(filename1:string):string;
а так же имеются процедуры, вот они:
Code

procedure TForm_player.Button9Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then
SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u');
end;
end;

function TForm_player.MinToSec(tim: string): string;

var n: integer;
a: string;
begin
n := 1;
a := '';
repeat
a := a + tim[n];
Inc(n);
until tim[n] = ':';
Delete(tim, 1, Length(a) + 1);
result := IntToStr((StrToInt(a) * 60) + StrToInt(tim));
end;

procedure TForm_player.SaveList(SaveFile: string);

var List: TStringList;
i: integer;
s: string;
F:TextFile;
begin
Assignfile(F,SaveFile);
Rewrite(F);
Writeln(F,'#EXTM3U');
for i := 0 to ListBox1.Items.Count - 1 do
begin
s:='';
s:=copy(lentime(Listbox1.Items[i]),4,5);
Writeln(F,'#EXTINF:' + MinToSec(s));
Writeln(F,ListBox1.Items.Strings[i]);
end;
Closefile(F);
end;


и вот с этим и выдается эта ошибка )
 
xaramamburuДата: Вторник, 26.06.2012, 23:03 | Сообщение # 56
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Поэтому и ругается. Добавьте эту функцию перед процедурой procedure TForm_player.SaveList(SaveFile: string); . Все должно заработать.)))
 
BM_GORAДата: Среда, 27.06.2012, 08:06 | Сообщение # 57
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
кнопка заработала, но при нажатии на кнопку сохранить выдается вот это :
First chance exception at $75C39617. Exception class EAccessViolation with message 'Access violation at address 00484055 in module 'GorPlayer.exe'. Read of address 00000000'. Process GorPlayer.exe (3160)
вот процедуры:
Code

procedure TForm_player.Button9Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then
SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u');
end;
end;

function TForm_player.MinToSec(tim: string): string;

var n: integer;
a: string;
begin
n := 1;
a := '';
repeat
a := a + tim[n];
Inc(n);
until tim[n] = ':';
Delete(tim, 1, Length(a) + 1);
result := IntToStr((StrToInt(a) * 60) + StrToInt(tim));
end;

function lentime(filename1:string):string;
begin
end;

procedure TForm_player.SaveList(SaveFile: string);

var List: TStringList;
i: integer;
s: string;
F:TextFile;
begin
Assignfile(F,SaveFile);
Rewrite(F);
Writeln(F,'#EXTM3U');
for i := 0 to ListBox1.Items.Count - 1 do
begin
s:='';
s:=copy(lentime(Listbox1.Items[i]),4,5);
Writeln(F,'#EXTINF:' + MinToSec(s));
Writeln(F,ListBox1.Items.Strings[i]);
end;
Closefile(F);
end;
 
xaramamburuДата: Среда, 27.06.2012, 09:02 | Сообщение # 58
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
В место:
Code

function lentime(filename1:string):string;
begin
end;

добавьте:
Code

function Tform_player.lentime(filename1:string):string;
       var
        TrackLen: Double;
        ValLen: Double;
       Channel1    : DWORD;
       begin
       //освобаждаем канал
       BASS_StreamFree(Channel1);
       //пытаемся загрузить файл и получить дескриптор канала
       Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
       //получаем время воспроизведения
       TrackLen:=BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE));
       ValLen:=TrackLen / (24 * 3600);
        Lentime:=FormatDateTime('hh:mm:ss',ValLen);
       //освобаждаем канал
       BASS_StreamFree(Channel1);
       end;

а вот это
function lentime(filename1:string):string;
добавьте в разделе Type.
sad


Сообщение отредактировал xaramamburu - Среда, 27.06.2012, 09:04
 
BM_GORAДата: Пятница, 29.06.2012, 17:13 | Сообщение # 59
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
теперь все норм ) спс большое ))

Добавлено (29.06.2012, 17:13)
---------------------------------------------
у меня снова вопрос)) у меня ListBox1 показывается время трека, так вот , если название трека слишком длинное то оно залазиет на само время и получается какая то белибирда, вот скрин: http://i42.fastpic.ru/big/2012/0629/84/1667f63941171e3dff8d853a0a585b84.jpg
как это можно исправить ?

Сообщение отредактировал BM_GORA - Среда, 27.06.2012, 14:22
 
Filo$oFДата: Воскресенье, 01.07.2012, 21:01 | Сообщение # 60
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
BM_GORA

Я думаю, проще было бы поставить их в отрисовке на разные уровни.
Я реализовал это так: http://cs309729.userapi.com/v309729233/ca5/ciAAraLBXQk.jpg
 
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
Поиск:


Copyright MyCorp © 2024Конструктор сайтов - uCoz