Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как продолжить запись MP3 файла без потери качества при использовании BASSenc и LAME

Delphi , Мультимедиа , Запись звука

Приложение, записывающее аудио с микрофона и использующее BASSenc для кодирования записи в MP3 с помощью LAME, может продолжать сессию записи при перезапуске. Однако, как правильно продолжить поток записи/кодирования?

Текущий подход заключается в открытии старого файла с помощью BASS_StreamCreateFile, запуске записи и кодировщика, а затем чтении всего файла с помощью BASS_ChannelGetData и BASS_Encode_Write для «переноса» предыдущих данных. Но этот шаг может занимать больше времени по мере увеличения записи, и он, возможно, является с потерями, поскольку загружается сжатый MP3 и перекодируется, теряя еще больше информации.

Можно ли просто сказать BASSenc/LAME использовать существующий файл и добавлять в него данные напрямую? Или уже используется правильный подход?

Подтвержденный ответ:

К сожалению, нельзя напрямую добавлять новые, несжатые данные в сжатый поток без предварительного декомпрессирования. Таким образом, текущий подход кажется разумным.

Размер действительно может стать проблемой в зависимости от максимальной запланированной длины записей. Однако на современных настольных машинах обработка несжатых и сжатых потоков до 1 ГБ, как правило, не вызывает серьезных задержек.

Чтобы оптимизировать процесс, не загружайте данные старой сессии перед записью новых данных, а вместо этого читайте их перед сохранением новой сессии на диск. Таким образом, запись можно начать немедленно, не выделяя все больше и больше ОЗУ для процесса каждый раз.

«Правильный» и «неправильный» становятся очевидными по результатам. Лучший метод всегда тот, который дает наилучшие результаты с наименьшими усилиями.

Многократное перекодирование, по моему мнению, не должно влиять на качество, если вы не использовали сжатый кодек.

Если вам нужен исходный код в поддержку этого, дайте знать.

Пример кода на Object Pascal (Delphi):

procedure TForm1.ContinueRecording(const OldFileName: string; const NewFileName: string);
var
  OldStream: TBASSStream;
  NewStream: TBASSStream;
  Data: array of Double;
  BytesWritten: Integer;
begin
  // Открыть старый файл
  OldStream := BASS_StreamCreateFile(OldFileName, BASS_STREAM_DECODE | BASS_STREAM_READ, 0, 0, 0);

  // Создать новый файл для записи
  NewStream := BASS_StreamCreateFile(NewFileName, BASS_STREAM_ENCODE | BASS_STREAM_WRITE, 0, 0, 0);

  // Записать старые данные в новый файл
  repeat
    BytesWritten := BASS_ChannelGetData(OldStream, @Data[0], Length(Data), BASS_DATA_FLOAT);
    if BytesWritten > 0 then
      BASS_Encode_Write(NewStream, @Data[0], BytesWritten);
  until BytesWritten = 0;

  // Закрыть старый файл
  BASS_StreamFree(OldStream);

  // Начать новую запись в новый файл
  // ...
end;

В этом примере кода старые данные из старого файла записываются в новый файл, а затем старый файл закрывается. После этого можно начать новую запись в новый файл.

Создано по материалам из источника по ссылке.

Как продолжать запись MP3 файла без потери качества при использовании BASSenc и LAME.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Запись звука ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-04 04:09:03/0.0075020790100098/1