Naudio: Como posso obter um evento que me diz que o arquivo MP3 chegou ao fim?

StackOverflow https://stackoverflow.com/questions/2571307

  •  24-09-2019
  •  | 
  •  

Pergunta

Eu tentei usar isso:

private void CreateDevice()
{
    _playbackDevice = new WaveOut();
    _playbackDevice.PlaybackStopped += PlaybackDevicePlaybackStopped;
}

void PlaybackDevicePlaybackStopped(object sender, EventArgs e)
{
    if (OnPlaybackStopped != null)
    {
        OnPlaybackStopped(this, e);
    }
}

Mas nunca invocou.

Então eu tentei usar o Playbackstate, pesquisando a propriedade com um cronômetro:

public PlaybackState PlaybackState
{
    get
    {
        if (_playbackDevice == null)
            return default(PlaybackState);

        return _playbackDevice.PlaybackState;
    }
}

Mas quando a música termina, não muda para "parar". Mas quando eu chamo manualmente, para que mude corretamente.

Alguém pode me ajudar?

Parece haver um bug ... http://naudio.codeplex.com/workitem/view.aspx?workitemid=10726

Foi útil?

Solução

Porque Naudio foi projetado para permitir que você faça coisas mais complicadas do que simplesmente reproduzir um arquivo, ele não para necessariamente para no final de um arquivo. O que determina se o Waveout será interrompido é se pararmos de alimentá -lo ou não. Algumas transmissões de onda em Naudio param de fornecer dados quando chegarem ao final de um arquivo, mas outras transmissões de onda retornarão com prazer buffers cheios de zeros do método de leitura quantas vezes são chamadas. Portanto, a parada automática depende muito do gráfico das transmissões de onda que você construiu.

Por isso, pode ser necessário determinar quando parar quando terminar de ler o conteúdo do arquivo a ser reproduzido. Sei que essa não é uma situação ideal e ainda estou tentando criar um design que funcione bem para aqueles que apenas querem jogar um único arquivo e para aqueles que estão fazendo algo um pouco mais envolvido.

Outras dicas

Experimente isso:

No seu método Createvice, altere esta linha:

_playbackDevice = new WaveOut();

por este:

_playbackDevice = new WaveOut(WaveCallbackInfo.FunctionCallback()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top