Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 優化Android實現的MediaPlayer與Http Proxy結合實例

優化Android實現的MediaPlayer與Http Proxy結合實例

編輯:Android開發實例

  本文是在 優化Android使用MediaPlayer實現的視頻預加載  基礎上修復Http代理服務器(Http Proxy)透傳的bug。前面幾篇相關文章所用的代理服務器一個時間只能監聽來自Mediaplayer的一個Request請求,但在實際項目開發過程中,發現有些支持m3u8格式Mediaplayer發出新的Request請求之前不會中斷舊的Request請求,所以本文代碼會加入多線程監聽Request請求。

  本文代碼可以在這裡下載:http://download.csdn.net/detail/hellogv/4894109

  代理服務器被初始化之後,開始2個線程監聽MediaPlayer的Request請求:

 

  1. public HttpGetProxy(String dirPath,int size,int maximum) { 
  2.     try { 
  3.         //初始化代理服務器 
  4.         mBufferDirPath = dirPath;  
  5.         mBufferSize=size; 
  6.         mBufferFileMaximum = maximum; 
  7.         localHost = Config.LOCAL_IP_ADDRESS; 
  8.         localServer = new ServerSocket(0, 1,InetAddress.getByName(localHost)); 
  9.         localPort =localServer.getLocalPort();//有ServerSocket自動分配端口 
  10.         //啟動代理服務器 
  11.         new Thread() { 
  12.             public void run() { 
  13.                 startProxy(); 
  14.             } 
  15.         }.start(); 
  16.          
  17.         mEnable = true; 
  18.     } catch (Exception e) { 
  19.         mEnable = false; 
  20.     } 

 

  1. private void startProxy() { 
  2.     while (true) { 
  3.         // -------------------------------------- 
  4.         // 監聽MediaPlayer的請求,MediaPlayer->代理服務器 
  5.         // -------------------------------------- 
  6.         Log.i(TAG, "......ready to start..........."); 
  7.         try { 
  8.             Socket s = localServer.accept(); 
  9.             if(proxy!=null){ 
  10.                 proxy.closeSockets(); 
  11.             } 
  12.             Log.i(TAG, "......started..........."); 
  13.             proxy = new Proxy(s); 
  14.              
  15.             new Thread(){ 
  16.                 public void run(){ 
  17.                     Log.i(TAG, "......ready to start..........."); 
  18.                     try { 
  19.                         Socket s = localServer.accept(); 
  20.                         proxy.closeSockets(); 
  21.                         Log.i(TAG, "......started..........."); 
  22.                         proxy = new Proxy(s); 
  23.                         proxy.run(); 
  24.                     } catch (IOException e) { 
  25.                         Log.e(TAG, e.toString()); 
  26.                         Log.e(TAG, Utils.getExceptionMessage(e)); 
  27.                     } 
  28.                      
  29.                 } 
  30.             }.start(); 
  31.             proxy.run(); 
  32.         } catch (IOException e) { 
  33.             Log.e(TAG, e.toString()); 
  34.             Log.e(TAG, Utils.getExceptionMessage(e)); 
  35.         } 
  36.     } 

 

   代理服務器收到Request請求(seek的操作)之後,用新線程建立Socket,而舊的Socket會因為OutputStream的write異常而進入異常處理,所以要在異常處理裡回收Socket資源。本文的代理服務器在mediaplayer seek之後的log如下:

  1. 12-16 13:55:53.181: I/HttpParser<---(27624): HTTP/1.1 206 Partial Content 
  2. 12-16 13:55:53.181: I/HttpParser<---(27624): Content-Length: 665139733 
  3. 12-16 13:55:53.181: I/HttpParser<---(27624): Content-Type: application/force-download 
  4. 12-16 13:55:53.181: I/HttpParser<---(27624): Content-Range: bytes 2906976-668046708/668046709 
  5. 12-16 13:55:53.181: I/HttpParser<---(27624): Last-Modified: Thu, 13 Dec 2012 14:28:00 GMT 
  6. 12-16 13:55:53.181: I/HttpParser<---(27624): Accept-Ranges: bytes 
  7. 12-16 13:55:53.181: I/HttpParser<---(27624): ETag: "80b39bd3ed9cd1:2d6" 
  8. 12-16 13:55:53.181: I/HttpParser<---(27624): Server: Microsoft-IIS/6.0 
  9. 12-16 13:55:53.181: I/HttpParser<---(27624): Content-Disposition: attachment 
  10. 12-16 13:55:53.181: I/HttpParser<---(27624): Date: Sun, 16 Dec 2012 05:55:45 GMT 
  11. 12-16 13:55:53.181: I/HttpParser<---(27624): Connection: close 
  12. 12-16 13:55:53.181: I/HttpParser<---(27624):  
  13. 12-16 13:55:59.631: I/HttpGetProxy(27624): ......started........... 
  14. 12-16 13:55:59.631: I/HttpGetProxy(27624): <-----------------------------------> 
  15. 12-16 13:55:59.641: I/HttpParser(27624): GET /%E6%89%8B%E6%9C%BA%E7%94%B5%E5%BD%B1/201212/%E5%BF%97%E6%98%8E%E4%B8%8E%E6%98%A5%E5%A8%87-2mp4-800x448.mp4 HTTP/1.1 
  16. 12-16 13:55:59.641: I/HttpParser(27624): User-Agent: AppleCoreMedia/1.0.0.8C148 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh_cn) 
  17. 12-16 13:55:59.641: I/HttpParser(27624): Accept: */* 
  18. 12-16 13:55:59.641: I/HttpParser(27624): Range: bytes=401793617- 
  19. 12-16 13:55:59.641: I/HttpParser(27624): Connection: close 
  20. 12-16 13:55:59.641: I/HttpParser(27624): Host: d1.2mp4.net 
  21. 12-16 13:55:59.641: I/HttpParser(27624):  
  22. 12-16 13:55:59.641: I/HttpParser(27624): ------->rangePosition:401793617 
  23. 12-16 13:55:59.641: E/HttpGetProxy(27624): java.net.SocketException: Socket is closed 
  24. 12-16 13:55:59.641: E/HttpGetProxy(27624): java.net.Socket.checkOpenAndCreate  641line 
  25. 12-16 13:55:59.641: E/HttpGetProxy(27624): java.net.Socket.getOutputStream  381line 
  26. 12-16 13:55:59.641: E/HttpGetProxy(27624): com.proxy.HttpGetProxyUtils.sendToMP  112line 
  27. 12-16 13:55:59.641: E/HttpGetProxy(27624): com.proxy.HttpGetProxy$Proxy.run  292line 
  28. 12-16 13:55:59.641: E/HttpGetProxy(27624): com.proxy.HttpGetProxy.startProxy  213line 
  29. 12-16 13:55:59.641: E/HttpGetProxy(27624): com.proxy.HttpGetProxy.access$8  183line 
  30. 12-16 13:55:59.641: E/HttpGetProxy(27624): com.proxy.HttpGetProxy$1.run  78line 
  31. 12-16 13:55:59.641: I/HttpGetProxy(27624): ......ready to start........... 
  32. 12-16 13:56:01.181: I/HttpParser<---(27624): HTTP/1.1 206 Partial Content 
  33. 12-16 13:56:01.181: I/HttpParser<---(27624): Content-Length: 266253092 
  34. 12-16 13:56:01.181: I/HttpParser<---(27624): Content-Type: application/force-download 
  35. 12-16 13:56:01.181: I/HttpParser<---(27624): Content-Range: bytes 401793617-668046708/668046709 
  36. 12-16 13:56:01.181: I/HttpParser<---(27624): Last-Modified: Thu, 13 Dec 2012 14:28:00 GMT 
  37. 12-16 13:56:01.181: I/HttpParser<---(27624): Accept-Ranges: bytes 
  38. 12-16 13:56:01.181: I/HttpParser<---(27624): ETag: "80b39bd3ed9cd1:2d6" 
  39. 12-16 13:56:01.181: I/HttpParser<---(27624): Server: Microsoft-IIS/6.0 
  40. 12-16 13:56:01.181: I/HttpParser<---(27624): Content-Disposition: attachment 
  41. 12-16 13:56:01.181: I/HttpParser<---(27624): Date: Sun, 16 Dec 2012 05:55:54 GMT 
  42. 12-16 13:56:01.181: I/HttpParser<---(27624): Connection: close 
  43. 12-16 13:56:01.181: I/HttpParser<---(27624):  
  44. 12-16 13:56:01.181: I/HttpGetProxy(27624): ----------------->需要發送預加載到MediaPlayer 
  45. 12-16 13:56:01.181: I/HttpGetProxy(27624): >>>不讀取預加載文件 range:401793617,buffer:2906976 
  46. 12-16 13:56:13.761: E/HttpGetProxy(27624): java.net.SocketException: sendto failed: ECONNRESET (Connection reset by peer) 
  47. 12-16 13:56:13.761: E/HttpGetProxy(27624): libcore.io.IoBridge.maybeThrowAfterSendto  496line 
  48. 12-16 13:56:13.761: E/HttpGetProxy(27624): libcore.io.IoBridge.sendto  465line 
  49. 12-16 13:56:13.761: E/HttpGetProxy(27624): java.net.PlainSocketImpl.write  507line 
  50. 12-16 13:56:13.761: E/HttpGetProxy(27624): java.net.PlainSocketImpl.access$100  46line 
  51. 12-16 13:56:13.761: E/HttpGetProxy(27624): java.net.PlainSocketImpl$PlainSocketOutputStream.write  269line 
  52. 12-16 13:56:13.761: E/HttpGetProxy(27624): com.proxy.HttpGetProxyUtils.sendToMP  112line 
  53. 12-16 13:56:13.761: E/HttpGetProxy(27624): com.proxy.HttpGetProxy$Proxy.run  292line 
  54. 12-16 13:56:13.761: E/HttpGetProxy(27624): com.proxy.HttpGetProxy$2.run  205line 
  55. 12-16 13:56:13.771: I/HttpGetProxy(27624): ......started........... 
  56. 12-16 13:56:13.771: I/HttpGetProxy(27624): <-----------------------------------> 
  57. 12-16 13:56:13.771: I/HttpParser(27624): GET /%E6%89%8B%E6%9C%BA%E7%94%B5%E5%BD%B1/201212/%E5%BF%97%E6%98%8E%E4%B8%8E%E6%98%A5%E5%A8%87-2mp4-800x448.mp4 HTTP/1.1 
  58. 12-16 13:56:13.771: I/HttpParser(27624): User-Agent: AppleCoreMedia/1.0.0.8C148 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh_cn) 
  59. 12-16 13:56:13.771: I/HttpParser(27624): Accept: */* 
  60. 12-16 13:56:13.771: I/HttpParser(27624): Range: bytes=612718942- 
  61. 12-16 13:56:13.771: I/HttpParser(27624): Connection: close 
  62. 12-16 13:56:13.771: I/HttpParser(27624): Host: d1.2mp4.net 
  63. 12-16 13:56:13.771: I/HttpParser(27624):  
  64. 12-16 13:56:13.771: I/HttpParser(27624): ------->rangePosition:612718942 
  65. 12-16 13:56:13.781: I/HttpGetProxy(27624): ......ready to start........... 
  66. 12-16 13:56:14.051: I/HttpParser<---(27624): HTTP/1.1 206 Partial Content 
  67. 12-16 13:56:14.051: I/HttpParser<---(27624): Content-Length: 55327767 
  68. 12-16 13:56:14.051: I/HttpParser<---(27624): Content-Type: application/force-download 
  69. 12-16 13:56:14.051: I/HttpParser<---(27624): Content-Range: bytes 612718942-668046708/668046709 
  70. 12-16 13:56:14.051: I/HttpParser<---(27624): Last-Modified: Thu, 13 Dec 2012 14:28:00 GMT 
  71. 12-16 13:56:14.051: I/HttpParser<---(27624): Accept-Ranges: bytes 
  72. 12-16 13:56:14.051: I/HttpParser<---(27624): ETag: "80b39bd3ed9cd1:2d6" 
  73. 12-16 13:56:14.051: I/HttpParser<---(27624): Server: Microsoft-IIS/6.0 
  74. 12-16 13:56:14.051: I/HttpParser<---(27624): Content-Disposition: attachment 
  75. 12-16 13:56:14.051: I/HttpParser<---(27624): Date: Sun, 16 Dec 2012 05:56:06 GMT 
  76. 12-16 13:56:14.051: I/HttpParser<---(27624): Connection: close 
  77. 12-16 13:56:14.051: I/HttpParser<---(27624):  
  78. 12-16 13:56:14.051: I/HttpGetProxy(27624): ----------------->需要發送預加載到MediaPlayer 
  79. 12-16 13:56:14.051: I/HttpGetProxy(27624): >>>不讀取預加載文件 range:612718942,buffer:2906976 
  80. 12-16 13:56:49.051: I/HttpGetProxy(27624): ......started........... 
  81. 12-16 13:56:49.051: I/HttpGetProxy(27624): <-----------------------------------> 
  82. 12-16 13:56:49.051: E/HttpGetProxy(27624): java.net.SocketException: Socket closed 
  83. 12-16 13:56:49.051: E/HttpGetProxy(27624): libcore.io.Posix.recvfromBytes  -2line 
  84. 12-16 13:56:49.051: E/HttpGetProxy(27624): libcore.io.Posix.recvfrom  131line 
  85. 12-16 13:56:49.051: E/HttpGetProxy(27624): libcore.io.BlockGuardOs.recvfrom  164line 
  86. 12-16 13:56:49.051: E/HttpGetProxy(27624): libcore.io.IoBridge.recvfrom  503line 
  87. 12-16 13:56:49.051: E/HttpGetProxy(27624): java.net.PlainSocketImpl.read  488line 
  88. 12-16 13:56:49.051: E/HttpGetProxy(27624): java.net.PlainSocketImpl.access$000  46line 
  89. 12-16 13:56:49.051: E/HttpGetProxy(27624): java.net.PlainSocketImpl$PlainSocketInputStream.read  240line 
  90. 12-16 13:56:49.051: E/HttpGetProxy(27624): java.io.InputStream.read  163line 
  91. 12-16 13:56:49.051: E/HttpGetProxy(27624): com.proxy.HttpGetProxy$Proxy.run  288line 
  92. 12-16 13:56:49.051: E/HttpGetProxy(27624): com.proxy.HttpGetProxy.startProxy  213line 
  93. 12-16 13:56:49.051: E/HttpGetProxy(27624): com.proxy.HttpGetProxy.access$8  183line 
  94. 12-16 13:56:49.051: E/HttpGetProxy(27624): com.proxy.HttpGetProxy$1.run  78line 
  95. 12-16 13:56:49.051: I/HttpGetProxy(27624): ......ready to start........... 
  96. 12-16 13:56:49.051: I/HttpParser(27624): GET /%E6%89%8B%E6%9C%BA%E7%94%B5%E5%BD%B1/201212/%E5%BF%97%E6%98%8E%E4%B8%8E%E6%98%A5%E5%A8%87-2mp4-800x448.mp4 HTTP/1.1 
  97. 12-16 13:56:49.051: I/HttpParser(27624): User-Agent: AppleCoreMedia/1.0.0.8C148 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh_cn) 
  98. 12-16 13:56:49.051: I/HttpParser(27624): Accept: */* 
  99. 12-16 13:56:49.051: I/HttpParser(27624): Range: bytes=152226030- 
  100. 12-16 13:56:49.051: I/HttpParser(27624): Connection: close 
  101. 12-16 13:56:49.051: I/HttpParser(27624): Host: d1.2mp4.net 
  102. 12-16 13:56:49.051: I/HttpParser(27624):  
  103. 12-16 13:56:49.051: I/HttpParser(27624): ------->rangePosition:152226030 
  104. 12-16 13:56:49.311: I/HttpParser<---(27624): HTTP/1.1 206 Partial Content 
  105. 12-16 13:56:49.311: I/HttpParser<---(27624): Content-Length: 515820679 
  106. 12-16 13:56:49.311: I/HttpParser<---(27624): Content-Type: application/force-download 
  107. 12-16 13:56:49.311: I/HttpParser<---(27624): Content-Range: bytes 152226030-668046708/668046709 
  108. 12-16 13:56:49.311: I/HttpParser<---(27624): Last-Modified: Thu, 13 Dec 2012 14:28:00 GMT 
  109. 12-16 13:56:49.311: I/HttpParser<---(27624): Accept-Ranges: bytes 
  110. 12-16 13:56:49.311: I/HttpParser<---(27624): ETag: "80b39bd3ed9cd1:2d6" 
  111. 12-16 13:56:49.311: I/HttpParser<---(27624): Server: Microsoft-IIS/6.0 
  112. 12-16 13:56:49.311: I/HttpParser<---(27624): Content-Disposition: attachment 
  113. 12-16 13:56:49.311: I/HttpParser<---(27624): Date: Sun, 16 Dec 2012 05:56:42 GMT 
  114. 12-16 13:56:49.311: I/HttpParser<---(27624): Connection: close 
  115. 12-16 13:56:49.311: I/HttpParser<---(27624):  
  116. 12-16 13:56:49.311: I/HttpGetProxy(27624): ----------------->需要發送預加載到MediaPlayer 
  117. 12-16 13:56:49.311: I/HttpGetProxy(27624): >>>不讀取預加載文件 range:152226030,buffer:2906976 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved