簡體   English   中英

帶有netty的音頻流服務器

[英]audio stream server with 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();
}
}

不幸的是,我沒有成功將音頻直接流式傳輸到Web瀏覽器,因此我嘗試找出Icecast作為對Web瀏覽器的響應返回的內容,並且它在標頭中返回以下屬性:

緩存控制:無緩存
內容類型:application / ogg
伺服器:Icecast 2.3.2
ice-audio-info:采樣率= 44100;通道= 2;質量= 3%2e00
icy-description:流的teste
冰冷的類型:搖滾
冰冷名稱:無線電睾丸Brevleq
icy-pub:0

Netty是否有一種簡單的方法將這些內容放入HttpResponse標頭(特別是Content-type:applicatio / ogg)? 我希望這是問題所在...

請參閱HttpResponseAPI 它具有setHeader方法。

我會考慮使用直接的二進制協議,並僅為代理創建HTTP接口。 這樣的事情沒有理由處理基於文本的協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM