2023年7月15日发(作者:)
Flutteraudioplayers使⽤⼩结简介是⼀个可以⽀持同时播放多个⾳频⽂件的Flutter的库。⽤法也是相当的简单: AudioPlayer audioPlayer = new AudioPlayer(); await (url); //or //await (localPath, isLocal: true);
// ⼀些控制API await (); await (); await ();复制代码如何使程序崩溃(Android)AudioPlayer audioPlayer = new AudioPlayer();await (localPath, isLocal: true);//播放后,马上调⽤暂停,底层抛出`PlatformException`异常,程序崩溃await ();复制代码嗯,就是这么简单,还没写满10⾏代码就GG了。分析原因遇到了这个崩溃后,本⼈也是怀揣着好奇⼼第⼀时间翻看了audioplayers的代码,以及⼜看了⼀遍⽂档。原来,⽂档中介绍,为了实现先加载后播放的功能,我们可以调⽤函数,之后需要播放时候调⽤resume进⾏播放即可。嗯,当时我没看到这段,塞翁失马焉知⾮福,这样的实现也是同样存在问题的。 先来⼀张Android MediaPlayer的State Diagram:⽆论是还是,他们最重要的⼯作就是调⽤Android原⽣的prepareAsync⽅法,让MediaPlayer对象处于Prepared状态。引⽤⼀下Android官⽅⽂档:A MediaPlayer object must first enter the Prepared state before playback can or a call to prepareAsync() (asynchronous) which first transfers the object to the Preparing state after the callreturns (which occurs almost right away) while the internal player engine continues working on the rest of preparationwork until the preparation work completes. When the preparation completes or when prepare() call returns, the internalplayer engine then calls a user supplied callback method ......概括起来就两点:1. 播放/暂停等操作之前,必须进⼊Prepared状态2. prepareAsync是⼀个异步操作,会使MediaPlayer进⼊preparing状态, 当底层的player engine完成preparation的⼯作时,将会调⽤⽤户提供的回调函数。所以,上⾯崩溃的问题也⽐较明了了,调⽤之后底层的MediaPlayer其实是⼀个preparing状态,此时调⽤pause导致了PlatformException异常的抛出,程序直接崩溃。这其实是⼀个audioplayers没有处理好的状态,play和setUrl这类的Future不应该只在perparing状态就resolve,⽽应该等到prepared。因此...我反⼿去上提了个issue,深藏功与名。尾声audioplayers在Android还⽀持SoundPool(new AudioPlayer(mode: _LATENCY)),也存在着同样的问题。推测ios应该也会出现同样的问题。写的⽐较杂乱简单,希望能够帮助到碰到同样问题的⼈。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689413855a244173.html
评论列表(0条)