Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2011, 15:01   #11
limansky
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 14
По умолчанию

Я уже где-то читал мнение одного профессионала о TMediaPlayer... И он не применяет его в своих кодах. Поэтому хотелось бы научиться использовать второй вариант, с которым, как вы сказали, проблем не будет.
Конкретная задача
- есть звуковой файл в формате MP3
- я каким-то образом создал текстовый файл с началами и окончаниями фраз
как мне проиграть этот файл по фразам с помощью BASS?
Если можете - помогите с кодом. Дело в том, что сейчас мне нужно доделать очередной курс по английскому. а там несколько тысяч уроков... Ну никак не могу терять время.
Всё работает и так хорошо. Но ВЕС!!!! Нужно как-то перейти на MP3 без потери качества и второй путь мне кажется перспективным.

Последний раз редактировалось limansky; 08.05.2011 в 15:14.
limansky вне форума Ответить с цитированием
Старый 08.05.2011, 15:22   #12
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ну, качаем BASS отсюда. Он бесплатен для некоммерческого использования.

Распаковываем. Главный файл там - это bass.dll. Эту библиотеку нужно скинуть в папку с программой (ну или в любое другое место, где программа сможет его найти). Соответственно, при установке программы нужно также устанавливать и этот файл вместе с программой.

В bass.chm находится справка (документация).

В папке Delphi лежат примеры использования библиотеки на Delphi. Главным там является заголовочник: файл bass.pas. Кидаем его в папку исходников программы и подключаем в uses (распространять с программой его, понятно, не нужно).

Использовать её достаточно просто - посмотрите пример в папке \delphi\BassTest\.

Кратко, нужно: удостовериться, что мы загрузили нужную версию BASS - вызываем BASS_GetVersion и сравниваем с текущей версией BASSVERSION.

Далее, инициализируем движок вызовом BASS_Init. Параметры можно ставить по умолчанию (если, конечно, вам не нужно что-то особенное, вроде моно-звука).

Затем можно начинать проигрывание звуков.

В конце работы нужно вызвать BASS_Free.

А для проигрывания звуков есть достаточно очевидные вещи вроде BASS_ChannelPlay, BASS_ChannelStop. Сам файл для проигрывания загружается через BASS_StreamCreateFile или BASS_SampleLoad.

Вот, собственно и всё.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 08.05.2011 в 15:29.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 15:26   #13
limansky
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 14
По умолчанию

Мне кажется перспективным второй вариант. И, если можно, как будет выглядеть код
MediaPlayer.FileName:='Sound.MP3';
MediaPlayer.Open;
MediaPlayer.StartPos:=SPos;
MediaPLayer.EndPos:=EPos;
MediaPlayer.Play
с использованием BASS?
Понятно, что там уже никакого MediaPlayer не будет.
Если можно - конкретный пример.
limansky вне форума Ответить с цитированием
Старый 08.05.2011, 15:28   #14
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от limansky Посмотреть сообщение
- я каким-то образом создал текстовый файл с началами и окончаниями фраз
как мне проиграть этот файл по фразам с помощью BASS?
Для установки позиций используется BASS_ChannelSetPosition. Только вы позиции, наверное, задавать будете в секундах. Чтобы секунды привести к реальной позиции в байтах - можно использовать BASS_ChannelSeconds2Bytes.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 15:43   #15
limansky
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 14
По умолчанию

Огромное спасибо! Что ж... Вперёд в наступление на BASS. Придётся несколько повысить свой уровень в программировании.
limansky вне форума Ответить с цитированием
Старый 08.05.2011, 15:55   #16
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Простой пример:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, 

  Bass; // <- Добавили

type
  TForm1 = class(TForm)
    edFileName: TEdit; // имя файла для проигрывания
    btStart: TButton; // старт
    btStop: TButton; // стоп
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btStartClick(Sender: TObject);
    procedure btStopClick(Sender: TObject);
  private
    FChannel: HSTREAM; // что играем
    procedure BASS_Check(const AResult: Boolean); overload; // две вспомогательные функции
    function BASS_Check(const AResult: Cardinal): Cardinal; overload;
  end;

type
  // вспомогательные классы
  EBASSError = class(Exception);
    EBASSInitError = class(EBASSError);
      EBASSWrongVersionError = class(EBASSInitError);
    EBASSFunctionError = class(EBASSError)
    private
      FErrorCode: Cardinal;
    public
      constructor Create(const AErrorCode: Cardinal);
      property ErrorCode: Cardinal read FErrorCode;
    end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Проверили версию
  if HiWord(BASS_GetVersion) <> BASSVERSION then
    raise EBASSWrongVersionError.Create('Программа установлена неверно: требуется библиотека BASS версии ' + IntToStr(BASSVERSION) +
      ', но используется:' + sLineBreak +
      GetModuleName(GetModuleHandle(bassdll)) + ' версии ' + IntToStr(HiWord(BASS_GetVersion)));
 
  // Инициализировали с параметрами по умолчанию на 44'100 Гц
  BASS_Check(BASS_Init(-1, 44100, 0, Handle, nil));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Закончили работу
  btStopClick(nil); 
  BASS_Free;
end;

procedure TForm1.btStartClick(Sender: TObject);
begin
  btStopClick(nil); // остановить предыдущее перед запуском нового

  // загрузили файл
  FChannel := BASS_Check(BASS_StreamCreateFile(False, PChar(edFileName.Text), 0, 0, BASS_STREAM_PRESCAN {$IFDEF UNICODE} or BASS_UNICODE{$ENDIF}));

  // Поехали! (С)
  BASS_Check(BASS_ChannelPlay(FChannel, False));
end;

procedure TForm1.btStopClick(Sender: TObject);
begin
  if FChannel = 0 then
    Exit;
  // Остановка проигрывания
  BASS_Check(BASS_ChannelStop(FChannel));
  // Освобождение файла
  BASS_Check(BASS_StreamFree(FChannel));
  FChannel := 0;
end;

// Ниже - вспомогательные функции

procedure TForm1.BASS_Check(const AResult: Boolean);
begin
  if AResult then
    Exit;
  raise EBASSFunctionError.Create(BASS_ErrorGetCode);
end;

function TForm1.BASS_Check(const AResult: Cardinal): Cardinal;
begin
  Result := AResult;
  if AResult <> 0 then
    Exit;
  raise EBASSFunctionError.Create(BASS_ErrorGetCode);
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 15:56   #17
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Часть 2 (не влезло в 1 пост).

Код:
// продолжение вспомогательных функций

{ EBASSFunctionError }

constructor EBASSFunctionError.Create(const AErrorCode: Cardinal);
var
  Msg: String;
begin
  FErrorCode := AErrorCode;
  case FErrorCode of
    BASS_OK:
      Msg := 'BASS_OK - all is OK';
    BASS_ERROR_MEM:
      Msg := 'BASS_ERROR_MEM - memory error';
    BASS_ERROR_FILEOPEN:
      Msg := 'BASS_ERROR_FILEOPEN - can''t open the file';
    BASS_ERROR_DRIVER:
      Msg := 'BASS_ERROR_DRIVER - can''t find a free sound driver';
    BASS_ERROR_BUFLOST:
      Msg := 'BASS_ERROR_BUFLOST - the sample buffer was lost';
    BASS_ERROR_HANDLE:
      Msg := 'BASS_ERROR_HANDLE - invalid handle';
    BASS_ERROR_FORMAT:
      Msg := 'BASS_ERROR_FORMAT - unsupported sample format';
    BASS_ERROR_POSITION:
      Msg := 'BASS_ERROR_POSITION - invalid position';
    BASS_ERROR_INIT:
      Msg := 'BASS_ERROR_INIT - BASS_Init has not been successfully called';
    BASS_ERROR_START:
      Msg := 'BASS_ERROR_START - BASS_Start has not been successfully called';
    BASS_ERROR_ALREADY:
      Msg := 'BASS_ERROR_ALREADY - already initialized/paused/whatever';
    BASS_ERROR_NOCHAN:
      Msg := 'BASS_ERROR_NOCHAN - can''t get a free channel';
    BASS_ERROR_ILLTYPE:
      Msg := 'BASS_ERROR_ILLTYPE - an illegal type was specified';
    BASS_ERROR_ILLPARAM:
      Msg := 'BASS_ERROR_ILLPARAM - an illegal parameter was specified';
    BASS_ERROR_NO3D:
      Msg := 'BASS_ERROR_NO3D - no 3D support';
    BASS_ERROR_NOEAX:
      Msg := 'BASS_ERROR_NOEAX - no EAX support';
    BASS_ERROR_DEVICE:
      Msg := 'BASS_ERROR_DEVICE - illegal device number';
    BASS_ERROR_NOPLAY:
      Msg := 'BASS_ERROR_NOPLAY - not playing';
    BASS_ERROR_FREQ:
      Msg := 'BASS_ERROR_FREQ - illegal sample rate';
    BASS_ERROR_NOTFILE:
      Msg := 'BASS_ERROR_NOTFILE - the stream is not a file stream';
    BASS_ERROR_NOHW:
      Msg := 'BASS_ERROR_NOHW - no hardware voices available';
    BASS_ERROR_EMPTY:
      Msg := 'BASS_ERROR_EMPTY - the MOD music has no sequence data';
    BASS_ERROR_NONET:
      Msg := 'BASS_ERROR_NONET - no internet connection could be opened';
    BASS_ERROR_CREATE:
      Msg := 'BASS_ERROR_CREATE - couldn''t create the file';
    BASS_ERROR_NOFX:
      Msg := 'BASS_ERROR_NOFX - effects are not enabled';
    BASS_ERROR_NOTAVAIL:
      Msg := 'BASS_ERROR_NOTAVAIL - requested data is not available';
    BASS_ERROR_DECODE:
      Msg := 'BASS_ERROR_DECODE - the channel is a "decoding channel"';
    BASS_ERROR_DX:
      Msg := 'BASS_ERROR_DX - a sufficient DirectX version is not installed';
    BASS_ERROR_TIMEOUT:
      Msg := 'BASS_ERROR_TIMEOUT - connection timedout';
    BASS_ERROR_FILEFORM:
      Msg := 'BASS_ERROR_FILEFORM - unsupported file format';
    BASS_ERROR_SPEAKER:
      Msg := 'BASS_ERROR_SPEAKER - unavailable speaker';
    BASS_ERROR_VERSION:
      Msg := 'BASS_ERROR_VERSION - invalid BASS version (used by add-ons)';
    BASS_ERROR_CODEC:
      Msg := 'BASS_ERROR_CODEC - codec is not available/supported';
    BASS_ERROR_ENDED:
      Msg := 'BASS_ERROR_ENDED - the channel/file has ended';
    BASS_ERROR_BUSY:
      Msg := 'BASS_ERROR_BUSY - the device is busy';
  else
    Msg := 'BASS_ERROR_UNKNOWN - some other mystery problem';
  end;
  inherited Create(Msg);
end;

end.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 16:03   #18
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Пример проигрывания с середины файла:

Код:
procedure TForm1.btStartClick(Sender: TObject);
var
  Position: QWORD;
begin
  btStopClick(nil);
  FChannel := BASS_Check(BASS_StreamCreateFile(False, PChar(edFileName.Text), 0, 0, BASS_STREAM_PRESCAN {$IFDEF UNICODE} or BASS_UNICODE{$ENDIF}));

  // Добавили: ставим позицию в середину файла (в секундах)
  Position := BASS_ChannelSeconds2Bytes(FChannel, BASS_ChannelBytes2Seconds(FChannel, BASS_ChannelGetLength(FChannel, BASS_POS_BYTE)) / 2);
  BASS_Check(BASS_ChannelSetPosition(FChannel, Position, BASS_POS_BYTE));

  BASS_Check(BASS_ChannelPlay(FChannel, False));
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 16:04   #19
limansky
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 14
По умолчанию

Вы даже не представляете, насколько я Вам благодарен.
Вы подарили мне столько времени! Мне, как чайнику, порой приходится тратить неделю на решение элементарного вопроса.
Как только найду время - сразу же постараюсь внедрить BASS в программу и обязательно отпишусь.
С уважением, Олег Лиманский.
limansky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заблокировать клавиатуру? BaRSyk174 Общие вопросы Delphi 6 26.02.2011 00:34
Как переключить видеокарты на семерке Agent3004 Компьютерное железо 1 24.02.2011 22:28
Переключить раскладку клавиатуры. SKYLINEGTR Помощь студентам 2 02.02.2011 00:50
Программно переключить закладки TabControl Человек_Борща Общие вопросы Delphi 12 18.12.2010 01:01
Как заблокировать клавиатуру? dradysman Общие вопросы Delphi 3 30.11.2009 18:34