java - 带有 netty 的音频流服务器

标签 java http streaming audio-streaming netty

我正在尝试创建一个简单的音频流服务器,就像概念证明一样,但我遇到了一些困难。 我开始流式传输单个文件,我搜索但没有找到足够的信息来创建音频流服务器,所以我只是根据我对服务器的一点了解创建了一个简单的服务器。我用 netty 创建了它,将流传递给 ChunkedStream 对象并将其写入 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();
}
}

不幸的是,我没有成功地将音频直接流式传输到网络浏览器,所以我试图找出 icecast 返回什么作为对网络浏览器的响应,并在 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

netty 是否有一种简单的方法可以将这些内容放入 HttpResponse header (特别是 Content-type:applicatio/ogg)?我希望这是问题所在...

最佳答案

参见 API of HttpResponse . 它有 setHeader 方法。

关于java - 带有 netty 的音频流服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8495990/

相关文章:

java - 导入包的问题

java - 斐波那契递归问题,无法返回 2 个元素

linux - 获取广域网 IP : difference between HTTP and DNS

HTTP 状态代码优先级和处理

javascript - 通过 ajax 流式传输数据

在使用 MediaPlayer 的 MEDIA_INFO_BUFFERING_START 之后,Android 直播永远不会开始

java - Swagger 路线在 Spring Boot + Jersey 上返回 404

java - Branch.io (Android SDK) 和 GDPR

php - HTTP 查询字符串和 []

c# - 来自 url 的 xamarin.ios mp3 流在结束前停止