← 回到文章列表

关于音频流转发问题

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

在这里找找

输入关键词,找一篇过去的记录。