我有一個通過http傳輸視頻和音頻的DLink網絡攝像頭(DCS-932L)。使用NAudio播放(無效)音頻流
視頻是mjpeg(運動jpeg),而音頻是單聲道的16位PCM wav音頻。
我可以讀取顯示視頻流,但我遇到了音頻問題。根據接收到的頭文件,音頻文件只有30秒長,但是由於相機連續發送數據(用wget進行檢查),這是錯誤的。
NAudio,VLC,Windows媒體播放器等都在30秒後停止,因爲wav標題說他們應該。任何人都知道如何讓NAudio放棄流標題的長度屬性?或者我可以使用的任何其他庫處理這個問題?
我使用的代碼今天起到30秒:
public void PlayWaveFromUrl(string url)
{
new Thread(delegate(object o)
{
var req = WebRequest.Create(url);
req.Credentials = GetCredential(url);
req.PreAuthenticate = true;
var response = req.GetResponse();
using (var stream = response.GetResponseStream())
{
byte[] buffer = new byte[65536]; // 64KB chunks
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
var pos = ms.Position;
ms.Position = ms.Length;
ms.Write(buffer, 0, read);
ms.Position = pos;
}
}
}).Start();
// Pre-buffering some data to allow NAudio to start playing
while (ms.Length < 65536 * 10)
Thread.Sleep(1000);
ms.Position = 0;
using (WaveStream blockAlignedStream = new BlockAlignReductionStream(WaveFormatConversionStream.CreatePcmStream(new WaveFileReader(ms))))
{
using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
waveOut.Init(blockAlignedStream);
waveOut.Play();
while (waveOut.PlaybackState == PlaybackState.Playing)
{
System.Threading.Thread.Sleep(100);
}
}
}
}