![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
fmod
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'ом.