аудиопоток с сервером netty - PullRequest
       39

аудиопоток с сервером netty

1 голос
/ 14 декабря 2011

Я пытаюсь создать простой сервер аудиопотоков, как концептуальное доказательство, но у меня есть некоторые трудности. Для начала я транслирую один файл, я искал, но не нашел достаточно информации для создания сервера аудиопотока, поэтому я просто создал простой сервер на основе своих небольших знаний о серверах. Я создал его с помощью 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 возвращает в ответ на веб-браузер, и он возвращает эти свойства в заголовке:

Cache-Control: нет кэша
Content-Type: применение / * 1008 OGG * Сервер: Icecast 2.3.2
льда аудио-информации: = 44100 дискретизации; каналы = 2; качество = 3% 2e00
icy-description: Stream de teste
ледяной жанр: Rock
Ледяное имя: Радио тестет Brevleq
ледяной паб: 0

Есть ли простой способ использовать netty для помещения этого контента в заголовок HttpResponse (особенно Content-type: applicationatio / ogg) ?? Я надеюсь, что это проблема ...

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

См. API HttpResponse .У него есть метод setHeader.

0 голосов
/ 25 февраля 2014

Я хотел бы рассмотреть возможность использования простого двоичного протокола и создания интерфейса HTTP только для прокси.Нет смысла иметь дело с текстовым протоколом для чего-то подобного.

...