使用Monotouch播放MP3

6
我正在使用 Monotouch 构建一个应用程序。基本上,我需要在应用程序加载时立即播放 MP3 音频。 在 main.cs 中,在推送主控制器之前,我添加了以下代码片段:
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();
}

但是当我启动应用程序时,我可以听到大约半秒钟的声音,然后什么也没有了。

这段代码是否正确或存在问题?

谢谢。

3个回答

7

如果没有更多的上下文,比如更多的代码,很难提供一个答案 :-)

我怀疑你的AVAudioPlayer如果被用作局部变量,当方法(是FinishedLaunching吗?)返回时可能被垃圾收集器(GC)回收。

如果是这样的话,将你的局部player变量提升为字段会确保对AVAudioPlayer实例保持引用,并允许它播放而不被中断(或崩溃)。

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


我只需调用一个函数来从内部播放音频public override bool FinishedLaunching (UIApplication app, NSDictionary options) { PlayAudio(); }而PlayAudio函数包含了我问题中的代码 - iFrankz
抱歉,状态不明确?是否正常运行(因为您接受了答案,我会这样假设)?需要记住的重要部分是,在 FinishedLaunching 返回后,player 继续工作/播放,因此该对象的实例仍然需要保持“存活”状态(而不是被收集)。 - poupou
是的,我将变量提升为字段,然后它就起作用了。我猜问题与GC的操作有关。非常感谢,poupou。 - iFrankz

0

现在非常容易:

            //enable audio
            AudioSession.Initialize();

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

0

尝试在audioPlayerEndInterruption方法中注册AVAudioPlayerDelegate并重新启动音乐。


嗨,Ralfonso,感谢您的回复。我尝试了这样的代码:AVAudioPlayer player = new AVAudioPlayer(); NSUrl mediaFile = NSUrl.FromFilename("Content/Audio/music1.mp3"); player = AVAudioPlayer.FromUrl(mediaFile); player.Delegate = new AVAudioPlayerDelegate(); player.EndInterruption += delegate(object sender, EventArgs e) { player.Play(); }; if(player.PrepareToPlay()){ player.Play(); }但现在情况更糟了。应用程序在开始播放时崩溃了。 - iFrankz
1
我对MonoTouch不是很熟悉,但我知道在Objective-C开发时,当资源添加到项目中时,Xcode会自动执行许多操作。确保没有可能的文件格式错误(尝试使用.wav格式),或者从主包中加载文件。这里有一个例子:[链接]http://www.techotopia.com/index.php/Playing_Audio_on_an_iPhone_using_AVAudioPlayer_(iOS_4)#Support_Audio_Formats - Ralfonso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接