XNA可变音频速度

时间:2010-11-12 13:01:51

标签: video audio synchronization xna

我正在尝试将外部音频文件与以可变帧速率播放的视频同步。当视频播放缓慢时,音频应该减慢速度,加速时它应该加速。

我整理了视频播放,但音频仍然困扰着我。如何以这种方式将视频同步到音频?

我确切地知道哪个视频帧正在播放,所以我希望以某种方式使用这些信息来改变音频速度。但是,仍然困惑于如何。

在我的情况下,如果声音失真并不重要,它只需要始终与视频保持同步。视频播放速度由用户实时控制,无法提前确定。

2 个答案:

答案 0 :(得分:2)

注意:我假设您正在使用Visual Studio 2008/2010,但如果您也在使用XNA Game Studio,那么答案也适用。

您可以使用FMOD library播放音频,它可以完全满足您的需求。

初始设置
你下载windows 32bit API。从那里开始安装后,你将转到“ C:\ Program Files(x86)\ FMOD Sound System \ FMOD Programmers API Win32 \ API ”,复制fmodex.dll和fmodexL .dll到你的项目目录,以及那里的Csharp文件夹的内容。

在项目中,将2个DLL文件和4个类文件添加到项目中,方法是在解决方案资源管理器中右键单击它,然后单击“添加>现有项目...... ” ;将这些文件添加到项目后,在解决方案资源管理器中选择这些文件,并确保其“复制到输出目录”属性设置为“始终复制”。您现在已准备好使用FMOD系统。

使用FMOD
在主类中,使用语句using FMOD;添加以下内容,并添加以下变量:

private FMOD.System sndSystem;
private FMOD.Channel sndChannel = new FMOD.Channel();
private FMOD.Sound sndSound = new FMOD.Sound();

在你的LoadContent()

FMOD.Factory.Create_System(ref sndSystem);
sndSystem.Init(1, INITFLAGS.NORMAL, (IntPtr)null);
sndSystem.CreateSound("**<Path To Your Audio>**", MODE.HARDWARE, ref sndSound);

现在,无论你想开始播放你的声音,你只需输入:

sndSystem.PlaySound(CHANNELINDEX.FREE, sndSound, false, ref sndChannel);

并阻止它:

sndChannel.stop();

出于您的目的,当音频播放视频时,您可以确定视频在该点的播放速度,(正常速度为1.0f,双速为2.0f,半速为.5f等) )并将该值传递给sndSound.setMusicSpeed(<speedvalue>);

答案 1 :(得分:0)

您的请求成功之路可能是漫长而艰巨的。似乎可以按照你的要求去做,但因为MediaPlayer类的PlayPosition属性是readonly,所以相当困难。这是a link that may help激励你。