![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При кодировании в MP3 отсутствует звук
VoVan © (2008-03-25 05:16:00)Всем привет. Столкнулся с такой проблемкой: при попытке преобразования миди в мп3 отсутствует звук при воспроизведении полученного мп3-файла, причем если сжимать в мп3 вав-файлы со звуком все в порядке. Пользовался bass.dll, bassmidi.dll, lame_inc.dll.
Сергей М. (2008-03-26 08:27:00) [21]
> Efir (25.03.08 20:44) [3]
> Покажите мне строку, где кодируются сами MIDI данные
be EncodeChunk
Efir (2008-03-25 20:55:00) [22]
> VoVan © (25.03.08 05:16)
У тебя точно MIDI файл, самим bass'ом он проигрывается?
Efir (2008-03-25 20:44:00) [23]
> Сергей М. © (25.03.08 08:41) [2]
Покажите мне строку, где кодируются сами MIDI данные, если это
BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead);, то вы глубоко не правы.
Сергей М. (2008-03-25 08:41:00) [24]
> При кодировании в MP3 отсутствует звук
Потому что полная ахинея этом в алгоритме .
Ты пытаешься кодировать в mp3 не результат синтеза, а сами midi-данные.
VoVan (2008-03-25 05:19:00) [25]Вот кусок кода:
function EncodeToMP3(InFile:string; OutFile:string):boolean;
var
NumSamples:DWORD;
InBufSize: DWORD;
OutBufSize:DWORD;
BufMIDI:PSHORT;
BufMP3: PBYTE;
BassChan:HSTREAM;
beStream:THBESTREAM;
beConfig:TBECONFIG;
fWrite:TFileStream;
SizeOfRead:DWORD;
Encoded: DWORD;
ErrRes:TBeErr;
i, MIDILeng:DWORD; s: string;
begin
Result:=false;
BassChan:=BASS_MIDI_StreamCreateFile(false, PChar(InFile), 0, 0, BASS_STREAM_DECODE, 44100);
if BassChan=0 then begin
BASS_StreamFree(BassChan);
Exit;
end;
FillChar(beConfig, SizeOf(beConfig), 0);
beConfig.Format.dwConfig:=BE_CONFIG_LAME;
beConfig.Format.LHV1.dwStructVersion:=1;
beConfig.Format.LHV1.dwStructSize:=SizeOf(beConfig);
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.nQuality:=2;
beConfig.Format.LHV1.dwMpegVersion:=MPEG1;
MIDILeng:=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
BufMIDI:=AllocMem(InBufSize);
BufMP3:=AllocMem(OutBufSize);
try
i:=0;
while i<>MIDILeng do begin
if i+InBufSize<MIDILeng then SizeOfRead:=InBufSize
else SizeOfRead:=MIDILeng-i;
BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead);
ErrRes:=beEncodeChunk(beStream, SizeOfRead div 2, BufMIDI, BufMP3, Encoded);
if ErrRes<>BE_ERR_SUCCESSFUL then Exit;
fWrite.WriteBuffer(BufMP3^, Encoded);
i:=i+SizeOfRead;
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(BufMIDI);
FreeMem(BufMP3);
end;
Result:=true;
end;