Windows Phone后台音乐播放本地代理实现讨论
2013-11-20 18:16
471 查看
前一篇文章讨论的wp平台音乐播放的一些遇到的问题,经过苦思冥想和多方参考安卓实现;发现我们可以考虑一种本地代理的思想来完成我们的边听边存,并且流畅拖动进度条。希望大家一起讨论。可以下载我的代码一同研究
源代码
安卓实现本地代理文章参考:
Android MediaPlayer与Http Proxy结合之基础篇
Android MediaPlayer与Http Proxy结合之提高篇 如果我们也能这样实现的话,我们还能实现缓冲进度条
玩转 Android MdeiaPlayer之Meida Proxy
通过上面的参考我的思路如下:
View Code
我不知道我上面的实现有问题还是怎么,我遇到了很多莫名奇妙的问题:
1、我有时候能播放歌曲,但是播放到部分就报错,有时候也能连续播放歌曲,但是大部分时候是不能播放歌曲的,希望大家在测试我代码的时候在AudioPlayer.cs的OnError里面打一个断点。
2、因为每次报错都进入了OnError,并且每次的异常消息都是一串数字,搞得我不知道哪里出错。
问题原因分析:
在OnError的备注里有这么一句话"每次播放出错(如 AudioTrack 未正确下载)时调用",所以我猜测是我的数据没有正确返回导致错误的。
还有就是在监听处理函数里面我会得到相同的请求,我想可能因为在WP里面HTTP的请求都是异步的,因为异步是非阻塞的,所以当我的数据还没有返回的时候,BackgroudAudiaPlayer没有收到就继续发送同一个请求,
一般在收到两个之后程序就会产生异常,并且进入OnError。所以我猜测如果有同步请求是不是就会正确(貌似安卓就是同步请求实现的),调试了几天都没解决,希望大家看看我的思路是否可行,或者还是我的实现有问题,
望指点。 欢迎关注我的微博@多了特 一起讨论
源代码
安卓实现本地代理文章参考:
Android MediaPlayer与Http Proxy结合之基础篇
Android MediaPlayer与Http Proxy结合之提高篇 如果我们也能这样实现的话,我们还能实现缓冲进度条
玩转 Android MdeiaPlayer之Meida Proxy
通过上面的参考我的思路如下:
/// <summary> /// 代理类 /// </summary> public class MediaProxy { StreamSocketListener socketListener; public void StartSocketListener() { socketListener = new StreamSocketListener();//创建一个本地StreamSocketListener监听 socketListener.ConnectionReceived += socketListener_ConnectionReceived; socketListener.BindServiceNameAsync("33123"); } void socketListener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) { StreamSocket s = args.Socket; RequestHttp(s); } /// <summary> /// 远程请求服务器 /// </summary> /// <param name="obj"></param> private async void RequestHttp(object obj) { StreamSocket s = obj as StreamSocket; // bool hasRange = false;//用于标记第二次请求 try { DataReader reader = new DataReader(s.InputStream); reader.InputStreamOptions = InputStreamOptions.Partial; uint numStrBytes = await reader.LoadAsync(5120); string requestStr = reader.ReadString(numStrBytes); // using (IOutputStream output = args.Socket.OutputStream) Stream outputStream = s.OutputStream.AsStreamForWrite(); { string[] requestHeaders = requestStr.Split(new char[] { '\r', '\n' }); string requestMethod = requestHeaders[0]; string[] requestParts = requestMethod.Split(' '); string httpServer = "http:/"; string url = httpServer + requestParts[1];//组装远程mp3地址 HttpWebRequest webRequest = WebRequest.CreateHttp(url); webRequest.AllowReadStreamBuffering = false;//这里设置为false,可以避免下载全部的流才得到相应 #region HTTP头部信息处理 Dictionary<string, string> pragmaDic = new Dictionary<string, string>(); for (int i = 1; i < requestHeaders.Length; i++) { if (!string.IsNullOrWhiteSpace(requestHeaders[i])) { string[] head = requestHeaders[i].Split(':'); if (head.Length == 2 && head[0] != "Host") { if (head[0].ToLower() == "accept") { webRequest.Accept = head[1]; continue; } //第一次请求不包含Range //if (head[0].ToLower() == "range") //{ // webRequest.Headers[head[0]] = head[1]; // hasRange = true; // continue; //} if (head[0].ToLower() == "contentlength") { webRequest.ContentLength = long.Parse(head[1]); continue; } if (head[0].ToLower() == "contenttype") { webRequest.ContentType = head[1]; continue; } if (head[0].ToLower() == "user-agent") { webRequest.UserAgent = head[1]; continue; } if (head[0].ToLower() == "pragma") { pragmaDic.Add(head[1], head[1]); continue; } webRequest.Headers[head[0]] = head[1]; } } } if (pragmaDic.Count > 0) { string pragma = string.Empty; foreach (string p in pragmaDic.Values) { pragma += p; } webRequest.Headers["Pragma"] = pragma; } #endregion webRequest.BeginGetResponse((res) => { System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { HttpWebRequest request = res.AsyncState as HttpWebRequest; HttpWebResponse response = request.EndGetResponse(res) as HttpWebResponse; WebHeaderCollection headerCollection = response.Headers; string codeEn = response.StatusCode.ToString(); int codeNum = (int)response.StatusCode; //第一种响应头:将服务器返回的头信息全部返回给播放器 //string header =string.Format("HTTP/1.1 {0} {1}\r\n{2}" ,codeNum,codeEn, headerCollection.ToString()); //第二种响应头:将自定义头部 string header1 = String.Format(@"HTTP/1.1 200 OK\r\nContent-Type: audio/mpeg\r\nConnection: keep-alive\r\nContent-Length: {0}\r\n\r\n", response.ContentLength); Stream stream = response.GetResponseStream(); // using (Stream stream = response.GetResponseStream()) { byte[] headerArray = Encoding.UTF8.GetBytes(header1); outputStream.WriteAsync(headerArray, 0, headerArray.Length); stream.CopyToAsync(outputStream); outputStream.FlushAsync(); } }); }, webRequest); } } catch (Exception ex) { } } }
View Code
我不知道我上面的实现有问题还是怎么,我遇到了很多莫名奇妙的问题:
1、我有时候能播放歌曲,但是播放到部分就报错,有时候也能连续播放歌曲,但是大部分时候是不能播放歌曲的,希望大家在测试我代码的时候在AudioPlayer.cs的OnError里面打一个断点。
2、因为每次报错都进入了OnError,并且每次的异常消息都是一串数字,搞得我不知道哪里出错。
问题原因分析:
在OnError的备注里有这么一句话"每次播放出错(如 AudioTrack 未正确下载)时调用",所以我猜测是我的数据没有正确返回导致错误的。
还有就是在监听处理函数里面我会得到相同的请求,我想可能因为在WP里面HTTP的请求都是异步的,因为异步是非阻塞的,所以当我的数据还没有返回的时候,BackgroudAudiaPlayer没有收到就继续发送同一个请求,
一般在收到两个之后程序就会产生异常,并且进入OnError。所以我猜测如果有同步请求是不是就会正确(貌似安卓就是同步请求实现的),调试了几天都没解决,希望大家看看我的思路是否可行,或者还是我的实现有问题,
望指点。 欢迎关注我的微博@多了特 一起讨论
相关文章推荐
- Android使用本地Service实现后台播放音乐
- Android用MediaPlay方法实现本地音乐的播放,与进度条的实现
- 学习Windows Phone 7手机开发:后台任务之播放音乐
- AVAudioPlayer本地音乐播放、后台播放、歌词同步,都告诉你
- Android service学习总结和利用service实现的后台音乐播放功能
- IOS 控制音量并实现后台播放音乐
- 使用AudioSession实现音乐后台播放功能
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- app播放无声音乐实现app后台运行
- Android实现本地音乐播放(一、实现音频的读取)
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- 手机影音第十五天,利用service实现后台播放音乐,在通知栏显示当前音乐信息等
- 利用service实现音乐的后台播放
- iOS实现在后台播放音乐
- Android通过Service实现音乐后台播放
- Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
- 【转载】如何实现 Windows Phone 的后台代理
- iOS中实现音乐的后台播放