音频流服务器与netty

时间:2011-12-13 20:50:05

标签: java http streaming audio-streaming netty

我正在尝试创建一个简单的音频流服务器,就像一个概念证明,但我有一些困难。 我正在流式传输一个文件,我搜索但没有找到创建音频流服务器的信息,所以我根据我对服务器的一点知识创建了一个简单的服务器。我用netty创建了它,将流传递给ChunkedStream对象并在通道上写了它:

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();
}
}

很遗憾,我没有成功将音频直接流式传输到网络浏览器,所以我试图找出icecast作为对网络浏览器的响应返回的内容,并在标题中返回这些属性:

  

缓存控制:无缓存
  内容类型:应用程序/ OGG
  服务器:Icecast 2.3.2
  冰 - 音频信息:采样率= 44100;信道= 2;质量= 3%2e00
  冰冷的描述:Stream de teste
  冰冷的流派:摇滚
  冰名:Radio teste Brevleq
  冰冷-PUB:0

netty用于将这些内容放入HttpResponse标头(特别是Content-type:applicatio / ogg)?我希望这是问题...

2 个答案:

答案 0 :(得分:1)

请参阅API of HttpResponse。 它有setHeader方法。

答案 1 :(得分:0)

我考虑使用直接二进制协议,并仅为代理创建HTTP接口。对于像这样的事情,没有理由处理基于文本的协议。