关于声道转换(200分)

  • 主题发起人 主题发起人 gaoygaoy
  • 开始时间 开始时间
G

gaoygaoy

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在程序中实现MPEG的声道转换?(即播放VCD时的原唱/伴唱)
 
普通音频的左右平衡调节
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=777748

上面的方法好像对DorectX音频的调节不起作用
需要通过IBasicAudio接口的put_Balance进行调节
 
该方法已经试过,没有效果。请问还有别的方法吗?例如利用mciSendCommand?
 
如果播放器使用DirectShow ,用我说得 put_Balance,
 
你可以参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=913008
这个控件架构来获得IBasicAudio接口
 
在MSDN中对Balance的说明是:-10,000到10,000。-10,000是全部声音都在左边的
扬声器(Speaker),10,000则是右边,并非声音通道
 
应该是声音通道没错,我以前有试验过的,可惜手头没有双声道avi来试试
 
可能我没有把问题描述清楚,现详述如下:
我在写一个卡拉OK点唱系统,源文件是VCD上拷贝下来的.dat文件,用mciSendCommand播放
,设备类型是MPEGVideo,当用MCI_PLAY播放时默认是第一通道,即只有伴奏,我想实现
自由切换原唱/伴奏。
例如Windows自带的媒体播放器中可以选择文件-〉属性-〉高级-〉过滤器属性中的
MPEG Audio Decoder,可以选择声音通道实现转换。
 
Mpeg研究不多,看了看Microsoft上面的介绍,和 IMpegAudioDecoder 接口有关,这个接口
并没有公开资料,到 http://www.tamaracka.com/ 的 microsoft 新闻组搜索一下吧,在下
无能为力了
 
有结果说一声,让在下也学学!
 
???
把先前的SetAudioDecoderMode代码替换一下看看

procedure TDSPlayer.SetAudioDecoderMode(Mode: TDSAudioModel);
var
ifg: IFilterGraph;
ibf: IBaseFilter;
dsFetched : ULONG;
enumFilters : IEnumFilters;
fi: TFilterInfo;
begin

if not Assigned(FdsGraphBuilder) then
Exit;
if Succeeded(FdsGraphBuilder.QueryInterface(IID_IFilterGraph, ifg)) then

begin

FdsMpegAudioDecoder := nil;
enumFilters := nil;

If Succeeded(FdsGraphBuilder.EnumFilters(enumFilters)) then

begin

While Succeeded(enumFilters.Next(1, ibf, Addr(dsFetched)))do

begin

ibf.QueryFilterInfo(fi);
ShowMessage(fi.achName);
// 显示一下Filter的名字

if Succeeded(ibf.QueryInterface(IID_IMpegAudioDecoder, FdsMpegAudioDecoder)) then

begin

// AM_MPEG_AUDIO_DUAL_MERGE = 0;
// AM_MPEG_AUDIO_DUAL_LEFT = 1;
// AM_MPEG_AUDIO_DUAL_RIGHT = 2;
// TDSAudioModel = (amMerge, amLeft, amRight);
FdsMpegAudioDecoder.put_DualMode(Integer(Mode));
end;

end;


// Destory prior Interface
enumFilters := nil;
end;


(* if Succeeded(ifg.FindFilterByName('MPEG Audio Decoder', ibf)) then

begin

if Succeeded(ibf.QueryInterface(IID_IMpegAudioDecoder, FdsMpegAudioDecoder)) then

begin

// AM_MPEG_AUDIO_DUAL_MERGE = 0;
// AM_MPEG_AUDIO_DUAL_LEFT = 1;
// AM_MPEG_AUDIO_DUAL_RIGHT = 2;
FdsMpegAudioDecoder.put_DualMode(Integer(Mode));
{case Mode of
amLeft: FdsMpegAudioDecoder.put_DualMode(AM_MPEG_AUDIO_DUAL_LEFT);
amRight: FdsMpegAudioDecoder.put_DualMode(AM_MPEG_AUDIO_DUAL_RIGHT);
amMerge: FdsMpegAudioDecoder.put_DualMode(AM_MPEG_AUDIO_DUAL_MERGE);
end;
}
end;

end;

*)
end;

end;

 
DragonPC_???:
有opc的资料吗?
 
DragonPC_???兄:
上述程序中 ifg.FindFilterByName('MPEG Audio Decoder', ibf)不能成功,当然也得不到
IID_IMpegAudioDecoder的接口了。
我也试过先得到 CLSID_CMpegAudioCodec的IUnknown 或IBaseFilter 接口,(已经成功了)
,但从IUnknown 或 IBaseFilter QueryInterface IID_IMpegAudioDecoder 却是失败的。
 
我怀疑微软在uuids.h文件中公开的IID_IMpegAudioDecoder 接口是为了以后
开放,目前的实际接口中的GUID根本就不是IID_IMpegAudioDecoder 。
 
will, 算了,我手头资料太少,microsoft又没有提供,关键的是我连VCD都没有一张,也
不好测试,罢了,兄弟自己看着办吧,其实应该很简单的,FindFilterByName不成功,你可以
尝试枚举所有Filter,就像DestroyMovieInterface方法里面调用的那样,然后一个一个
IBaseFilter QueryInterface IID_IMpegAudioDecoder 直到成功为止,我TMD就不信搞不定
 
mcisendstring('setaudio openfile source to left',nil,0,0);左声道
mcisendstring('setaudio openfile source to right',nil,0,0);右
mcisendstring('setaudio openfile source to stereo',nil,0,0);立体声
搞定
 
To hysuser:
您是高人!
 
后退
顶部