2011-10-12 185 views
6

我在用monotouch构建一个应用程序。基本上我需要在应用程序加载后立即播放mp3。 在main.cs我主推控制器之前加入这个片段:用单声道播放mp3

AVAudioPlayer player = new AVAudioPlayer(); 
NSUrl mediaFile = NSUrl.FromFilename("Content/Audio/music1.mp3"); 

player = AVAudioPlayer.FromUrl(mediaFile); 
player.Delegate = new PlayerDelegate(); 

if(player.PrepareToPlay()){ 
    player.Play(); 
} 

但是当我启动应用程序,我能听到的声音大约半秒,然后什么都没有。 此代码是否正确或者有问题?

感谢

回答

7

很难给出答案没有更多的情况下,像更多的代码:-)

我怀疑你的AVAudioPlayer,如果用作局部变量,可以通过垃圾收集器(GC)时,采集方法(是否FinishedLaunching?)返回。

如果是这种情况,那么促进当地player变量到现场将确保一个参考保持到AVAudioPlayer实例,并应允许不中断(或崩溃)播放。

如果我错了,请编辑您的问题,并提供给我们更多的上下文,我们应该能够进一步帮助你。

+0

我只是调用一个函数播放内部的音频 public override bool FinishedLaunching(UIApplication app, NSDictionary选项) { PlayAudio(); } 和PlayAudio函数包含我的问题代码 – iFrankz

+0

对不起,状态不清楚?它是否工作(我会假设,因为你接受了答案)?需要记住的重要一点是''player'在* FinishedLaunching返回后继续工作/播放*,因此该对象的实例仍然需要* alive *(并且未收集)。 – poupou

+0

是的,我将变量提升为一个字段并且工作。我认为这个问题与GC的行动有关。非常感谢poupou – iFrankz

0

尝试注册为AVAudioPlayerDelegate并在audioPlayerEndInterruption方法再次开始了音乐。

+0

Ralfonso您好,感谢您的回复。我试过这样的: 'AVAudioPlayer player = new AVAudioPlayer();' 'NSUrl mediaFile = NSUrl.FromFilename(“Content/Audio/music1.mp3”);' 'player = AVAudioPlayer.FromUrl(mediaFile);' 'player.Delegate =新AVAudioPlayerDelegate();' \t \t \t 'player.EndInterruption + =委托(对象发件人,EventArgs的){'' player.Play();'' };' \t \t \t '如果(player.PrepareToPlay()){'' player.Play();'' }' 但现在甚至更糟。应用程序在开始播放时崩溃 – iFrankz

+1

我对MonoTouch并不太熟悉,但我知道在Objective-C中开发时,当将资源添加到项目时,Xcode会默默地做很多事情。确保没有可能的文件格式错误(尝试一个.wav),或从主包中加载文件。一个例子是这里:[link] http://www.techotopia.com/index.php/Playing_Audio_on_i_ iPhone_using_AVAudioPlayer_(iOS_4)#Support_Audio_Formats – Ralfonso

0

现在,它真的很容易:

  //enable audio 
      AudioSession.Initialize(); 

      //load the sound 
      sound = SystemSound.FromFile("Sounds/rev.wav"); 
      sound.PlaySystemSound();