Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
1

Bass.dll: реализовать режим моно-стерео, скорость воспроизведения и т.д

19.10.2012, 12:32. Показов 4002. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем, привет. Продолжаю писать свой плеер. И вот решил кое-что расузнать. Как мы знаем другие плееры могут определить общую частоту канала, режим моно-стерео, скорость воспроизведения. Мне нужно определить тоже самое. Но проблема какую функцию применить: Bass_ChannelGetInfo(узнать информацию канала) или Bass_GetInfo(узнать информацию)? И если функция подойдет то скажите какую и какой желательно flag использовать? Буду благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2012, 12:32
Ответы с готовыми решениями:

Из "моно" в "стерео"...
Как из "плоского" звука телевизора LG (с кинескопом,без HDMI и прочих предметов роскоши) получить...

Конвертер стерео в моно
Всем доброго времени суток. Нужно преобразовать стерео сигнал в моно. Как ни странно, на просторах...

Преобразование моно-сигнала в стерео
Здравствуйте, помогите пожалуйста объяснением. Как правильно записывается из моно стерео? Есть...

Разбить стерео-сигнал на два моно-сигнала
Помогите, может кто и сделает) Нужно чтоби,програма стерео-сигнал з линейного входа компа...

9
angstrom
19.10.2012, 13:45 2
Собрал из кусочков рабочего проекта.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
  Time : Single;
  Freq : Single;
  info  : BASS_CHANNELINFO;
begin
  // Alas, BASS does not support floating bitrate (VBR)
  // частота, к примеру 22050
  BASS_ChannelGetAttribute(Channel, BASS_ATTRIB_FREQ, Freq);
  Time := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE));
  // kbps, к примеру 32
  BitsPerSecond := Trunc(BASS_StreamGetFilePosition(Channel, BASS_FILEPOS_END) / (Time * 125) + 0.5);
...
  BASS_ChannelGetInfo(Channel, info);
  isStereo := info.chans > 1;
...
end;
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
19.10.2012, 13:50 3
Размер файла
Delphi
1
2
3
4
5
6
7
8
9
10
11
function BassFileSize(sFilename: string): cardinal; 
var
 sFile: TFileStream;
begin
 sFile := TFileStream.Create(sFilename, fmOpenRead or fmShareDenyNone);
 try
   result := sFile.Size;
 finally
   sFile.free;
 end;
end;
Секунды в формат HH : MM : SS

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const // разделитель строки времени
   b_time_rz = ':';
function SecondsToTime(sec: double): String;
var
  M, S, H: INTEGER;
begin
  S := Round(Sec);
  M:= Round(INT(S / 60));
  S := S - M * 60; //Seconds
  H := Round(INT(M / 60)); //Hours
  M := M - H * 60; //Minutes
  if H=0 then result:='' else result:=inttostr(H)+b_time_rz;
  if M<10 then result:=result+'0';
  result:=result+inttostr(M)+b_time_rz;
  if S<10 then result:=result+'0';
  result:=result+inttostr(S);
end;
Количество каналов > 1 => стерео иначе моно

Delphi
1
2
3
4
5
6
7
function Channels(stream: cardinal): integer;
Var CHANINFO : BASS_CHANNELINFO;
begin
  result:=0;
  BASS_ChannelGetInfo(stream, CHANINFO);
  result:=round(CHANINFO.chans);
end;
Килобит в секунду

Delphi
1
2
3
4
5
6
7
8
function kbps(stream: cardinal): integer;
begin
  result:=0;
    result:=trunc((
      BASS_StreamGetFilePosition(stream, BASS_FILEPOS_END)/
      (125*BASS_ChannelBytes2Seconds(stream, BASS_ChannelGetLength(stream,BASS_POS_BYTE)))
    )+0.5); // bitrate (Kbps)
end;
Частота

Delphi
1
2
3
4
5
6
7
function kHz(stream: cardinal): integer;
Var CHANINFO : BASS_CHANNELINFO;
begin
    result:=0;
  BASS_ChannelGetInfo(stream, CHANINFO);
  result := round(CHANINFO.freq);
end;
Длина трека в секундах

Delphi
1
2
3
4
5
6
7
8
function SecondsLength(stream: cardinal): double;
begin
  result:=0;
    result:=BASS_ChannelBytes2Seconds(
    stream,
    BASS_ChannelGetLength( stream, BASS_POS_BYTE )
  );
end;
Текущая секунда при воспроизведении

Delphi
1
2
3
4
5
6
7
function ReadSecond(stream: cardinal): double;
begin
  result:=0;
  result:=BASS_ChannelBytes2Seconds(stream,
    BASS_ChannelGetPosition(stream,BASS_POS_BYTE)
  );
end;
Перемотка (установление позиции на нужную секунду)

Delphi
1
2
3
4
5
6
7
8
procedure SetSecond(stream: cardinal; const Value: double);
begin
  BASS_ChannelSetPosition(
    stream,
    BASS_ChannelSeconds2Bytes(stream,Value),
    BASS_POS_BYTE
  );
end;
by BassSimple
1
angstrom
19.10.2012, 14:11 4
Цитата Сообщение от Alex_pac Посмотреть сообщение
Секунды в формат HH : MM : SS

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const // разделитель строки времени
   b_time_rz = ':';
function SecondsToTime(sec: double): String;
var
  M, S, H: INTEGER;
begin
  S := Round(Sec);
  M:= Round(INT(S / 60));
  S := S - M * 60; //Seconds
  H := Round(INT(M / 60)); //Hours
  M := M - H * 60; //Minutes
  if H=0 then result:='' else result:=inttostr(H)+b_time_rz;
  if M<10 then result:=result+'0';
  result:=result+inttostr(M)+b_time_rz;
  if S<10 then result:=result+'0';
  result:=result+inttostr(S);
end;
Садизм какой-то
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  Time   : DWORD;
  TimeSt : AnsiString;
  Len    : QWORD;
begin
  // общее время звучания
  Time := DWORD(Trunc(BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE))));
  TimeSt := Format(' (%.d:%.2d)', [Time div 60, Time mod 60]);
  // текущее или осталось
  if TimeSign then
    Len := BASS_ChannelGetPosition(Channel, BASS_POS_BYTE)
  else
    Len := BASS_ChannelGetLength(Channel, BASS_POS_BYTE) - BASS_ChannelGetPosition(Channel, BASS_POS_BYTE);
  Time := Trunc(BASS_ChannelBytes2Seconds(Channel, Len));
  TimeSt := Format(' (%.d:%.2d)', [Time div 60, Time mod 60]);
...
end;
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
19.10.2012, 14:27 5
ок
Delphi
1
2
3
4
5
6
7
8
9
10
11
const // ðàçäåëèòåëü ñòðîêè âðåìåíè
   b_time_rz = ':';
function SecondsToTime(sec: double): String;
var
  m, s: INTEGER;
begin
  s:=round(sec);
  m:=s div 60;
  if m<60 then result := Format('%.2d'+b_time_rz+'%.2d', [m, s mod 60])
  else result := Format('%.d'+b_time_rz+'%.2d'+b_time_rz+'%.2d', [m div 60, m mod 60, s mod 60]);
end;
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
19.10.2012, 15:23  [ТС] 6
а что означает тип cardinal?
0
angstrom
19.10.2012, 15:28 7
Ставишь курсор на непонятную команду, тип и т.д. и жмёшь F1. Там всё доступно описано.
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
19.10.2012, 15:37  [ТС] 8
всё норм. Вот только насчет Channels, что там писать?

Добавлено через 3 минуты
Всё разобрался. Спасибою
0
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
19.10.2012, 15:37 9
на будущее открываешь google и там пишешь Delphi cardinal

и прям в первой строке будут ответы на все вопросы
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
19.10.2012, 15:39  [ТС] 10
хорошо
0
19.10.2012, 15:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2012, 15:39
Помогаю со студенческими работами здесь

Установка библиотеки для воспроизведения музыки "bass.dll"
Здравствуйте , не могли бы вы рассказать подробно, как устанавливать библиотеку bass.dll на Visual...

Bass.dll.net - Ошибка инициализации при обращении к Bass.dll
Создаю тестовое консольное приложение в точности по гайду:...

Куда закинуть bass.dll,bass.h,bass.lib
Ребят, пересмотрел темы на форуме, гуглил, толком ничего не нашел. Собственно такая проблема, вот я...

Визуализация - как реализовать эквалайзер (bass.dll)
Все доброго времени суток. Кто может подсказать, как реализовать эквалайзер? Нашёл тут по темам вот...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru