欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Windows Phone后台音乐播放本地代理实现讨论

来源: 开发者 投稿于  被查看 2572 次 评论:100

Windows Phone后台音乐播放本地代理实现讨论


前一篇文章讨论的wp平台音乐播放的一些遇到的问题,经过苦思冥想和多方参考安卓实现;发现我们可以考虑来完成我们的边听边存,并且流畅拖动进度条。希望大家一起讨论。可以下载我的代码一同研究

源代码

安卓实现本地代理文章参考:

Android MediaPlayer与Http Proxy结合之基础篇

Android MediaPlayer与Http Proxy结合之提高篇  如果我们也能这样实现的话,我们还能实现缓冲进度条

玩转 Android MdeiaPlayer之Meida Proxy

通过上面的参考我的思路如下:

1、首先我将BackGroundAudiaoPlayer的AudiaoTrack地址设为本地代理的地址,请求本地代理;

2、本地代理受到请求,将同样的请求发送给远程服务器;

3、远程服务器响应流给本地代理,

4、本地代理将流返回BackGroundAudiaoPlayer;

接下来我们先来看看我抓包分析BackGroundAudiaoPlayer直接请求远程服务器的过程,他包括两个过程,第一个请求:

在我听歌一段时间后,它会继续发一个Range请求:

BackGroundAudiaoPlayer直接请求远程服务器的两个过程,一帮应该是发送上面两个请求,如果文件大的话可能第二步会重复。

接下来就是我的实现过程:

1、首先我将远程地址替换成本地地址,并且启动本地监听:

 
            MediaProxy mp = 
             mp3Url = =  AudioTrack( Uri(mp3Url, UriKind.Absolute), , , , , 

第二步我在本地代理里面处理相关的请求MdeiaProxy.cs:

= StreamSocketListener(); socketListener.ConnectionReceived +== RequestHttp(= obj = = numStrBytes = reader.LoadAsync( requestStr = Stream outputStream =[] requestHeaders = requestStr.Split( [] { , requestMethod = requestHeaders[[] requestParts = requestMethod.Split( httpServer = url = httpServer + requestParts[]; HttpWebRequest webRequest == ; HTTP头部信息处理<, > pragmaDic = Dictionary<, > ( i = ; i < requestHeaders.Length; i++ (![] head = requestHeaders[i].Split( (head.Length == && head[] != (head[].ToLower() == = head[ (head[].ToLower() == = .Parse(head[ (head[].ToLower() == = head[ (head[].ToLower() == = head[ (head[].ToLower() == ], head[]] = head[ (pragmaDic.Count > pragma = ( p +=] ==>=>= res.AsyncState = request.EndGetResponse(res) = codeEn = codeNum = ( header1 = String.Format(= [] headerArray = View Code

我不知道我上面的实现有问题还是怎么,我遇到了很多莫名奇妙的问题:

1、我有时候能播放歌曲,但是播放到部分就报错,有时候也能连续播放歌曲,但是大部分时候是不能播放歌曲的,希望大家在测试我代码的时候在AudioPlayer.cs的OnError里面打一个断点。

2、因为每次报错都进入了OnError,并且每次的异常消息都是一串数字,搞得我不知道哪里出错。

问题原因分析:

在OnError的备注里有这么一句话"",所以我猜测是我的数据没有正确返回导致错误的。

还有就是在监听处理函数里面我会得到相同的请求,我想可能因为在WP里面HTTP的请求都是异步的,因为异步是非阻塞的,所以当我的数据还没有返回的时候,BackgroudAudiaPlayer没有收到就继续发送同一个请求,

一般在收到两个之后程序就会产生异常,并且进入OnError。所以我猜测如果有同步请求是不是就会正确(貌似安卓就是同步请求实现的),调试了几天都没解决,希望大家看看我的思路是否可行,或者还是我的实现有问题,

望指点。 欢迎关注我的微博@多了特 一起讨论

 

 

相关频道:

用户评论