2011-12-13 176 views
1

我想创建一个简单的音频流服务器像一个概念证明,但我有一些贫困。 我正在流式传输一个文件来启动,我搜索了但没有找到足够的信息来创建一个音频流服务器,所以我只是基于我对服务器的一些了解创建了一个简单的服务器。我和网状创建它传递流ChunkedStream对象,并写在了信道:netty音频流服务器

public class CastServerHandler extends SimpleChannelHandler { 

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) 
     throws Exception { 
    HttpRequest request = (HttpRequest) e.getMessage(); 
    if (request.getMethod() != GET) { 
     sendError(ctx, METHOD_NOT_ALLOWED); 
     return; 
    } 

    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); 
    System.out.println(response.toString()); 
    Channel channel = e.getChannel(); 
    channel.write(response); 
    ChannelFuture writeFuture; 
    StreamSource source = StreamSource.getInstance(); 
    ChunkedStream stream = new ChunkedStream(source.getLiveStream()); 
    writeFuture = channel.write(stream); 
    writeFuture.addListener(new ChannelFutureProgressListener() { 
     public void operationComplete(ChannelFuture future) { 
      System.out.println("terminou"); 
      future.getChannel().close(); 
     } 

     public void operationProgressed(ChannelFuture future, long amount, 
       long current, long total) { 
      System.out.println("Transferido: " + current + " de " + total); 
     } 
    }); 
    if (!isKeepAlive(request)) {    
     writeFuture.addListener(ChannelFutureListener.CLOSE); 
    } 
} 

private void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) { 
    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, status); 
    response.setHeader(CONTENT_TYPE, "text/plain; charset=UTF-8"); 
    response.setContent(ChannelBuffers.copiedBuffer(
      "Failure: " + status.toString() + "\r\n", CharsetUtil.UTF_8)); 

    // Close the connection as soon as the error message is sent. 
    ctx.getChannel().write(response) 
      .addListener(ChannelFutureListener.CLOSE); 
} 

private void writeLiveStream(Channel channel) { 
    StreamSource source = StreamSource.getInstance(); 
    ChunkedStream stream = new ChunkedStream(source.getLiveStream()); 
    channel.write(stream); 
} 

@Override 
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) 
     throws Exception { 
    e.getCause().printStackTrace(); 
    e.getChannel().close(); 
} 
} 

Ufortunately,我没有成功,直接流音频到Web浏览器,所以我tryied弄清楚什么的Icecast回报

缓存控制::作为响应于网络浏览器,并将其在报头返回这些属性无缓存
内容类型:应用/ OGG
服务器:2.3.2的Icecast
冰 - 音频信息:采样率= 44100;信道= 2;质量= 3%2e00
冰冷-描述:流去睾丸中
冰冷的流派:摇滚
冰冷的名称:无线泰斯特Brevleq
冰冷-PUB:0

有一个简单的办法网状使用,以把这些内容HttpResponse头(特别是Content-type:applicatio/ogg)??我希望这是问题...

+0

唯一需要的头是`Content-Type`。其他一切只是额外的信息。 – Brad 2011-12-14 14:26:02

回答

0

我会考虑去一个直接的二进制协议,并创建一个HTTP接口只为代理。没有理由处理这样的基于文本的协议。