http 経由でビデオとオーディオをストリーミングする DLink Web カメラ (DCS-932L) を持っています。
動画はmjpeg(モーションjpeg)、音声は16bit PCM wav音声のモノラルです。
ビデオ ストリームの番組は問題なく読めますが、音声に問題があります。受信したヘッダーによると、オーディオ ファイルの長さはわずか 30 秒ですが、カメラがデータを送信し続けるため (wget で確認)、これは誤りです。
NAudio、VLC、Windows Media Player などの両方が、wav ヘッダーが示すように 30 秒後にすべて停止します。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);
}
}
}
}