怎样实现左右声道各自播放多个wav文件而互不影响 ( 积分: 200 )

  • 主题发起人 主题发起人 求索客
  • 开始时间 开始时间

求索客

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样实现左右声道各自播放多个wav文件而互不影响,通过变量随时给程序提供要播放的音频文件,我是在要为com1 /com2 两个串口提供音频反馈 每个串口传来数据,根据数据反馈不同的声音,实际上是要为两个终端分别提供音频提示,而互不干扰 。提供详细解决办法的,还可以再加分数。急等消息。明天结贴。[:)][red][/red][h2][/h2]
 
怎样实现左右声道各自播放多个wav文件而互不影响,通过变量随时给程序提供要播放的音频文件,我是在要为com1 /com2 两个串口提供音频反馈 每个串口传来数据,根据数据反馈不同的声音,实际上是要为两个终端分别提供音频提示,而互不干扰 。提供详细解决办法的,还可以再加分数。急等消息。明天结贴。[:)][red][/red][h2][/h2]
 
看来大富翁走下坡路拉,我是要声卡的两个通道单独使用,
 
我也想知道了
 
我现在知道怎样实现这一功能拉,需要开两个线程分别控制左右声道,一个线程让左声道静音,一个线程让另一个声道静音就可以实现这个功能, 可不要问我喇叭没有声音噢!
 
只可惜 我对线程还不了解,做起来力不从心阿
 
送给声卡的声音数据已经包含了左右声道,二左右声道的数据是交替存放的,以16bit数据为例,第一个Word是送给左声道,第二个word是送给右声道,第三个又是左声道....如此交替下去。所以你只要把数据重新组合总给声卡,应该就能实现
 
有没有办法关闭一个声道,然后通过两个线程分别播放声音这样每个线程就只播放一个声道的声音。
 
能否关闭一个声道要看声卡本身是否支持,然后通过声卡驱动来控制。目前看起来似乎都没有提供这样的功能。
 
slug:
请教:WAV文件中,从第X字节开始是左右声道的数据?你说“第一个word是送给左声道”的,word中的数据是不是声音的频率?或者怎样得到这个数据中的频率?
  急需!谢谢!
 
数据不是频率,而是幅度,用音频编辑软件打开一个WAVE文件可以看到他的波形,这个波形实际上就是他所有的值因为大小不同连成了这样一条曲线。比如说第1个值是1,第三个值是2,第5个值是3...以此类推到第99个值是50,这样左声道的音频数据连成的是一条斜线。
第2,4,6,8...的值则连成右声道数据的波形。

这是时域信息,如果要得到频率信息则要进行FFT变换了。

对于让声卡播放WAVE文件时不需要转换成频率信息的,只要把这些原始的数据送给声卡就可以了
 
这要看你具体是用什么来做播放部分的啊,我用MMTOOLS做播放器,声道控制处理直接修改WAVE数据,代码如下:
procedure TForm1.MMDSPInterface1BufferFilled(Sender: TObject;
lpWaveHdr: PWaveHdr);
var
k, i, m : integer;
left, right, x : float;
buf:array[0..65535] of SmallInt ;
begin

CopyMemory(@buf,lpWaveHdr.lpData,lpWaveHdr.dwBufferLength);
m:= lpWaveHdr.dwBufferLength div 2;
if MMAudioFile1.Volume<8 then

for i:=0 to m-1do
begin

buf:=0;
end;

m:=m div 2;
if PMenushengdao.Items[0].Checked then
begin

//for i:=0 to m-1do
begin
BufL:=buf[i*2];
BufR:=buf[i*2+1];
end;

end else
begin

if PMenushengdao.Items[1].Checked then
begin

for i:=0 to m-1do
begin
buf[i*2]:=0;
end;

//左声道
end else
begin

if PMenushengdao.Items[2].Checked then
begin
//右声道
for i:=0 to m-1do
begin
buf[i*2+1]:=0;
end;

end else
begin

if PMenushengdao.Items[3].Checked then
begin
//左右混合
for i:=0 to m-1do
begin
buf[i*2]:=(buf[i*2]+buf[i*2+1]) div 2;
buf[i*2+1]:=buf[i*2];
end;


end else
begin

if PMenushengdao.Items[4].Checked then
begin
//50%混合
for i:=0 to m-1do
begin

left := buf[i*2] + buf[i*2+1] * 0.5;
right := buf[i*2+1] + buf[i*2] * 0.5;
if (left>32767) then
left:=32767
else
if left<-32767 then
left:=-32767;
if (right>32767) then
right:=32767
else
if right<-32767 then
right:=-32767;
buf[i*2]:=trunc(left);
buf[i*2+1] := trunc(right);
end;

end else
begin

if PMenushengdao.Items[5].Checked then
begin
//左右反相
for i:=0 to m-1do
begin
buf[i*2]:= -buf[i*2];
end;

end else
begin

if PMenushengdao.Items[6].Checked then
begin
//左右对换
for i:=0 to m-1do
begin
k:=buf[i*2+1];
buf[i*2+1]:=buf[i*2];
buf[i*2]:=k;
end;

end else
begin

if PMenushengdao.Items[7].Checked then
begin
//左-->左右
for i:=0 to m-1do
begin
buf[i*2]:=buf[i*2+1];
end;

end else
begin
//右-->左右
for i:=0 to m-1do
begin
buf[i*2+1]:=buf[i*2];
end;


end;

end;

end;

end;

end;

end;

end;

end;

CopyMemory(lpWaveHdr.lpData,@buf,lpWaveHdr.dwBufferLength);
if EQonoff.Tag = 1 then

MMEqualizers1.Process(lpWaveHdr.lpData,lpWaveHdr.dwBufferLength);
//if (MMSliderWaveVolume.Position <>8192) then
begin

CopyMemory(@buf,lpWaveHdr.lpData,lpWaveHdr.dwBufferLength);
x := MMSliderWaveVolume.Position / 8192;
for i:=0 to m-1do
begin

left := buf[i*2]*x;
right := buf[i*2+1]*x;
if (left>32767) then
left:=32767
else
if left<-32767 then
left:=-32767;
if (right>32767) then
right:=32767
else
if right<-32767 then
right:=-32767;
buf[i*2]:=trunc(left);
buf[i*2+1] := trunc(right);
end;

CopyMemory(lpWaveHdr.lpData,@buf,lpWaveHdr.dwBufferLength);
//end;

AutoPosTion:=False;
MMSlider33.Position := MMAudioFile1.Position;
AutoPosTion:=True;
end;
 
看看我的动态放大声音的程序哈
他是以Balancer为基础修改的,动态放大声音的(需要DSPACK)
用DSPACK播放一个wav文件,通过Balancer设置为左声道
再用DSPACK播放一个wav文件,通过Balancer设置为右声道

http://www.delphibbs.com/keylife/iblog_show.asp?xid=19373
http://www.delphibbs.com/keylife/iblog_show.asp?xid=19374
 
好像懂了一点,好像又不懂一点
好像明白了点,好像又晕菜了点
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部