我想将MP3文件与Delphi 2010混合使用。
这可能吗?有没有人知道我可以用component
(套)完成这项工作?或者也许是运行时库?有经验混合MP3文件的人提示吗?
答案 0 :(得分:5)
答案 1 :(得分:4)
FFmpeg有pascal头文件,显然你可以在delphi中使用:http://www.iversenit.dk/dev/ffmpeg-headers/
这应该允许您轻松加载mp3或任何其他文件类型。
答案 2 :(得分:3)
Bass.dll,http://www.un4seen.com/
答案 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.