Welcome to Yumao′s Blog.
關於音頻流轉發問題
, 2013年05月20日 , Java Language , 评论 在〈關於音頻流轉發問題〉中留言功能已關閉 ,

最近經常聼的一個網絡電臺換了網路
導致直連一直聼的頓頓的
連玩游戯的心情都失去了
後來就在想 既然我有這麽多閒置的服務器
爲什麼不用一個網路好點的國外服務器做轉發
嗯 想到了這方面就蠢蠢欲動了

因爲毛毛我還是對java語言最熟悉
所以還是想著用最基本的servlet寫寫試試好了
以前是有做過http訪問方面的
所以向上游訪問就用HttpClient擔任了

總體思路就是使用httpClient獲取stream
然後服務器進行stream的轉發
或者copy下發(暫無需求 所以就沒做)

成果代碼如下
只用了HttpClient的庫
以及一個jsp文件而已(算是很偷懶了)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.io.*"%>
<%@ page language="java" import="org.apache.http.client.HttpClient"%>
<%@ page language="java" import="org.apache.http.HttpEntity"%>
<%@ page language="java" import="org.apache.http.HttpResponse"%>
<%@ page language="java" import="org.apache.http.client.methods.HttpGet"%>
<%@ page language="java" import="org.apache.http.impl.client.DefaultHttpClient"%>
<%
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet get = new HttpGet("http://radio.phate.cc/listen");
		HttpResponse repon = httpClient.execute(get);
		HttpEntity entity = repon.getEntity();
		if (entity != null) {
			InputStream instream = entity.getContent();
			int bytesRead = 0;
			OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
			while ((bytesRead = instream.read())!=-1) {
				toClient.write(bytesRead);
				toClient.flush();
			}	
			toClient.close();
		}			
		get.abort();
%>

此轉發也可以用作網頁等任何http數據轉發喔
當然你要想辦法繞過偉大的功夫網而已

一個要點是:
本來我最初的代碼是將stream先用byte數組處理
然後一個包一個包的發
最後發現這樣處理之後
音頻流經常出現斷幀噪音
所以流媒體還是直接轉發就好
畢竟原本就是小包多傳保證實時效果
你將其攔截封了發肯定出問題的呀
當然web的轉發就是可以封了發哦

順帶給出我原來的錯誤方法(可以適用於web)

		HttpClient httpClient = new DefaultHttpClient();
		BASE64Decoder  bASE64Decoder = new  BASE64Decoder();
		HttpGet get = new HttpGet(new String(bASE64Decoder.decodeBuffer(request.getParameter("url"))));
		HttpResponse repon = httpClient.execute(get);
		HttpEntity entity = repon.getEntity();
		if (entity != null) {
			InputStream instream = entity.getContent();
			int bytesRead = 0;
			byte[] buffer = new byte[8];
			OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
			while ((bytesRead = instream.read(buffer, 0, 8)) != -1) {
				toClient.write(buffer);
				toClient.flush();
			}	
			toClient.close();
		}			
		get.abort();

當時還調整了很多次byte數組的容量
最後發現不妥 做不到完美
so…..

思考東西總是繞路的我
哈~

评论已关闭