简体   繁体   中英

audio stream server with netty

I'm trying create a simple audio stream server like a concept proof, but I'm having some dificulties. I'm streaming a single file to start, I searched but didn't found enought information to create a audio stream server, so I just created a simple server based on my little knowledge about servers. I've created it with netty passing the stream to ChunkedStream object and wrote it on channel:

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, I didn't successfully streamed the audio directly to web browser, so I tryied to figure out what icecast returns as response to web browser, and it return these properties in header:

Cache-Control:no-cache
Content-Type:application/ogg
Server:Icecast 2.3.2
ice-audio-info:samplerate=44100;channels=2;quality=3%2e00
icy-description:Stream de teste
icy-genre:Rock
icy-name:Radio teste Brevleq
icy-pub:0

Is there a simple way netty use to put these content in HttpResponse header (specially Content-type:applicatio/ogg)?? I hope this is the problem...

See the API of HttpResponse . It has setHeader method.

I'd consider going with a straight binary protocol, and creating an HTTP interface only for a proxy. There's no reason to deal with a text based protocol for something like this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM