2016-09-17 12 views
2

URL에서 mp3를 스트리밍하는 코드가 있습니다. 나는 UI에서 mp3 플레이어의 현재 시간을 보여주고 싶다. WaveOut.GetPosition을 사용해 보았지만 나에게 도움이되지 못했습니다. 어떻게하면됩니까?NAudio를 사용하여 mp3를 스트리밍하는 동안 현재 시간을 얻는 방법은 무엇입니까?

내 코드 :

do 
{ 
    //..codes to get url stream,to create BufferedWaveProvider 

    int decompressed = decompressor.DecompressFrame(frame, buffer, 0); 
    provider.AddSamples(buffer, 0, decompressed); 
    if (provider.BufferedDuration.Seconds > 2 && waveOut == null) 
    { 
     waveOut = new WaveOut(); 
     waveOut.Init(provider); 
     waveOut.Play(); 
    } 
    if (waveOut != null) 
    { 
     currentTime = (int)(waveOut.GetPosition() * 1d/AvgBytesPerSec); 
    } 
} 
while (bytesRead > 0 || waveOut.PlaybackState == PlaybackState.Playing); 
+0

어떤 유형이'provider'입니까? –

+0

'provider'는 BufferedWaveProvider이고,'waveOut'는 WaveOut입니다. 필요한 경우 전체 코드를 넣을 수 있습니다. –

+0

어떻게 작동하지 않습니까? 오디오를 재생하고 있습니까? – ioctlLR

답변

1

도움이 될 것입니다

희망 생각할 필요가 무엇을 제공해야 현재 사용중인 속성. IWavePosition 인터페이스 (실제로 여기에서 사용하고있는 인터페이스)는 하드웨어 용어로 "생각"합니다. 따라서 하드웨어에서 사용하기 전에 변환해야하는 형식을 사용하는 경우 하드웨어 바이트 속도가 원본 바이트와 다릅니다 율.

GetPosition()이 반환하는 위치는 재생이 마지막으로 시작된 이후입니다. waveOut.Stop()이 호출되면 재생이 다시 시작될 때 위치는 0으로 재설정됩니다. 위치를 소스에 매핑하는 것은 호출자에게 달려 있습니다 (실제로 간단합니다. 소스에서 마지막으로 재생을 시작한 위치를 추적하여 반환 된 위치에 추가합니다. 버퍼링을 사용하면 더 복잡하지만 여전히 완전히 수행 할 수 있습니다).

NAudio에 대한 원래의 IWavePosition 인터페이스 & 구현을 작성했습니다. 그것은 내가 구축 한 프로젝트에서 훌륭하게 작동합니다. :)

+0

잘 작동합니다. 내 값'AvgBytesPerSec'은'Mp3Frame' 속성을 사용하여 생성 된'Mp3WaveFormat.AverageBytesPerSecond'입니다. 차이점은 프레임을 압축 해제하는 것입니다. 프레임이 압축 해제 될 때 바이트 길이가 증가하기 때문입니다. @ioctILR에 도움을 주셔서 감사합니다. –

1

당신은 반드시이 건물이 현재 시간과 재산의 위치를 ​​시도 했습니까?

mp3Reader = new Mp3FileReader("example.mp3"); 

waveOut.Init(mp3Reader); 

waveOut.Play(); 

// reposition to five seconds in 
mp3Reader.CurrentTime = TimeSpan.FromSeconds(5.0); 

그래서 mp3Reader.CurrentTime는 나는 이것이 당신이 당신의 코드를 만들 필요가있는 유일한 변화는 AvgBytesPerSec 대신 waveOut.OutputWaveFormat.AverageBytesPerSecond을 사용하는 것입니다 생각하는 당신에게

+0

하지만 URL 소스에서 스트리밍해야합니다. Mp3FileReader는 저장된 파일에서만 작동합니다. 스트리밍을위한 해결책이 있습니까? –

+1

from codeplex'BufferedWaveProvider.BufferedDuration', https : //github.com/naudio/NAudio/blob/master/NAudio/Wave/WaveProviders/BufferedWaveProvider.cs, 코드를 탐색하여 방법을 찾을 수도 있고 수정할 수도 있습니다 소스 코드 – Monah

+0

소스 코드에는 너무 많은 종속 클래스가 있지만 시도해 보겠습니다. 제안 해 주셔서 감사합니다. –