Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.06.2007, 21:30
Аватар для <<D>>
<<D>> <<D>> вне форума
Активный
 
Регистрация: 06.05.2007
Адрес: ГДЕ ТО В СОЛНЕЧНОЙ СИСТЕМЕ
Сообщения: 207
Репутация: 15
Восклицание BASS

Как на BASS'e записывать файл в mp3 формате, а не в WAVE.
Я хочу сделать Аудио Граббер на этом компоненте, добавил
"Бассовский" плагин CDA и не знаю как конвертировать файлы
в mp3 , а в WAVE получилось.
Ответить с цитированием
  #2  
Старый 17.09.2007, 01:25
Delphinic Delphinic вне форума
Начинающий
 
Регистрация: 20.11.2006
Сообщения: 134
Репутация: 15
По умолчанию

Раз тема заведена продолжим.
У меня другая проблемма.
НЕ работают уровни записи при записи звука. Запись идет а уровни всегда зашкалены.
Использую Bass_ChanellGetLevel(HStream);
Може я чего то не так делаю? При воспроизведении все пашет как надо.
Просто я в тупике даже незнаю где копать!
Создал отдельный таймер для записи и там уже обрабатываю уровни.
Таймер запускается, проверено!
Подскажите или лучше дайте исходники какого нибудь плеера с записью и индикаторами уровня если можно.
Ответить с цитированием
  #3  
Старый 19.05.2008, 14:00
Anti_L@+meR Anti_L@+meR вне форума
Прохожий
 
Регистрация: 19.05.2008
Сообщения: 39
Репутация: 10
По умолчанию

Цитата:
Сообщение от <<D>>
Как на BASS'e записывать файл в mp3 формате, а не в WAVE.
Я хочу сделать Аудио Граббер на этом компоненте, добавил
"Бассовский" плагин CDA и не знаю как конвертировать файлы
в mp3 , а в WAVE получилось.
а как тебе удалось записать в Wave
Ответить с цитированием
  #4  
Старый 01.06.2008, 00:58
Аватар для <<D>>
<<D>> <<D>> вне форума
Активный
 
Регистрация: 06.05.2007
Адрес: ГДЕ ТО В СОЛНЕЧНОЙ СИСТЕМЕ
Сообщения: 207
Репутация: 15
По умолчанию

Цитата:
Сообщение от Anti_L@+meR
а как тебе удалось записать в Wave
Код:
{
 Source code under Bass license
 by Alessandro Cappellozza

 http://digilander.libero.it/Kappe
 mail acappellozza@ieee.org

 Notice
  It is designed for mp3 but work on other streams (ogg, and so on)
 }

unit UnitMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Bass, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    EditFileName: TEdit;
    EditDest: TEdit;
    btnOpen: TButton;
    BtnDecode: TButton;
    OpenDialog: TOpenDialog;
    btnCancel: TButton;
    ProgressBar: TProgressBar;
    LabelOp: TLabel;
    Label1: TLabel;
    Label2: TLabel;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtnDecodeClick(Sender: TObject);
    procedure btnOpenClick(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure DecodeFile(OutPath, SourceFileName : String);
  end;

var
  Form1: TForm1;
  PercentDone : Integer;
  CancelOp    : Boolean;
  
implementation

{$R *.dfm}

procedure TForm1.DecodeFile(OutPath, SourceFileName : String);
 var chan, frq, vl : DWORD; Tmp: Integer;
     buf : array [0..10000] of BYTE;
   BytesRead : integer;
   temp : string;
   i : longint;
   RecStream : TFileStream;
   nChannels       : Word;   // number of channels (i.e. mono, stereo, etc.)
   nSamplesPerSec  : DWORD;  // sample rate
   nAvgBytesPerSec : DWORD;
   nBlockAlign     : Word;
   wBitsPerSample  : Word;   // number of bits per sample of mono data
   FileName : String;
   chaninfo: BASS_CHANNELINFO;
begin

    chan := BASS_StreamCreateFile(FALSE, PChar(SourceFileName), 0, 0, BASS_STREAM_DECODE);

    CancelOp := False;
    LabelOp.Caption      := 'Opening file ...';

  BASS_ChannelGetInfo(chan, chaninfo);
    nChannels := chaninfo.chans;
        if (chaninfo.flags and BASS_SAMPLE_8BITS > 0) then wBitsPerSample := 8 else wBitsPerSample := 16;
    nBlockAlign := nChannels * wBitsPerSample div 8;
    BASS_ChannelGetAttributes(chan, frq, vl, Tmp);
        nSamplesPerSec := frq;
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;

    FileName := ExtractFileName(SourceFileName);
    FileName := Copy(FileName, 1, Length(FileName) - Length(ExtractFileExt(FileName)));
    RecStream := TFileStream.Create(OutPath + FileName + '.wav', fmCreate);

 // Write header portion of wave file
    temp := 'RIFF'; RecStream.write(temp[1], length(temp));
    temp := #0#0#0#0; RecStream.write(temp[1], length(temp));   // File size: to be updated
    temp := 'WAVE'; RecStream.write(temp[1], length(temp));
    temp := 'fmt '; RecStream.write(temp[1], length(temp));
    temp := #$10#0#0#0; RecStream.write(temp[1], length(temp)); // Fixed
    temp := #1#0; RecStream.write(temp[1], length(temp));       // PCM format
    if nChannels = 1 then
       temp := #1#0
    else
       temp := #2#0;
    RecStream.write(temp[1], length(temp));
    RecStream.write(nSamplesPerSec, 2);
    temp := #0#0; RecStream.write(temp[1], length(temp));   // SampleRate is given as dWord
    RecStream.write(nAvgBytesPerSec, 4);
    RecStream.write(nBlockAlign, 2);
    RecStream.write(wBitsPerSample, 2);
    temp := 'data'; RecStream.write(temp[1],length(temp));
    temp := #0#0#0#0; RecStream.write(temp[1],length(temp)); // Data size: to be updated
    while (BASS_ChannelIsActive(chan) > 0) do
         begin
                BytesRead := BASS_ChannelGetData(chan, @buf, 10000);
                RecStream.Write(buf, BytesRead);
                Application.ProcessMessages;
                if CancelOp then Break;
                PercentDone := Trunc(100 * (BASS_ChannelGetPosition(Chan) / BASS_ChannelGetLength(chan)));
                ProgressBar.Position := PercentDone;
                LabelOp.Caption      := 'Done ' + IntToStr(PercentDone) + '%';
    end;
   BASS_StreamFree(chan); // free the stream

   LabelOp.Caption      := 'Closing file ...';
// complete WAV header
// Rewrite some fields of header
   i := RecStream.Size - 8;    // size of file
   RecStream.Position := 4;
   RecStream.write(i, 4);
   i := i - $24;               // size of data
   RecStream.Position := 40;
   RecStream.write(i, 4);
   RecStream.Free;
   LabelOp.Caption      := 'Done';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     BASS_Init(-1, 44100, 0, Application.Handle, nil);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Bass_Free;
end;

procedure TForm1.BtnDecodeClick(Sender: TObject);
begin
 DecodeFile(EditDest.Text, EditFileName.Text);
end;

procedure TForm1.btnOpenClick(Sender: TObject);
begin
 if not OpenDialog.Execute then exit;
  EditFileName.text := OpenDialog.FileName;
  EditDest.Text     := ExtractFileDir(OpenDialog.FileName);
  if EditDest.Text[Length(EditDest.Text)] <> '\' then EditDest.Text := EditDest.Text + '\';
end;

procedure TForm1.btnCancelClick(Sender: TObject);
begin
 CancelOp := True;
end;

end.
__________________
Кому я должен - всем прощаю!!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter