Как смешивать Mp3 файлы - PullRequest
3 голосов
/ 07 июня 2011

Я хотел бы смешать файлы MP3 с Delphi 2010.

Возможно ли это? Кто-нибудь знает component (набор), который я мог бы использовать, чтобы сделать это? Или, может быть, библиотека времени выполнения? Какие-нибудь подсказки от кого-то с опытом смешивания файлов MP3?

Ответы [ 9 ]

5 голосов
/ 15 июня 2011

Я использую newAc:

http://symmetrica.net/newac/

имеет компонент soundmixer и поддерживает входы mp3.

Ура!

4 голосов
/ 10 июня 2011

FFmpeg имеет заголовки паскалей, которые, очевидно, вы можете использовать из delphi: http://www.iversenit.dk/dev/ffmpeg-headers/

Это должно позволить вам легко загружать mp3-файлы или файлы любого другого типа.

3 голосов
/ 07 июня 2011
2 голосов
/ 16 июня 2011

Если вы микшируете / декодируете / проигрываете, я бы использовал библиотеку libmad, так как это самая быстрая и точная библиотека для декодирования mp3, так как для декодирования используется целочисленная математика.

Здесь есть файл delphi pas:

http://www.koders.com/delphi/fid7D732610F6E36ABA5CE09F5C6D3060FBB74B998E.aspx?s=mp3

Это довольно просто в использовании.Затем вам нужно смешать два потока, что зависит от формата данных, в котором вы работаете, я рекомендую использовать float, чтобы не потерять точность.

for i = 0 to samples do
  out[i] = (in1[i] + in2[i]) * 0.5;

Умножение на 0,5 такое же, как деление на2, но намного быстрее.

2 голосов
/ 15 июня 2011

Если микширование двух mp3-файлов означает микширование аудиосигнала, необходимо сначала декодировать mp3.

В то время как mp3 содержит разложенную структуру сигнала (fft аудиосигнала), два независимых mp3-файла, вероятно, тоже будут отличатьсямного в формате кодирования, чтобы сделать любую попытку микширования не декодированного звука.

Для декодирования и кодирования вам нужен кодер, такой как lame, для конвертации mp3 в wav-файлы.В то время как потоковая передача (DirectShow Filters) хороша для декодирования, смешивать, кодировать должно быть достаточно легко, вызывая интерфейс командной строки.Микширование wav не очень сложно, так как вы накладываете каждый канал на (a + b) /2.

1 голос
/ 27 июня 2011

Directshow также может быть использовано для этой задачи. В пакете под названием DSPack .

имеются заголовочные файлы Delphi для Directshow.

Со страницы DSPack:

DSPack представляет собой набор компонентов и класс для написания мультимедийных приложений используя MS Direct Show и DirectX технологии.

Для создания mp3-файла в результате наложения звука из двух входных файлов вам необходимо будет распаковать два аудиофайла, выполнить микширование и повторно сжать их снова. В обоих случаях вам нужно будет просмотреть аудиосэмплы обоих файлов, обработать каждый канал независимо и усреднить значения из input1 и input2 в вашем выходном файле. Это было бы что-то вроде: outsamples[i] := insamples1[i]/2 + insamples2[i]/2;. Для лучшей производительности можно использовать выражение outsamples[i] := insamples1[i] shr 1 + insamples2[i] shr 1;.

Для подхода, обеспечивающего максимальное улучшение как производительности, так и качества звука, я рекомендую этот post , он в основном предлагает использовать следующее выражение (A и B - это 0-1 нормализованные аудиосэмплы):

Z = 2·A·B if both A<0.5 and B<0.5
Z = 2(A+B) – 2·A·B – 1 otherwise

Другие ресурсы, которые могут помочь:
FFmpeg
хромает
razorlame (хромое взаимодействие для delphi)

1 голос
/ 16 июня 2011

Существует несколько возможных вариантов манипулирования файлами MP3: http://www.torry.net/authorsmore.php?id=3243

По моему скромному мнению, библиотека Audio Tools выглядит наиболее многообещающе, поскольку в нее включен синтаксический анализ MPEG ... Я не использовал ни одного из таких инструментов, хотя в моем расписании это есть ...

ТАКЖЕ , как отмечалось выше, MP3 - это сжатый формат, что означает, что вам нужно распаковать перед фактической деятельностью с двоичной информацией внутри файла.

Надеюсь, это поможет!

Приветствия, HX.

1 голос
/ 15 июня 2011

Вы также можете сделать это, используя gstreamer

0 голосов
/ 09 декабря 2017

Вы можете сделать это с помощью баса, Bassenc и lame encoder.

скачать кодировщик от lame http://www.rarewares.org/mp3-lame-bundle.php и бас от http://www.un4seen.com/ Поместите bass.dll, bass.pas, Bassenc.dll, bassenc.pas и lime.exe в ту же папку, что и исполняемый файл проекта. для использования примера кода поместите в форму список, опендиал и две кнопки

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, bass, bassenc,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  //
  if OpenDialog1.Execute then
    ListBox1.items.add(OpenDialog1.FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  decoder, encoder, newdecoder: dword;
  I, R: Integer;
  buf: array [1 .. 204800] of byte;


begin
  for I := 0 to ListBox1.items.count - 1 do
  begin
    if I = 0 then
    begin
      decoder := BASS_StreamCreateFile(FALSE, PChar(ListBox1.items.strings[0]),
        0, 0, BASS_STREAM_DECODE or BASS_UNICODE);
      encoder := BASS_Encode_Start(decoder,
        'lame.exe --alt-preset standard - fulltrack.mp3',
        BASS_ENCODE_AUTOFREE or BASS_UNICODE, nil, nil);

    end
    else
    begin
      newdecoder := BASS_StreamCreateFile(FALSE, PChar(ListBox1.items.strings[I]
        ), 0, 0, BASS_STREAM_DECODE or BASS_UNICODE);



      if not BASS_Encode_SetChannel(encoder, newdecoder) then
      begin
        showmessage(inttostr(BASS_ErrorGetCode));
        BASS_StreamFree(decoder);
        continue;
      end;
      BASS_StreamFree(decoder);

   // free the old decoder
      decoder := newdecoder;
    end;

    R := 1;
    while R > 0 do
    begin
      R := BASS_ChannelGetData(decoder, @buf, sizeof(buf));
    end;

  end;

  BASS_StreamFree(decoder); // free the decoder
  BASS_Encode_Stop(encoder); // stop the encoder
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not BASS_Init(-1, 44100, 0, handle, nil) then
    showmessage('Error initializing audio!');
end;

end.
...