我有一个通过 http 传输视频和音频的 DLink 网络摄像头 (DCS-932L)。
视频是 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);
}
}
}
}