0

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

我们的服务器流式传输音频并启用了偏移量流式传输。给定网址:

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

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

WMP 开始缓冲并播放来自给定 URL 的 2 分钟长波形文件(一切正常),但是当我抓住轨道滑块并将其拖放到其长度的 90% 左右时,播放被切断并且 WMP 显示一般音频错误( c00d11b1)。当我将滑块放得更近(进一步 10-20%)时,播放继续进行,没有任何错误,并且可以正确播放偏移量。我使用的是 Windows 7 Home Premium 64 位。

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

是什么导致了这样的问题?

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

WMP=>Server - 获取浪潮

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=>Server - 获取带偏移的声音(在范围内设置)

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 中断播放并显示错误。

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

4

1 回答 1

0

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

我不确定是否需要 http 响应标头,但作为一个线索:这与恢复 http 下载的行为相同。

在这里,您可以看到构建 Content-Range 响应的服务器端 C# 代码。

在这里您可以看到 PHP 代码构建响应。

于 2013-07-23T08:23:12.797 回答