Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

lame_enc.dll, WAV to MP3

278
29 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Всем доброго времени суток!
Возник такой вопрос... Быть может, несколько заезженный, но внятного ответа, тем не менее, нигде не нашел.

Мне необходимо сконвертировать стандартный PCM WAV-файл в MP3. Пользуюсь библиотекой lame_enc.dll (и хотелось бы решить вопрос именно с ней, по возможности просьба других библиотек не предлагать). Конвертация сама по себе проходит успешно, но на выходе получается противный сипящий звук. Различные тестирования навели меня на мысль, что это связано с полем dwBitrate в структуре BE_CONFIG. В связи с этим - собственно, два вопроса:
- исходя из каких соображений нужно задавать это поле, можно ли как-то рассчитать его значение, исходя из параметров исходного WAV-файла?
- быть может, дело в чем-то другом, какие еще будут мысли по этому поводу?

Заранее спасибо.
7
29 ноября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ну наверное,битрейт вы сами задаёте.Задайте 160 кбит/с,это нормально
С конвертированием не работал,поэтому точно ничего не могу написать,но там ещё может быть возможность VBR'а.Это тоже надо учесть
8.2K
29 ноября 2010 года
bagie2
299 / / 26.10.2008
может с частотой дискретизации что-нибудь.
лучше коду кусочек таки показать
278
29 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
To @pixo $oft:
Ситуация примерно следующая: при задании битрейта где-то до 24-32 кбит/с возникают "провалы" в звуке (в принципе, это можно объяснить, по стандарту для MPEG1 минимально допустимый битрейт равен 32). Выше этой цифры сразу начинаются сипение.

To bagie2:
Привожу выдержку из кода (код не мой, пытаюсь запустить известный для Lame модуль MP3Export):

Код:
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;


Если интересно, могу выложить исходный и полученный файлы.
7
29 ноября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Alexander92
 
Код:
beConfig.Format.lhv1.dwSampleRate := 22050;

  beConfig.Format.lhv1.nMode := BE_MP3_MODE_MONO;

  beConfig.Format.lhv1.nQuality := 2;

Может,в этом дело?

278
29 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Поэтому и спрашиваю, что здесь может быть не так. А что еще может быть указано в тех полях, которые вы указали? Просто смотрите: 22050 - частота, на которой был записан исходник, здесь вообще я никаких вариантов не вижу. nMode, если я правильно понимаю (если нет - поправьте), - это то, что я хочу получить на выходе: то ли моно, то ли стерео. Что касается nQuality - возможно, вы и правы, но есть один нюанс: один раз мне удалось поймать такие параметры, чтобы выходной файл содержал правильный звук, без шумов и сипа. Причем я менял только битрейт и частоту дискретизации, не трогая качества.
8.2K
30 ноября 2010 года
bagie2
299 / / 26.10.2008
Не знаю, я нашел какие-то сорцы похожие на ваш код, скачал сорцы lame и передалал. оформил в виде модуля.

У меня прекрасно работает, вставил комментарии, что может понадобиться поменять в коде.
А если всё равно не получится, то сразу приаттачте сюда WAV-файл или выложите куда.
278
30 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Проверьте вашу ссылку, пожалуйста, пишет "файл не найден".
8.2K
30 ноября 2010 года
bagie2
299 / / 26.10.2008
я только что перезалил другой вариант там с прогрессбаром пример и немного других улучшений
278
30 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Увы, не хочет оно правильно работать, проблема один в один, как и у меня. Приаттачил оригинал и то, что получилось в результате работы вашего модуля.
P.S. Сам WAV-файл выдержан строго по PCM-стандарту, специально hex сверял.
8.2K
30 ноября 2010 года
bagie2
299 / / 26.10.2008
Цитата:

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%)


может в этом и причина

278
30 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Ну и что? Где оно по коду фигурирует? Это же, по идее, используется только внутри самой lame_enc.dll. Или я вас не понял?
278
30 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Ok, жду, без вопросов. Заранее большое спасибо. :) В принципе, меня даже не столько интересует готовый вариант - написать его я и сам в состоянии - интересует причина такого поведения.
8.2K
30 ноября 2010 года
bagie2
299 / / 26.10.2008
главное - терпение. я вот уже сделал, отпишусь чуток попозже в этом же посте.

//added
вот

Цитата:
интересует причина такого поведения.


я уже написал выше причину. LAME кушает только 16-bit PCM (по крайней мере я не нашел про поддержку других форматов) так что делаем преобразование 8-bit -> 16-bit сами


//added
кстати, наверное у WAV-файлов надо еще RIFF-заголовок убивать, а то он как данные кодируется (щелчок в самом начале кодированного MP3, вроде оно :) ).

[SIZE="1"][COLOR="Gray"]

Цитата:
написать его я и сам в состоянии

написать напишите, а сорец скорее всего не выложите. а кому-то может и прогодится потом[/COLOR][/SIZE]

278
30 ноября 2010 года
Alexander92
1.1K / / 04.08.2008
Спасибо! По крайней мере, шумы действительно пропали, с остальным буду разбираться. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог