音频.左右声道单独输出不同的wav文件 (200分)

  • 主题发起人 主题发起人 ffhello
  • 开始时间 开始时间
F

ffhello

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么做到,左右声道单独输出?各位高手,帮帮我!
左右声道播放不同wav文件的声音,
好像用waveoutopen这类的做不到!

混响行吗?

给点提示,也感谢!

在线等待..
 
都不回贴,唉
 
你都不说明你用什么方式播放你的声音文件
 
一个设想:用两个线程,分别放两个文件,一个只放左声道,另一个只放右声道。然后控制线程的音量来模拟控制左右声道。
 
这个资料你看看???
//音量控制
procedure TForm1.TrackBar1Change(Sender: TObject);
var
t,v:Longint;
begin

// if a=0 then
Exit;
t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
waveOutSetVolume(0,v);
end;


procedure tform1.trackbar1changer (sender:tobject);//左声道
var t,v:longint;
begin

t:=trackbar1.postion;
wavoutgetvolume(0,@v);
v:=v and $ffff0000 or (t shl 8);
wavoutsetvolume(0,v);
end;


procedure tform1.trackbar2changer (sender:tobject);//右声道
var t,v:longint;
begin

t:=trackbar2.postion;
wavoutgetvolume(0,@v);
v:=v and $0000ffff or (t shl 24);
wavoutsetvolume(0,v);
end;


//获得当前音量值
procedure TForm1.FormCreate(Sender: TObject);
var
v:longint;
begin

waveOutGetVolume(0,@v);
TrackBar2.Position:=hi(v);
TrackBar3.Position:=hi(v shr 16);
if hi(v)>hi(v shr 16) then

TrackBar1.Position:=hi(v)
else

TrackBar1.Position:=hi(v shr 16);
end;


end.



函数说明:

waveOutSetVolume
第一个参数是波形文件输出设备标识符;
第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量,
高16位表示右声道的音量。

waveOutGetVolume
第一个参数是波形文件输出设备标识符;
第二个参数是一个32位整数的指针。


可以用auxoutsetvolume(id:integer,volume:dword);具体使用方法请查阅DELPHI帮助,WIN32SDK.HLP。 其中ID是设备代号,我在实际编程中发现ID随着机器的不同而不同,但是他可以直接控制各种设备的音量,你可以用不同的ID试一试(ID一般在1~8之间),音量设置方法wjiachun好象没错!
 
播放一个wav文件时,只能让一个声道输出,
 
感谢发言:
waveOutSetVolume能设置左,右声道的音量,
我要的是播放wav文件时,只让其中一个声道发声,另一个声道的音量不设为0
比如:我一个程序内播放两个wav文件,
在播放nihao.wav时让左声道输出,右声道不输出
同时,播放he.wav让右声道输出,左声道还是nihao.wav的声音,
用waveoutwrite这类函数播放时,左右声道都会有输出,它不管你的wav文件是单声道的!
 
waveOutSetVolume
用不了,是否要加入什么单元文件
 
uses MMSystem;
 
这个源码是没有用的只能控制左右声道不能双声道输出
你用进程控制一下试试
这个论坛以前有过相关的文章你去找找看
mmtools这个控件是很好的可是找不到破解版
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MMsystem;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

function mmioFOURCC(ch1,ch2,ch3,ch4:Char):Dword;
var
Tem:Dword;
begin

Result:=Dword(ch1);
Tem:=Dword(ch2);
Tem:=Tem Shl 8;
Result:=Result+Tem;
Tem:=Dword(ch3);
Tem:=Tem Shl 16;
Result:=Result+Tem;
Tem:=Dword(ch4);
Tem:=Tem Shl 24;
Result:=Result+Tem;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
Hmio:HMMIO;
mmckinfoParent:TMMCKINFO;
mmckinfoSubChunk:TMMCKINFO;
dwFmtSize:DWORD;
DWResult:DWORD;
hFormat:Thandle;
pFormat:PWAVEFORMATEX;
dwDataSize:DWORD;
wBlockSize:WORD;
lpData:Pchar;//Thandle;
FWaveOut:HWAVEOUT;
lpWaveHeader:Pwavehdr;
begin

Hmio:=mmioOpen('d:/Fang.wav',nil,MMIO_READ+MMIO_ALLOCBUF);
if HMIO=0 then

begin

ShowMessage('打开音频文件出错!');
end;

mmckinfoParent.fccType:=mmioFOURCC('W','A','V','E');
if(mmioDescend(HMIO,@mmckinfoParent,nil,MMIO_FINDRIFF)<>MMSYSERR_NOERROR) then

begin

ShowMessage('打开音频文件出错!MMiodescend');
end;

mmckinfoSubChunk.ckid:=mmioFOURCC('f','m','t',' ');
if(mmioDescend(HMIO,@mmckinfoSubChunk,@mmckinfoParent,MMIO_FINDCHUNK)<>MMSYSERR_NOERROR) then

begin

ShowMessage('打开音频文件出错!MMiodescend');
end;

dwFmtSize:=mmckinfoSubChunk.cksize;
hFormat:=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(hFormat=0) then

begin

ShowMessage('申请内存出错!');
end;

pFormat:=LocalLock(hFormat);
if (pFormat=nil) then

begin

ShowMessage('取内存首址出错!');
end;

if(mmioRead(Hmio,Pchar(pFormat),dwFmtSize)<>dwFmtSize) then

begin

ShowMessage('取内存首址出错!');
end;

if (waveOutOpen(@FWaveOut,WAVE_MAPPER,pFormat,0,0,WAVE_FORMAT_QUERY)<>MMSYSERR_NOERROR ) then

begin

ShowMessage('不支持此格式!');
end;

mmioAscend(hmio,@mmckinfoSubchunk,0);
mmckinfosubchunk.ckid:=mmiofourcc('d','a','t','a');
if mmioDescend(hmio,@mmckinfoSubchunk,@mmckinfoParent,MMIO_FINDCHUNK)<>MMSYSERR_NOERROR then

begin

ShowMessage('找不到数据块!');
end;

dwDataSize:=mmckinfoSubChunk.cksize;
if (dwDataSize=0) then

begin

ShowMessage('找不到数据块!');
end;

// pformat.nChannels:=0;
showmessage(inttostr(pformat.nChannels));
showmessage(inttostr(pformat.wFormatTag));
if (waveOutOpen(@FWaveOut,WAVE_MAPPER,pFormat,0,0,0)<>MMSYSERR_NOERROR ) then

begin

ShowMessage('打开波形出错!');
end;

wBlockSize:=pFormat.nBlockAlign;
LocalUnlock(hFormat);
LocalFree(hFormat);
lpData:=GlobalAllocPtr(GMEM_MOVEABLE+GMEM_SHARE,dwDataSize);
if (lpData=nil) then

begin

showmessage('分配内存出错11');
end;

if mmioRead(hmio,lpData,dwDataSize)<>dwDataSize then

begin

showmessage('读数据出错!');
end;

mmioClose(hmio,0);
lpWaveHeader:=GlobalAllocPtr(GMEM_MOVEABLE+GMEM_SHARE,SizeOf(WaveHdr));
if (lpWaveHeader=nil) then

begin

showmessage('分配内存出错!');
end;

lpWaveHeader.lpData:=lpdata;
lpWaveHeader.dwBufferLength:=dwDataSize;
lpWaveHeader.dwFlags:=0;
lpWaveHeader.dwLoops:=0;
if(WaveOutPrepareHeader(Fwaveout,lpWaveHeader,SizeOf(WaveHdr))<>MMSYSERR_NOERROR )then

begin

showmessage('不能定位头');
end;

dwresult:=WaveOutWrite(fwaveout,lpWaveHeader,sizeof(wavehdr));
end;


end.

播放wav的代码,改写的,有
 
分给大家!
 
多人接受答案了。
 
后退
顶部