关于歌曲左右声道的问题(100分)

  • 主题发起人 主题发起人 冰冰
  • 开始时间 开始时间

冰冰

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:在directshow中,怎样改变歌曲的左右声道,vcd是怎样改变的?dvd又是怎样改变的?
 
控制音量要用到waveOutSetVlume函数,此函数的声明在MMSystem.h单元中。
此单放在Delphi目录下的Source/rtl/win中

主意这儿用到两个函数waveOutSetVlume和waveOutGetVolume,不要用混,
我第一次用它们时就给搞混了,好费事。

程序如下:

三个TrackBar的属性设置:Max:=255;Frequency:=16;

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, mmsystem;

type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.DFM}

//音量控制
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.TrackBar2Change(Sender: TObject);
var
t,v:Longint;
begin

t:=TrackBar2.Position;
waveOutGetVolume(0,@v);
v:=v and $ffff0000 or (t shl 8);
waveOutSetVolume(0,v);
end;


//右声道控制
procedure TForm1.TrackBar3Change(Sender: TObject);
var
t,v:Longint;
begin

t:=TrackBar3.Position;
waveOutGetVolume(0,@v);
v:=v and $0000ffff or (t shl 24);
waveOutSetVolume(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.

这个我试过会来的
 
哎,这个方法根本就不能解决问题的,不要拿Windows的API来了,这种方法设置了以后2.0的音箱有一个就不能输出了,你说烦不烦嘛?只有一个音箱了还叫立体声?我也正在寻找用软解压的办法来复制左右声道的途径
 
DVD可以加一个DVD的解码器,就可解决了
 
文件数据部分(Data)数据是按一定规则来排列的
例如:单声道:
Sample1 Sample2
声道一 声道一
双声道:
Sample1 Sample2
声道一 声道二 声道一 声道二
3声道:
Sample1 Sample2
声道一 声道二 声道三 声道一 声道二 声道三
......
6声道:
Sample1 Sample2
声道一 声道二 声道三 声道四 声道五 声道六 声道一 声道二 声道三 声道四 声道五 声道六
 
你在用DirectSound来进行播放,可以对其中的任一个声道进行控制
 
关掉一个声道,然后平衡左右声道,但是这样做只能用于两声道。
 
请问syanet大哥,怎么关掉一个声道再平衡左右声道呢,我本来就是使用两声道的,请指教。我的邮箱是:pc-bird@vip.sina.com谢谢你
 
记得是英文里的平衡这个词。我是以前在我哥哥的函数库里看到的。要加入MMSYSTEM。
 
我的E常坏掉。
QQ是 179608325
网站是 lhr.qqvip.com
还有,我应该不是大哥。呵呵
 
怎么叫改变左右省道呢?向超解那样?
我好像还没见到其他的软件有这样的功能。
我想应该没有什么简单的方法,要不然那么多视频播放软件,肯定都会有此功能的
思路我想可以做一个音频数据的传输Filter
 
很简单。只是大家没有去理解MMSYSTEM单元。过几天我要写程序,演示给你们看,就两句代码。
 
调整左右声道平衡用waveOutSetVolume就可以啦,该函数中的volume参数是一个DWORD,低WORD代表左声道,高WORD代表右声道。要调整平衡,只需改变高、低WORD的值为不同即可,调整为0就关掉了。
 
确实是不能分离左右声道,哪位大侠有好的方法能够把左右声道分离出来呀?
上面那种方法不止一个声道不能出声,我的出声的哪个声道还是立体声的,怎么办呢/
 
unit jfMMSystem;

interface

uses
Windows, Messages, SysUtils,Dialogs, Variants, MMSystem,Classes;

const
MCI_SETAUDIO= $873;
MCI_SETVIDEO=$0876;
MCI_DGV_SETAUDIO_SOURCE_LEFT = 1;
MCI_DGV_SETAUDIO_SOURCE_STEREO = 0;
MCI_DGV_SETAUDIO_SOURCE_RIGHT = 2;
MCI_DGV_SETAUDIO_SOURCE = $00004004;
MCI_DGV_SETAUDIO_VALUE = $01000000;
MCI_DGV_SETAUDIO_ITEM = $00800000;
MCI_DGV_SETAUDIO_STREAM = $00004003;
MCI_DGV_SETAUDIO_VOLUME = $00004002;

type MCI_DGV_SETAUDIO_PARMS=record
dwCallback:DWORD;
dwItem:DWORD;
dwValue:DWORD;
dwOver:DWORD;
lpstrAlgorithm:PChar;
lpstrQuality:PChar;
end

function PlayVod(DeviceID:Word;FileName:string;SoundTrack:Byte):Byte;
implementation
//播放函数
function PlayVod(DeviceID:Word;FileName:string;SoundTrack:Byte):Byte;
var
s: MCI_DGV_SETAUDIO_PARMS
err:integer;
buf:array[0..1000] of char;
begin

Result:=1;
if (UpperCase(ExtractFileExt(FileName))='.DAT') or (UpperCase(ExtractFileExt(FileName))='.MP2') then
//转换VCD文件声道.
begin

//先关闭声音
err:=mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_WAIT or MCI_SET_OFF ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;

case SoundTrack of
0: //全声道声道
begin

s.dwValue:=0;
s.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
end;

1: //左声道
begin

s.dwValue:=1;
s.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
end;

2://右声道
begin

s.dwValue:=2;
s.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
end;

end;

err:=mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_WAIT or
MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;


err:=mciSendCommand(DeviceID,MCI_SETAUDIO,
MCI_WAIT or MCI_SET_ON ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;

end
else

if (UpperCase(ExtractFileExt(FileName))='.VOB') or (UpperCase(ExtractFileExt(FileName))='.MPG') then
//转换DVD文件声道.
begin

err:=mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_WAIT or MCI_SET_On ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;

case SoundTrack of
2: s.dwValue:=2;//左声道
1: s.dwValue:=1;
//右声道
end;

s.dwItem:=MCI_DGV_SETAUDIO_STREAM;
mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM,integer(@s));
end
else

Result:=0;
end;


end.
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部