如何混合Mp3文件

时间:2011-06-07 10:07:11

标签: delphi mp3 delphi-2010 mixing

我想将MP3文件与Delphi 2010混合使用。

这可能吗?有没有人知道我可以用component(套)完成这项工作?或者也许是运行时库?有经验混合MP3文件的人提示吗?

9 个答案:

答案 0 :(得分:5)

我使用newAc:

http://symmetrica.net/newac/

它有一个soundmixer组件并支持mp3输入。

干杯!

答案 1 :(得分:4)

FFmpeg有pascal头文件,显然你可以在delphi中使用:http://www.iversenit.dk/dev/ffmpeg-headers/

这应该允许您轻松加载mp3或任何其他文件类型。

答案 2 :(得分:3)

答案 3 :(得分:2)

如果混合两个mp3文件意味着混合音频信号,则需要首先解码mp3。

虽然mp3包含一个分解的信号结构(音频信号的fft),但两个独立的mp3文件在编码格式上可能会有太大差异,无法尝试混合未解码的音频。

对于解码和编码,您需要像lame这样的编码器将mp3转换为wav文件。虽然流式传输(DirectShow过滤器)很适合进行解码,但混合编码应该可以通过调用命令行界面来轻松处理。

跛脚编码器/解码器二进制文件可用于Windows。混合wav并不是很复杂,因为你基本上用(a + b)/ 2覆盖每个通道。

答案 4 :(得分:2)

如果你的混音/解码/播放,我会使用libmad库,因为它是最快最准确的mp3解码库,因为它使用整数数学来解码。

这里有一个delphi pas文件:

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

它非常简单易用。然后你需要混合你的两个流,这取决于你选择使用的数据格式,我建议浮动,这样你就不会失去精度。

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

乘以0.5与除以2相同,但要快得多。

答案 5 :(得分:1)

您也可以使用gstreamer

执行此操作

答案 6 :(得分:1)

MP3文件操作的可能选择很少:http://www.torry.net/authorsmore.php?id=3243

在我看来,音频工具库看起来最有前途,因为包括MPEG解析......我没有使用任何这样的工具jet,但它在我的日程安排中......

ALSO ,如前所述,MP3是压缩格式,这意味着您需要在实际活动之前解压缩文件中的二进制信息。

希望它有所帮助!

干杯,HX。

答案 7 :(得分:1)

Directshow也可用于此任务。在一个名为DSPack的包中有针对Directshow的Delphi头文件。

从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
lame
razorlame (lame interop for delphi)

答案 8 :(得分:0)

你可以使用bass,Bassenc和lame encoder来做到这一点。

http://www.rarewares.org/mp3-lame-bundle.php下载lame编码器 来自http://www.un4seen.com/的贝司 将bass.dll,bass.pas,Bassenc.dll,bassenc.pas和lime.exe放在与项目exe文件相同的文件夹中。 使用示例代码在表单上放置一个listbox,opendialog和两个按钮

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.