Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

fmod


Страницы:   1 2

VoVan ©   (2008-03-19 05:31:00) 

Люди, помогите, никак не могу разобраться с fmod. В коде прописал
 Module := FMUSIC_LoadSong(PChar(dlgOpen.Files[0]));
 Stream := FSOUND_Stream_Open(PChar(dlgOpen.Files[0]), ......);
файл миди
проигрывается поток замечательно, но вопрос в другом:
Каким образом перегнать это в вав? Говорят, что можно взять данные из буфера и сохранить в вав. Будьте добры напишите КАК это сделать. А дальше я уж LAMEом это в мп3 перекодирую.


VoVan   (2008-03-19 20:55:00) [21]

А как бы сделать то же самое, только с миди :) ?


Efir   (2008-03-19 20:40:00) [22]

function EncodeToMP3(InFile:string; OutFile:string):boolean;
var
 Progress:Int64;

 NumSamples:DWORD; //кол-во семплов, на входе кодера
 InBufSize: DWORD; //размер буфера на входе кодера
 OutBufSize:DWORD; //размер буфера на выходе кодера

 BufWave:PSHORT; //буфер чтения источника
 BufMP3: PBYTE;  //буфер результата кодирования

 BassChan:HSTREAM;
 beStream:THBESTREAM; //поток кодера
 beConfig:TBECONFIG;

 fWrite:TFileStream;

 SizeOfRead:DWORD; //размер буфера, сколько должно быть считано
 Encoded: DWORD;   //сколько было закодировано

 ErrRes:TBeErr;
 i, WAVLeng, SampleSize:DWORD;

 s:string;
begin
 Result:=false;
 
 BassChan:=BASS_StreamCreateFile(false, PChar(InFile), 0, 0, BASS_STREAM_DECODE);
 if BassChan=0 then begin
   BASS_StreamFree(BassChan);
   Exit;
 end;
 
 FillChar(LameConfig, SizeOf(LameConfig), 0);
 beConfig.Format.dwConfig:=BE_CONFIG_LAME;
 beConfig.Format.LHV1.dwStructVersion:=1;
 beConfig.Format.LHV1.dwStructSize:=SizeOf(LameConfig);
 beConfig.Format.LHV1.dwSampleRate:=44100;
 beConfig.Format.LHV1.dwReSampleRate:=0;
 beConfig.Format.LHV1.nMode:=BE_MP3_MODE_STEREO;
 beConfig.Format.LHV1.dwBitrate:=192;
 beConfig.Format.LHV1.dwMaxBitrate:=320;
 beConfig.Format.LHV1.nPreset:=LQP_HIGH_QUALITY;
 beConfig.Format.LHV1.dwMpegVersion:=MPEG1;
 beConfig.Format.LHV1.dwPsyModel:=0;
 beConfig.Format.LHV1.dwEmphasis:=0;
 beConfig.Format.LHV1.bPrivate:=false;
 beConfig.Format.LHV1.bCRC:=false;
 beConfig.Format.LHV1.bCopyright:=false;
 beConfig.Format.LHV1.bOriginal:=false;
 beConfig.Format.LHV1.bWriteVBRHeader:=false;
 beConfig.Format.LHV1.bEnableVBR:=false;
 beConfig.Format.LHV1.nVBRQuality:=2;
 beConfig.Format.LHV1.nVbrMethod:=VBR_METHOD_NONE;
 beConfig.Format.LHV1.dwVbrAbr_bps:=0;

 WAVLeng:=BASS_ChannelGetLength(BassChan);

 ErrRes:=beInitStream(beConfig, NumSamples, OutBufSize, beStream);
 if ErrRes<>BE_ERR_SUCCESSFUL then begin
   beCloseStream(beStream);
   BASS_StreamFree(BassChan);
   Exit;
 end;

 InBufSize:=NumSamples*4;

 s:=ExtractFileName(InFile);
 OutFile:=OutFile+Copy(s, 1, Length(s)-Length(ExtractFileExt(s)))+'.mp3';
 fWrite:=TFileStream.Create(OutFile, fmCreate);
 try
   BufWave:=AllocMem(InBufSize);
   BufMP3:=AllocMem(OutBufSize);
   FillChar(BufWave^, InBufSize, 0);
   FillChar(BufMP3^, OutBufSize, 0);
   try
     i:=0;
     Progress:=0;
     while i<>WAVLeng do begin
       if i+InBufSize<WAVLeng then SizeOfRead:=InBufSize
         else SizeOfRead:=WAVLeng-i;

       BASS_ChannelGetData(BassChan, BufWave, SizeOfRead);
       ErrRes:=beEncodeChunk(beStream, SizeOfRead div 2, BufWave, BufMP3, Encoded);
       if ErrRes<>BE_ERR_SUCCESSFUL then Exit;

       fWrite.WriteBuffer(BufMP3^, Encoded);
       i:=i+SizeOfRead;
       if Terminated then Exit;
     end;

     ErrRes:=beDeinitStream(beStream, BufMP3, Encoded);
     if ErrRes<>BE_ERR_SUCCESSFUL then Exit;

     fWrite.WriteBuffer(BufMP3^, Encoded);
   finally
     fWrite.Free;
     BASS_StreamFree(BassChan);
     beCloseStream(beStream);
   end;
 finally
   FreeMem(BufWave);
   FreeMem(BufMP3);
 end;
 Result:=true;
end;


Но это только для кодирования файлов 44100 кГц, 16 бит, Стерео.


VoVan   (2008-03-19 20:20:00) [23]

А дай плиз пример с бассом.


Efir   (2008-03-19 20:13:00) [24]

Ан нет, не совсем я прав.

SizeOfRead - сколько байт источника было считано
а вот
BufWave:PShort - 2 байта.

Итого кол-во семплов SizeOfRead div 2.


Efir   (2008-03-19 20:03:00) [25]


> VoVan ©   (19.03.08 18:56) [4]


Просто этот пример для 16 бит стерео, а SizeOfRead - кол-во семплов считанного WAV файла.


> VoVan ©   (19.03.08 19:29) [5]


Здесь я сказать не могу, т.к. не работал с этой библиотекой. Могу только дать пример с bass'ом.


VoVan   (2008-03-19 19:29:00) [26]

И еще вопрос: 3-й параметр ф-ции beEncodeChunc (допустим у меня он pBuffer). Как fmod'ом считать в него данные?


VoVan   (2008-03-19 18:56:00) [27]

Спасибо, попробую. А не объяснишь почему SizeOfRead пополам делить надо?


Efir   (2008-03-19 17:48:00) [28]

Надо fmod'ом считать данные в буфер, после передать указатель на этот буфер ф-ции beEncodeChunk(). Что-то типа:

beEncodeChunk(beStream, SizeOfRead div 2, BufWave, BufMP3, Encoded);

Где,
SizeOfRead - сколько байт источника было считано
BufWave - указатель на этот буфер
BufMP3 - сюда пишется результат
Encoded - сколько байт закодировано

BufWave:PSHORT;
BufMP3: PBYTE;


VoVan   (2008-03-19 17:32:00) [29]

В LAMEе есть такая ф-ция beEncodeChunk(). Как в нее подать FMODовский поток STREAM чтобы закодировать в мп3?


Efir   (2008-03-19 17:16:00) [30]

Можно и сразу не сохраняя в wav кодировать в mp3 lame'ом.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо