在WMP中播放时,会切断流式波的播放

时间:2013-04-04 12:26:30

标签: audio-streaming wave wmp wmplib

我们在C#应用程序中使用WMPLib作为嵌入式播放器,但Windows Media Player中也会出现此问题。

我们的服务器会传输音频并启用偏移功能。给定网址:

http://ourserver.com/playback?id=400

返回八位字节或x波流(两者都不起作用)。

WMP开始缓冲并播放来自给定URL的2分钟长波文件(一切正常)但是当我抓住并将轨道滑块拖动到大约90%的长度时,播放被切断并且WMP显示为一般音频错误(c00d11b1)。当我将滑块拉近(10-20%)时,播放继续没有任何错误,并正确播放偏移。我正在使用Windows 7家庭高级版64位。

当我在其他媒体播放器应用程序(VLC)中使用相同的URL时,不会发生错误。

导致此类问题的原因是什么?

来自这种情况的TCP数据包:

WMP =>服务器 - 获取wave

GET http://ourserver.com/playback?id=400
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: getIfoFileURI.dlna.org
Accept: */*
Cookie: PHPSESSID=7e5156ec44280a9210570158c5d31475
User-Agent: NSPlayer/12.00.7601.17514 WMFSDK/12.00.7601.17514
GetContentFeatures.DLNA.ORG: 1
Host: 192.168.0.5

服务器=> WMP - 返回文件

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-cache
Pragma: no-cache
Content-Description: File Transfer
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Dis; filename="sound.wav"
Content-Length: 833658
Accept-Ranges: bytes
Date: Tue, 02 Apr 2013 10:46:01 GMT
Server: lighttpd/1.4.28

声音播放,我们移动滑块... WMP =>服务器 - 获取具有偏移的声音(在范围内设置)

GET http://ourserver.com/playback?id=400
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: getIfoFileURI.dlna.org
Accept: */*
Cookie: PHPSESSID=7e5156ec44280a9210570158c5d31475
Range: bytes=733184-833657
User-Agent: NSPlayer/12.00.7601.17514 WMFSDK/12.00.7601.17514
GetContentFeatures.DLNA.ORG: 1
Host: 192.168.0.5

服务器=> WMP - 返回声音

HTTP/1.1 206 Partial Content
X-Powered-By: PHP/5.3.6
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Content-Range: bytes 733184-833657/
Cache-Control: no-cache
Pragma: no-cache
Content-Description: File Transfer
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Dis; filename="sound.wav"
Content-Length: 833658
Accept-Ranges: bytes
Date: Tue, 02 Apr 2013 10:46:10 GMT
Server: lighttpd/1.4.28

流继续,但WMP切断播放并显示错误。

我们如何解决这个问题? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

正如您在第二个响应中看到的那样,服务器从一开始就响应完整的octect流。 假设您在服务器端具有足够低的控制权,则服务器必须使用客户端发出的Range: bytes=733184-833657 http标头从soud.wav读取此字节范围并将其发送到客户端。

我不确定所需的http响应标头,但作为线索:恢复http下载的行为相同。

Here您可以看到构建内容范围响应的服务器端C#代码。

Here您可以看到PHP代码构建响应。