关于音频流转发问题
最近经常聼的一个网络电台换了网路 导致直连一直聼的顿顿的 连玩游戯的心情都失去了 后来就在想 既然我有这么多闲置的服务器 为什么不用一个网路好点的国外服务器做转发 嗯 想到了这方面就蠢蠢欲动了 因为毛毛我还是对java语言最熟悉 所以还是想著用最基本的servlet…
最近经常聼的一个网络电台换了网路
导致直连一直聼的顿顿的
连玩游戯的心情都失去了
后来就在想 既然我有这么多闲置的服务器
为什么不用一个网路好点的国外服务器做转发
嗯 想到了这方面就蠢蠢欲动了
因为毛毛我还是对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…..
思考东西总是绕路的我
哈~