为啥 PlaybackState 在 PlaybackStopped 触发后仍保持在 Playing 状态?

     2023-02-25     278

关键词:

【中文标题】为啥 PlaybackState 在 PlaybackStopped 触发后仍保持在 Playing 状态?【英文标题】:Why does PlaybackState remain at Playing after PlaybackStopped fires?为什么 PlaybackState 在 PlaybackStopped 触发后仍保持在 Playing 状态? 【发布时间】:2012-04-20 08:50:46 【问题描述】:

我对使用 NAudio 有点陌生,所以我肯定错过了一些重要的东西,因此提出了这个问题。

从示例/演示代码开始,我整理了一个尽可能简单的类来播放 MP3 或 WAV 文件:

public class AudioPlayer : IDisposable

    WaveStream _waveStream; // sound data stream
    WaveChannel32 _waveChannel32; // sound channel ??
    IWavePlayer _iWavePlayer; // sound output driver

    public bool IsPlaying
    
        get  return _iWavePlayer != null 
                     && _iWavePlayer.PlaybackState 
                         != Wave.PlaybackState.Stopped; 
    

    public PlaybackState PlaybackState
    
        get  return _iWavePlayer.PlaybackState; 
    

    public void LoadMp3(byte[] mp3Bytes)
    
        Load(CreateInputStreamFromMp3Bytes(mp3Bytes));
    

    public void LoadFile(string filename)
    
        Load(CreateInputStream(filename));
    

    void Load(WaveStream waveStream)
    
        if (_iWavePlayer != null)
            Dispose();
        _iWavePlayer = new WaveOut();
        _iWavePlayer.PlaybackStopped += 
            new EventHandler(_iWavePlayer_PlaybackStopped);
        _waveStream = waveStream;
        _waveChannel32 = new WaveChannel32(_waveStream);
        _waveChannel32.PadWithZeroes = false;
        _iWavePlayer.Init(_waveChannel32);
    

    void _iWavePlayer_PlaybackStopped(object sender, EventArgs e)
    
        Stop();
    

    static WaveStream CreateInputStreamFromMp3Bytes(byte[] mp3Bytes)
    
        return new Mp3FileReader(new MemoryStream(mp3Bytes), false);
    

    static WaveStream CreateInputStream(string fileName)
    
        if (fileName.EndsWith(".wav"))
            return new WaveFileReader(fileName);
        else if (fileName.EndsWith(".mp3"))
            return new Mp3FileReader(fileName);
        else
            throw new InvalidOperationException("Unsupported extension");
    

    public void Play()
    
        _iWavePlayer.Play();
    

    public void Stop()
    
        if (_iWavePlayer != null 
                && _iWavePlayer.PlaybackState != PlaybackState.Stopped)  
            _iWavePlayer.Stop();
            _waveStream.Position = 0;
        
    

    public void Dispose()
    
        Stop();
        if (_iWavePlayer != null) 
            _iWavePlayer.Dispose();
            _iWavePlayer = null;
        
        if (_waveChannel32 != null) 
            _waveChannel32.Dispose();
            _waveChannel32 = null;
        
        if (_waveStream != null) 
            _waveStream.Dispose();
            _waveStream = null;
        
    

我正在使用相关代码播放 MP3 文件(不是 WAV)。

它在大多数情况下都可以正常工作,考虑到我将能够在我的项目中替换 MediaElements,这非常棒。我遇到的问题是 PlaybackState 停留在 Playing 而不是在 PlaybackStopped 触发后更改为 Stopped。为了解决这个问题,我订阅了PlaybackStopped 并从那里致电Stop()

我必须像这样打电话给Stop() 是否正常,还是我在这里遗漏了什么?

【问题讨论】:

不是我熟悉的类,但是许多对象在播放时会引发“Stopped”事件,如果您想取消,它会使状态更改更简单。活动可以取消吗? 【参考方案1】:

看起来像一个错误。如果您查看 NAudio 代码,WaveOut 不会更改 RaisePlaybackStoppedEvent 中的 PlaybackState。但是DirectSoundOut 会将其更改为停止。有点疯狂。

【讨论】:

DirectSoundOut 有什么缺点吗?您是否碰巧有一些可以播放 MP3 的代码可以分享:-)? 别管样本,我只是用 DirectSoundOut 替换 WaveOut,它确实在完成时将状态设置为停止。【参考方案2】:

试试这个:

在 Load 方法中更改这一行:

_iWavePlayer = new WaveOut(); 

通过这个:

_iWavePlayer = new WaveOut(WaveCallbackInfo.FunctionCallback());

【讨论】:

pythondecrypt_china_hadoop_playback.py(代码片段)

查看详情

NAudio PlaybackState 永远不会停止?

】NAudioPlaybackState永远不会停止?【英文标题】:NAudioPlaybackStateneverstops?【发布时间】:2013-06-0915:27:44【问题描述】:我正在使用NAudio创建一个简单的音频播放器,但我找不到可以将我的WaveOut流的PlaybackState更改为“已停止”并因... 查看详情

MediaControllerCompat 的 PlaybackState

】MediaControllerCompat的PlaybackState【英文标题】:PlaybackStateforMediaControllerCompat【发布时间】:2018-12-0109:52:04【问题描述】:我正在通过thisguide使用MediaSessionCompat构建一个后台音频应用程序,但遇到了一个问题。在我的Activity中,我... 查看详情

Xcode 11 beta -playbackState 仅在 iOS 13.0 或更新版本中可用

】Xcode11beta-playbackState仅在iOS13.0或更新版本中可用【英文标题】:Xcode11beta-playbackStateisonlyavailableiniOS13.0ornewer【发布时间】:2019-07-1510:09:54【问题描述】:我收到错误:\'playbackState\'仅适用于iOS13.0或更高版本但MPNowPlayingInfoCenter.pla... 查看详情

使用逻辑 ||带有枚举值

...述】:我有一个MPMoviePlayerController实例。我希望检查它的playbackState属性以获取多个值之一。因此,我会这样做:if(moviePlayer.playbackState==(MPMoviePlaybackStateStopped||MPMoviePlay 查看详情

exoplayer监听播放器播放完成播放孔娜

valmMediaListener=object:Player.Listener//播放状态变化overridefunonPlaybackStateChanged(playbackState:Int)when(playbackState)//空闲播放器没有可播放的媒体。Player.STATE_IDLE->mediaControl.onMediaIdle()//需要加载放器无法立即从 查看详情

播放 pcm 音频片段

...为流播放,一切正常。但在实时播放中什么也没有发生。PlaybackState设置为已停止。代码如下:WaveFormatwf=newWaveFormat(8000,1);MemoryStreamms;Wav 查看详情

为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

】为啥在参数周围使用/*、*/以及为啥在提取数组长度时使用>>>?[复制]【英文标题】:Whyuse/*,*/aroundargumentsandwhyuse>>>whenextractingthelengthofanarray?[duplicate]为什么在参数周围使用/*、*/以及为什么在提取数组长度时使用>... 查看详情

为啥在 TCP 中使用 bind()?为啥它只用在服务器端而不用在客户端?

】为啥在TCP中使用bind()?为啥它只用在服务器端而不用在客户端?【英文标题】:Whyisbind()usedinTCP?Whyisitusedonlyonserversideandnotinclientside?为什么在TCP中使用bind()?为什么它只用在服务器端而不用在客户端?【发布时间】:2012-09-2714:4... 查看详情

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

】为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?【英文标题】:Whythetemporaryvariableneedsinchangingarrayelementsandwhyitneedstobeunsetattheend?为什么临时变量需要更改数组元素以及为什么需要在最后取消设置?【发布时间】... 查看详情

为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?

】为啥CoreGuiRoblox锁定在DataModel中,为啥受信任的用户不能使用CoreScripts?【英文标题】:WhyisCoreGuiRobloxLockedintheDataModelandwhycan\'ttrustedusersuseCoreScripts?为什么CoreGuiRoblox锁定在DataModel中,为什么受信任的用户不能使用CoreScripts?【发... 查看详情

为啥 + 仅在客户端是 NaN?为啥不在 Node.js 中?

】为啥+仅在客户端是NaN?为啥不在Node.js中?【英文标题】:Why+isNaNonlyontheclientside?WhynotinNode.js?为什么+仅在客户端是NaN?为什么不在Node.js中?【发布时间】:2013-06-2013:06:35【问题描述】:虽然[]+[]是一个空字符串,但[]+是"[ob... 查看详情

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?

】在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?【英文标题】:ShouldIsubtractimagemeanwhendoingataskofsemanticsegmentation?whyorwhynot?在执行语义分割任务时我应该减去图像均值吗?为什么或者为什么不?【发布时间】:20... 查看详情

为啥 activeNetwork 为空? (在安卓中)

】为啥activeNetwork为空?(在安卓中)【英文标题】:WhyisactiveNetworknull?(inandroid)为什么activeNetwork为空?(在安卓中)【发布时间】:2022-01-0720:34:21【问题描述】:在ActivityonStart方法中查看网络状态。这是我的来源。overridefunonStart... 查看详情

测试在 UI 中更新但在控制台中没有更新,为啥?谁能告诉为啥控制台不更新?

】测试在UI中更新但在控制台中没有更新,为啥?谁能告诉为啥控制台不更新?【英文标题】:testisupdatedinUIbutnotupdatinginconsolewhy?cananyonetellaboutwhyconsoleisnotupdating?测试在UI中更新但在控制台中没有更新,为什么?谁能告诉为什么控... 查看详情

为啥帖子不显示在主页上?

】为啥帖子不显示在主页上?【英文标题】:whypostsarenotshowninhomepage?为什么帖子不显示在主页上?【发布时间】:2020-12-1320:26:56【问题描述】:当我在管理面板中添加帖子时,帖子不会显示在应用程序的主页上。它只显示帖子的... 查看详情

为啥 JavaScript 函数文档在函数之外?

】为啥JavaScript函数文档在函数之外?【英文标题】:WhyisJavaScriptfunctiondocumentationoutsidethefunction?为什么JavaScript函数文档在函数之外?【发布时间】:2018-12-1403:41:58【问题描述】:在JavaScript中,大多数文档格式似乎都在函数上方... 查看详情

在 Java 7 ConcurrentHashMap 中,为啥在写的时候需要段锁?为啥我们不能再次使用 Unsafe 来保持非阻塞?

】在Java7ConcurrentHashMap中,为啥在写的时候需要段锁?为啥我们不能再次使用Unsafe来保持非阻塞?【英文标题】:InJava7ConcurrentHashMap,whysegmentlockisrequiredwhilewriting?Whycan\'tweuseUnsafeagaintokeepthingsnon-blocking?在Java7ConcurrentHashMap中,为什么... 查看详情