Procedure EncodeWavToMP3;
var
fs, fd: integer;
err: Integer;
beConfig: TBE_Config;
dwSamples, dwSamplesMP3 : LongWord;
hbeStream : THBE_STREAM;
error: BE_ERR;
pBuffer: PSmallInt;
pMP3Buffer: PByte;
done: LongWord;
dwWrite: LongWord;
ToRead: LongWord;
ToWrite: LongWord;
i:Integer;
TotalSize: integer;
FileName: string;
InFileFullName, OutFileFullName: string;
begin
InFileFullName := '<input file name is here>';
OutFileFullName := '<output file name is here>';
beConfig.dwConfig := BE_CONFIG_LAME;
fs := FileOpen(InFileFullName, fmOpenRead);
fd := CreateFile(PChar(OutFileFullName), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
TotalSize := GetFileSize(fs, nil);
//Structure information
beConfig.Format.lhv1.dwStructVersion := 1;
beConfig.Format.lhv1.dwStructSize := SizeOf(beConfig);
//Basic encoder setting
beConfig.Format.lhv1.dwSampleRate := 22050;
beConfig.Format.lhv1.dwReSampleRate := 0;
beConfig.Format.lhv1.nMode := BE_MP3_MODE_MONO;
beConfig.Format.lhv1.dwBitrate := 160;
beConfig.Format.lhv1.dwMaxBitrate := 160;
beConfig.Format.lhv1.nQuality := 2;
beConfig.Format.lhv1.dwMPegVersion := 1; //MPEG1
beConfig.Format.lhv1.dwPsyModel := 0;
beConfig.Format.lhv1.dwEmphasis := 0;
//Bit Stream Settings
beConfig.Format.lhv1.bPrivate := False;
beConfig.Format.lhv1.bCRC := False;
beConfig.Format.lhv1.bCopyright := True;
beConfig.Format.lhv1.bOriginal := True;
//VBR Stuff
beConfig.Format.lhv1.bWriteVBRHeader := false;
beConfig.Format.lhv1.bEnableVBR := false;
beConfig.Format.lhv1.nVBRQuality := 0;
i := 0;
error := beInitStream(beConfig, dwSamples, dwSamplesMP3, hbeStream);
if error = BE_ERR_SUCCESSFUL
then begin
pBuffer := AllocMem(dwSamples*2);
pMP3Buffer := AllocMem(dwSamplesMP3);
try
done := 0;
error := FileSeek(fs, 0, 0);
While (done < TotalSize) do
begin
if (done + dwSamples*2 < TotalSize)
then ToRead := dwSamples*2
else begin
ToRead := TotalSize-done;
FillChar(pbuffer^,dwSamples,0);
end;
if FileRead(fs, pbuffer^, toread) = -1
then raise Exception.Create('Erreur de lecture');
error := beEncodeChunk(hbeStream, toRead div 2, pBuffer^, pMP3Buffer^, toWrite);
if error <> BE_ERR_SUCCESSFUL
then begin
beCloseStream(hbeStream);
raise Exception.Create('Error');
end;
//if FileWrite(fd, TmpBuf[0], toWrite) = -1
if FileWrite(fd, pMP3Buffer^, toWrite) = -1
then raise Exception.Create('Error');
done := done + toread;
end;
error := beDeInitStream(hbeStream, pMP3Buffer^, dwWrite);
//error := beDeInitStream(hbeStream, TmpBuf[0], dwWrite);
if error <> BE_ERR_SUCCESSFUL
then begin
beCloseStream(hbeStream);
raise Exception.Create('Error');
end;
if dwWrite <> 0
then begin
//if FileWrite(fd, TmpBuf[0], dwWrite) = -1
if FileWrite(fd, pMP3Buffer^, dwWrite) = -1
then raise Exception.Create('Error');
end;
beCloseStream(hbeStream);
finally
FreeMem(pBuffer);
FreeMem(pMP3Buffer);
end;
end;
CloseHandle(fs);
CloseHandle(fd);
end;
lame_enc.dll, WAV to MP3
Возник такой вопрос... Быть может, несколько заезженный, но внятного ответа, тем не менее, нигде не нашел.
Мне необходимо сконвертировать стандартный PCM WAV-файл в MP3. Пользуюсь библиотекой lame_enc.dll (и хотелось бы решить вопрос именно с ней, по возможности просьба других библиотек не предлагать). Конвертация сама по себе проходит успешно, но на выходе получается противный сипящий звук. Различные тестирования навели меня на мысль, что это связано с полем dwBitrate в структуре BE_CONFIG. В связи с этим - собственно, два вопроса:
- исходя из каких соображений нужно задавать это поле, можно ли как-то рассчитать его значение, исходя из параметров исходного WAV-файла?
- быть может, дело в чем-то другом, какие еще будут мысли по этому поводу?
Заранее спасибо.
С конвертированием не работал,поэтому точно ничего не могу написать,но там ещё может быть возможность VBR'а.Это тоже надо учесть
лучше коду кусочек таки показать
Ситуация примерно следующая: при задании битрейта где-то до 24-32 кбит/с возникают "провалы" в звуке (в принципе, это можно объяснить, по стандарту для MPEG1 минимально допустимый битрейт равен 32). Выше этой цифры сразу начинаются сипение.
To bagie2:
Привожу выдержку из кода (код не мой, пытаюсь запустить известный для Lame модуль MP3Export):
Код:
Если интересно, могу выложить исходный и полученный файлы.
Цитата: Alexander92
Код:
beConfig.Format.lhv1.dwSampleRate := 22050;
…
beConfig.Format.lhv1.nMode := BE_MP3_MODE_MONO;
…
beConfig.Format.lhv1.nQuality := 2;
…
beConfig.Format.lhv1.nMode := BE_MP3_MODE_MONO;
…
beConfig.Format.lhv1.nQuality := 2;
Может,в этом дело?
Поэтому и спрашиваю, что здесь может быть не так. А что еще может быть указано в тех полях, которые вы указали? Просто смотрите: 22050 - частота, на которой был записан исходник, здесь вообще я никаких вариантов не вижу. nMode, если я правильно понимаю (если нет - поправьте), - это то, что я хочу получить на выходе: то ли моно, то ли стерео. Что касается nQuality - возможно, вы и правы, но есть один нюанс: один раз мне удалось поймать такие параметры, чтобы выходной файл содержал правильный звук, без шумов и сипа. Причем я менял только битрейт и частоту дискретизации, не трогая качества.
передалал. оформил в виде модуля.
У меня прекрасно работает, вставил комментарии, что может понадобиться поменять в коде.
А если всё равно не получится, то сразу приаттачте сюда WAV-файл или выложите куда.
Не знаю, я нашел какие-то сорцы похожие на ваш код, скачал сорцы lame и
У меня прекрасно работает, вставил комментарии, что может понадобиться поменять в коде.
А если всё равно не получится, то сразу приаттачте сюда WAV-файл или выложите куда.
Проверьте вашу ссылку, пожалуйста, пишет "файл не найден".
я только что перезалил другой вариант там с прогрессбаром пример и немного других улучшений
P.S. Сам WAV-файл выдержан строго по PCM-стандарту, специально hex сверял.
Цитата:
Audio
ID : 0
Format : PCM
Codec ID : 1
Codec ID/Hint : Microsoft
Duration : 2s 175ms
Bit rate : 352.8 Kbps
Channel(s) : 1 channel
Sampling rate : 44.1 KHz
Bit depth : 8 bits
Stream size : 93.7 KiB (100%)
может в этом и причина
Ну и что? Где оно по коду фигурирует? Это же, по идее, используется только внутри самой lame_enc.dll. Или я вас не понял?
Ok, жду, без вопросов. Заранее большое спасибо. :) В принципе, меня даже не столько интересует готовый вариант - написать его я и сам в состоянии - интересует причина такого поведения.
//added
вот
Цитата:
интересует причина такого поведения.
я уже написал выше причину. LAME кушает только 16-bit PCM (по крайней мере я не нашел про поддержку других форматов) так что делаем преобразование 8-bit -> 16-bit сами
//added
кстати, наверное у WAV-файлов надо еще RIFF-заголовок убивать, а то он как данные кодируется (щелчок в самом начале кодированного MP3, вроде оно :) ).
[SIZE="1"][COLOR="Gray"]
Цитата:
написать его я и сам в состоянии
написать напишите, а сорец скорее всего не выложите. а кому-то может и прогодится потом[/COLOR][/SIZE]
Спасибо! По крайней мере, шумы действительно пропали, с остальным буду разбираться. :)