Red 5
1. Introdução
Media Streaming com Red5
É um servidor de streaming, vídeo e áudio, desenvolvido em Java, de código aberto, integrável a programas desenvolvidos em Java, Flash e Flex. Como todo programa Java, ele roda no Java Virtual Machine, deve-se atentar antes de mais nada para a instalação correta da versão do JVM.
Fácil acesso a internet de banda larga tem gerado todos os tipos de aplicações ricas de multimídia na web. Streaming de vídeo e de áudio é um deles. Sites famosos de vídeos são uns dos exemplos que empregam tecnologia de streaming de áudio e vídeo para fornecer media direita  ao navegador da web.

Red5 é um servidor de código aberto do Flash escrito em Java que suporta:
Streaming Video (FLV, F4V, MP4, 3GP)
Streaming de áudio (MP3, F4A, M4A, AAC)
Gravação Streams cliente (FLV e AVC + AAC em recipiente FLV)
Shared Objects
Ao vivo Publishing
Remoting
Protocolos: RTMP, RTMPT, RTMPS e RTMPE
A versão atual (2014) é a Red 5 1.0 que requer o Java 6, outra versão do Java provocará erro.

Flash Streaming Media
Há vários tipos de protocolo atualmente disponíveis para transmitir conteúdo de áudio e vídeo. HTTP, RTSP, RTMP, MMS são alguns dos protocolos de streaming de mídia populares. O RTMP é um protocolo proprietário desenvolvido pela Adobe Systems usado principalmente para streaming de conteúdo de mídia para flash media player. Flash se tornou uma escolha popular entre as emissoras de mídia, pela simples razão, que é disponível com a maior parte do navegador atualmente. Media players em Flash são leves e podem ser facilmente incorporado como um objeto em páginas da web.
Adobe tem seu produto proprietário chamado como Flash Media Streaming Server (FMS) para streaming de mídia. FMS fornece ao usuário uma plataforma para transmitir seu conteúdo de mídia diretamente para o navegador com um simples flash player incorporado. Mas o Flash Media Server tem um custo elevado para os desenvolvedores iniciantes, alunos e professores.

1.1. Programas necessários
A instalação dos programas requer a configuração recomendada, caso contrários haverá erros na inicialização do Red 5 e conseqüentemente na execução do mesmo e dos projetos que forem desenvolvidos. O Red 5 é desenvolvido em Java, portanto, requer o Java Virtual Machine, é neste programa que todas as aplicações java são executadas, há um kit em java que já vem com o compilador para a criação de aplicações java e a máquina virtual, em seguida será explicado.

1.1.1. Java SE Development Kit versão 6
Este kit é composto pelo compilador java e pela máquina virtual, o compilador transforma o código fonte java em bytecode e a máquina virtual executa o aplicativo java no lado do cliente, todo computado que tiver a máquina virtual poderá executar aplicativos java.
A vesão 6 deverá estar instalada, porque a última versão do Red 5 é a 1.0, que a utiliza essa versão, lembrando que em um computador poder ter mais de uma versão instalada do JDK, porém o programa que for utilizar o java deverá apontar para a versão correta, por exemplo, o eclipse possibilitar escolher a versão do java para os seus projetos.
O JDK já vem com o Java Virtual Machine, o JVM é responsável pela execução dos programas desenvolvidos em java na máquina do cliente, como se fosse um plugin, tal como o Adobe Flash Player, por isso a versão é importante, senão poderá gerar conflito de versões quando o JVM for executar uma aplicação em Java, um recurso que há em uma versão pode ser diferente do recurso de outra versão.

1.1.2. Red 5 versão 1.0
A vesão mais fácil de instalar é a  setup-Red5-1.0.0-RC2-java6 porque já vem com o instalador do Windows e com o java 6 imbutido, não necessitando instalar e configurar o Java 6.

1.1.3. Eclipse
Este é um programa que foi escolhido para a construção de projetos Red 5. Lembrando que o Red 5 é apenas um servidor, a aplicação em si é feita no compilador Java e no compilador Flex.

2. Download do Red 5
Acesse o site: http://red5.org/downloads/red5/1_0/
Aparecerá a seguinte página:

- Baixe o arquivo red5-1.0.0.zip     12-Jan-201 15:25   50M ou a última versão, caso opte por esta versão.

A versão com extensão .zip não possui o instalador do Windows, é a mais indicada para desenvolvedores pois a instalação consiste em apenas criar uma pasta e descompactar o arquivo e a desistalação consistem em apenas deletar a pasta criada com os arquivos descompactados, porém as demonstrações de exemplos de projetos terão que ser instaladas separadamente.
O JDK versão 6 não está mais disponível no site www.adobe.com.br, o que dificulta a instalação, tendo que procurá-lo em site de terceiros.
Esta versão vem com demos que serão copiados para a versão setup-Red5-1.0.0-RC2-java6 que não os possui.

- Baixe o arquivo setup-Red5-1.0.0-RC2-java6, é o mais recomendado.
Esta versão é mais indicada para os iniciantes, já vem com o instalador do Windows, e com o JDK 1.6.

3. Instalações
do Java SE Development Kit
Para você utilizar o Red 5, você precisa primeiro instalar o Java (JDK).

O desenvolvimento de programas mais eleborados podem ser feitos com o Eclipse JEE que pode importar a biblioteca Red5.jar, incorporá-la ao projeto e o projeto pode ser exportado para uma aplicação qualquer compatível com a linguagem Java, a exportação de projeto consiste na geração de arquivo.jar, que pode ser inserido em um programa Red 5 como uma biblioteca.

3.1. Instalação do programa Java no Windows
O Red5 1.0 requer o Java SE Development Kit versão 6 (ou 1.6), que já vem com o Java Virtual Machine para rodar os programas java, tal versão não está mais disponível no site, http://www.oracle.com/br/index.html, a versão atual (2014) é a versão 8.
Logo abaixo será demonstrado como fazer a instalação para a versão 7, tal instalação serve para qualquer versão:

a) Download
Site: http://www.oracle.com/technetwork/java/index.html
Menu: Dowload
Java for Developers
Browse by Category:
Java
Java SE
Java SE 7u11
Download
jdk-7u11-windows-i586.exe (para windows de 32 bit)


Obs:  procure o arquivo que você o achará

b) Após o download é só instalar. ( este exemplo é a versão 1.7.0, porém para o Red 5 1.0 tem que instalar a versão 1.6).
c) Crie uma pasta chamada java no diretório raiz (c:/) onde será instalado o programa, dentro desta pasta será criado mais duas no momento da instalação.
d) Após aceitar os termos do contrato será solicitado dois diretorios que serão sugeridos, o primeiro corresponde ao jdk, mude para o diretório raiz (ficará assim c:/java/jdk170) e retire os pontos, pois, no modo prompt do dos não aceita essa formatação, o segundo diretório corresponderá ao jre, da mesma forma, mude para o diretório raiz e retire os pontos (ficará assim c:/java/jre170), os números correpondem a versão, eles devem ser mantidos para facilitar a sua identificação.
e) Após a instalação será necessário a configuração da variável de ambiente no windows, para que se possa acessar o JDK pela linha de comando do Windows (prompt de comando), isto deverá ser feito também para o Flex SDK.
Siga os seguintes passos:
- No windows vá até o sistema:
Botão iniciar > Painel de controle > Sistemas e Manutenção > Sistema > Configurações Avançadas do Sistema
- Criar uma variável de sistema com o nome CLASSPATH (botão novo) e referencia onde esta localizados os arquivos .jars do jdk.
No meu caso ficou: c:\java\jdk170\lib\tools.jar;%PATH%
- Da mesma forma criar uma variável de sistema com o nome JAVA_HOME (botão novo) e referencia onde foi instalado o jdk.
No meu caso ficou: c:\java\jdk170
- Agora é só acrescentar  na variável já existente, de nome Path, em variáveis de ambiente, o endereço da pasta bin do jdk:
c:\java\jdk170\bin;...
- inserir também na variável já existente, de nome Path, em variáveis de ambiente o caminho do “bin” do Flex SDK, permitindo assim que possamos chamar o compilador do Flex pela linha de comando.
- reinicie o computador para o novo ambiente.
Obs: coloque no primeiro item, logo após o c:\, repare que há um ponto e vírgula separando os demais ítens já existentes, cuidado para não apagar ou alterar outras referência, isso comprometerá a funcionalidade do windows.
f) após a instalação teste  a compilação com o comando javac no prompt do dos e o comando java na execução de um programa teste.
g) teste do programa:
- abra o prompt do dos e digite o seguinte comando:
c:\> java -version
- se a instalação estiver bem sucedida será apresentado a versão do programa java version "1.7.0" ...

Obs: em algumas versões do JDK, é necessário inserir o parâmetro -cp para informar à máquina virtual que as classes de execução estão no diretório corrente (ponto) .
Exemplo:
>java -cp . NomeDaClasse

Observações:
1) Java SE Development Kit = JDK (SE: Standart Edition)
2) Java Runtime Environment = JRE = JVM + APIs
   Compila através do comando javac, ou seja,  lê o arquivo fonte .java e gera o arquivo de classe .class no formato de bytecodes. É um pacote de software executado como um aplicativo do sistema operacional.
   Uma API é uma coleção de componentes de software que já vêm prontos para serem usados.
3) Java Virtual Machine = JVM
   Software que emula CPU e memória para a execução de programas em Java. Executa (interpreta) aplicativo java.
4) A próxima figura é possível visualizar o conteúdo do JDK simplificado.


4. Instalação do Red 5
4.1. Instalação do red5-1.0.0.zip
- Com o arquivo já baixado, crie uma pasta no seu computar para descompactá-lo: c:/red5
- Mova o arquivo red5-1.0.0.zip para a pasta criada, c:/red5 e descompactê-o.
A figura abaixo mostra a estrutura do Red 5:


- Para iniciar o servidor:
Dê um clique com o botão direito do mouse no arquivo c:/red5/red5.bat e escolha a opção executar como administrador.
Esta orientação é baseada no windows vista, ao executar um programa como administrador elimina-se a possibilidade de erro de permissão do windows.
Ou dê dois cliques diretos com o botão esquerdo do mouse no arquivo c:/red5/red5.bat
O prompt de comando aparecerá e mostrará as mensagens de inicialização, verifique se tem algum erro.
- Para acessar o Red 5
A configuração padrão do endereço do servidor é 127.0.0.1:5080, caso tenha dúvida ou problema, verifique no arquivo Red5.PROPERTIES.

C:\red5\conf
Red5.PROPERTIES
# HTTP
http.host=127.0.0.1
http.port=5080

Digite o endereço do servidor Red 5 na caixa de endereço de algum Browser: 127.0.0.1:5080
Se a instalação for bem sucedida deverá apresentar a página:




Esta página é usada para testar o bom funcionamento do servidor Red5 depois de ter sido instalado. Se você pode ler esta página, significa que o servidor Red5 instalado neste local está funcionando.

- Para encerrar o servido:
Dê dois cliques com o botão esquerdo do mouse no arquivo c:/red5/red5-shutdown.bat.

Observações:
- Os videos em Flash rodam na porta 1935, tal porta deverá ser criada no Firewall do windows.
- A versão Red5.zip não possui o Java 6, isso gerará erro, caso a versão instalada seja diferente, essa versão possui demos que serão copiados para a versão seguinte que será adotada nesta apostila.
- A versão war do red5 não inclui oflaDemo, você tem que instalá-lo.

4.2. Instalação do setup-Red5-1.0.0-RC2-java6

A versão setup-Red5-1.0.0-RC2-java6 é mais indicada para os iniciantes, já vem com o instalador do Windows, e com o JDK 1.6, após dar dois clique no arquivo baixado, a instalação inicia, basta fornecer o ip para o servidor e a porta, como estaremos desenvolvendo projetos de teste, o ip será o local (a própria máquina) e a porta será a padrão (5080):

127.0.0.1
5080

Caso a janela abaixo seja aberta, esta é a janela do administrador:
Server Name é: localhost
Username é: admin
PassWord é: admin



Acesse http://localhost:5080 para abrir a janela inicial

Se a janela for igual a figura acima, isso significa que a instalação está correta.

Lembre-se que para iniciar o servidor de mídia Red5java, digite "C:\Red5java\red5.bat" no prompt de comando ou dê dois cliques no arquivo C:\Red5java\red5.bat.
Se o servidor Red5 é iniciado com sucesso, ele pode ser acessado no http://127.0.0.1:8085 no navegador web.

4.3. Demos serviços
Clique em instalar para instalar os programas (serviços) de demonstrações:


5.3.1. Demos aplicativos
Vamos utilizar os programas de demostração, como o Re5java não veio com os demos, é só copiá-los da versão red5-1.0.0.zip para a versão setup-Red5-1.0.0-RC2-java6:
Após baixar e descompactar a versão red5-1.0.0.zip na pasta Red5, copie a pasta C:\red5\webapps\root\demos
Para C:\Red5java\webapps\root

Caso não tenha criado a porta 1935, crie a mesmo no Firewall do windows, lembre-se de encerra o Red5 e inicializá-lo novamente.

Há também demos para download na página http://www.red5.org/downloads/
Faça o download dos aplicativos de exemplos e depois teste-os:


O arquivo samples.zip há alguns exemplos:


Nota: alguns modelos podem ser baixandos em:
http://red5.googlecode.com/svn/flash/trunk/
http://red5.googlecode.com/svn/flash/trunk/

5.3.2. Teste do serviço oflaDemos (RTMP)
Inicie o Red5 como já foi comentado, caso o mesmo esteje fechado.

Primeiro acesse a página:
http://localhost:5080/demos/simpleBroadcaster.html
Reduça a janela e coloque do lado esquerdo.

Segundo acesse a página:
http://localhost:5080/demos/simpleSubscriber.html
Reduça a janela e coloque-a do lado direito da outra janela.

Pronto, a figura abaixo mostra a webcam capturando a imagem do usurário na primeira janela e publicando a para acesso na internet na outra janela.



Nota:
subscribe
(səbˈskraɪb): v. 1.  to subscribe to a newspaper/magazine etc: fazer/ter assinatura de um jornal/uma revista etc., 2. to subscribe to an idea/opinion etc: (formal) aprovar uma ideia/opinião etc.
broadcaster
(ˈbrɔdkæstər) s. locutor (a).

broadcast
(ˈbrɔdkæst): v.
transmitir (por rádio ou televisão) p.p. broadcast.


5.3.3. Testes dos demais serviços com o administrador:

Digite http://localhost:5080/admin/ no navegador para abrir o administrador:


Username é: admin
PassWord é: admin

Entre com localhost, admin e admin:


Janela do administrador:

Esta janela mostra a execução dos serviços acessados.


6. Configurações
Vários erros podem ocorrer com a configuração do Red 5, como a Segurança do Window (firewall), usuário administrador do windows, porta 1935 não existente, conflito de versões entre o Red 5 e o Java, etc.

6.1. Configuração do Red 5
Os arquivos de configuração estão na pasta conf:
6.1. Portas
C:\red5\conf\red5.properties
Porta 5080: HTTP (por exemplo, para o upload de arquivos e download)
Porta 1935: RTMP (Flash Stream e Remoting / RPC)
Porta 8088: RTMP sobre HTTP-Tunneling (RTMPT)

6.2.
web.xml
C:\red5\conf\web.xml
Por padrão o arquivo web.xml é configurado para o Tomcat. As configurações deste arquivo são para Aplicações Web. Muitas informações podem ser encontradas em: http://tomcat.apache.org

6.3. Prevenir problemas de firewall

Uma forma comum de contornar o firewall é mudar a porta HTTP para 80 e RTMPT para 443.

Uma breve descrição sobre o mecanismo de conexão: O aplicativo primeiro tenta se conectar a RTMP três vezes, porque rtmp é o protocolo de menor desempenho. Se isso falhar, o pedido será fallback para RTMPT.

A maioria dos firewalls não permitem o tráfego na porta 443 e eles normalmente não analisa os pacotes, porque 443 é normalmente SSL criptografada, de modo que o firewall não deve ser capaz de ler os pacotes.

6.4. Arquivo red5.properties.
# Socket policy
policy.host=0.0.0.0
policy.port=843

# HTTP
http.host=127.0.0.1
http.port=5080
https.port=5443
http.URIEncoding=UTF-8
http.max_keep_alive_requests=-1
http.max_threads=20
http.acceptor_thread_count=10
http.processor_cache=20

# RTMP
rtmp.host=127.0.0.1
rtmp.port=1935
rtmp.io_threads=16
rtmp.send_buffer_size=65536
rtmp.receive_buffer_size=65536
rtmp.ping_interval=1000
rtmp.max_inactivity=60000
rtmp.max_handshake_time=5000
rtmp.tcp_nodelay=true
...

# RTMPS
rtmps.host=127.0.0.1
rtmps.port=8443
rtmps.ping_interval=5000
rtmps.max_inactivity=60000
rtmps.max_keep_alive_requests=-1
rtmps.max_threads=20
rtmps.acceptor_thread_count=2
rtmps.processor_cache=20
# RTMPS Keystore Password
rtmps.keystorepass=password

# RTMPT
rtmpt.host=127.0.0.1
rtmpt.port=8088
rtmpt.ping_interval=5000
rtmpt.max_inactivity=60000
rtmpt.max_handshake_time=5000
rtmpt.max_keep_alive_requests=-1
rtmpt.max_threads=20
rtmpt.acceptor_thread_count=2
rtmpt.processor_cache=20
rtmpt.encoder_base_tolerance=5000
rtmpt.encoder_drop_live_future=true
# better setting for streaming media
rtmpt.target_reponse_size=32768
# best setting for small messages or shared objects
#rtmpt.target_reponse_size=8192
# max incoming messages to process at a time. the most that FP appears to send is 166
rtmpt.max_in_msg_process=166
# max time in millis that we will wait when offering data to the in or out queue
rtmpt.max_queue_offer_time=125
# max offer attempts
rtmpt.max_queue_offer_attempts=4

# Debug proxy (needs to be activated in red5-core.xml)
proxy.source_host=127.0.0.1
proxy.source_port=1936
proxy.destination_host=127.0.0.1
proxy.destination_port=1935

# JMX
jmx.rmi.host=localhost
jmx.rmi.port=9999
jmx.rmi.port.remoteobjects=
jmx.keystorepass=password
jmx.mina.monitor.enable=true
jmx.mina.poll.interval=1000
jmx.registry.create=true
jmx.reuse.existing.server=true

# Server properties
notifier.threads=4
# thread pool size for SO updater
so.update.threads=4
# max events to send in a single update
so.max.events.per.update=64
keyframe.cache.entry.max=500
stream.executor.threads.min=4
stream.executor.threads.max=32
war.deploy.server.check.interval=600000
fileconsumer.delayed.write=true
fileconsumer.queue.size=21
subscriberstream.buffer.check.interval=5000
subscriberstream.underrun.trigger=100
broadcaststream.auto.record=false

6.5. Porta RTMP
A porta RTMP é onde o servidor Red5 irá transmitir os dados para os clientes de mídia. O fluxo de mídia é acessada em rtmp ://ipdored5:1935
rtmp.host = 127.0.0.1
rtmp.port = 1935

Agora inicie o servidor de mídia Red5, digitando "C:\Red5java\red5.bat" no prompt de comando ou dois cliques no arquivo.
Se o servidor Red5 é iniciado com sucesso, ele pode ser acessado no http://127.0.0.1:8085 no navegador web.

6.6. Erros de porta
Teste do ping no prompt de comando:
ping 1935

Você deve abrir as portas 5080 e 1935, tanto em seu servidor web RED5 e  opcionalmente (se houver) roteador de rede, dependendo da sua topologia de rede.
Se o seu servidor web RED5 está por trás de uma porta de entrada que você deve abrir essas duas portas em sua porta de entrada, bem, a fim de acessar RED5 de fora desta rede.

Obs: este teste gerou erro mesmo o programa de teste sendo executado corretamente na porta 1935.

6.7. Usuário Administrador
Para ter acesso a alteração de arquivos e configuração do Sistema é necessário ser um usuário administrador no Windows.
O Administrador também precisa ser ativa com um comando no prompt:
digite o comando: net user Administrador /active:yes
Para desativar digite: net user Administrador /active:no

Caso o sistema esteje em inglês, troque Administrador por administrator.

6.8. Crindo portas no FireWall do Windows
Para o Windows Vista
Botão niniciar > Painel de controle > Segurança > Firewall do Windows

Boatão Aplicar > Ok

6.9. Verificação das portas
- A porta existe?
Veja como instalar o cliente Telnet, clique neste LINK

Digite netstat no prompt de comando:


No caso acima o programa de exemplo oflaDemo está usando a porta 1935. Foi iniciado o Red 5 e aberto duas páginas com o endereço abaixo indicado, este exemplo utiliza uma webcam:

http://localhost:5080/demos/simpleBroadcaster.html
http://localhost:5080/demos/simpleSubscriber.html


O comando netstat listará todas as portas em uso, instaladas e em desuso e exibe estatística do protocolo e as conexões atuais da rede TCP/IP (Transmission Control Protocol/Internet Protocol, protocolo de controle de transmissão/protocolo Internet).

Neste caso o Red 5 foi inicializado corretamente, não gerou mensagem de erro de conexão.

6.10. Modem
Cada marca de modem tem uma forma de administrá-lo, há modem que bloqueiam portas, outros não bloqueiam porta alguma, torna-se necessário verificar a configuração do modem, geralmente isso é feito com um ip do modem que é digitado em um Browser que abre o programa de condiguração. A senha pode variar com a marca de modem, há necessidade de verificar o manual.

6.11. Erro inicialização do Red 5

A figura acima mostro o erro de inicialização do Red 5, esse erro foi provocado pelo conflito de versões do Java 7 com o Red 5. 1.0 que requer o Java 6.

Ao analisar os logs, você deve olhar para as entradas "Launcher" uma vez que estes lhe dirá quais são os aplicativos do servidor que tentou carregar. Em seu registro, apenas dois aplicativos estão sendo carregados:

6.12. RTMP - Visão Geral
O RTMP (Real Time Messaging Protocol) é um protocolo proprietário desenvolvido pela Adobe Systems que utiliza, por padrão, a porta 1935 e foi utilizado primeiramente no Flash Communication Server.
RTMP usa o protocolo TCP/IP para a transmissão de pacotes e não é usado para RCP (Remote Procedure Calls). O RTMP mantém uma conexão persistente com o servidor e permite a comunicação em tempo real de dados do tipo: áudio, vídeo e objeto.
Hoje o protocolo RTMP está sendo implementado também pelo Red5, através da engenharia reversa.
Para ser realizada a comunicação RTMP, é necessário, além do servidor, um arquivo swf. Este arquivo que deverá ser compartilhado pelos usuários finais, deve ser dotado de chamadas RTMP, normalmente codificadas em Action Script.

7. Estrutura de projeto
Red 5
Existem apenas três arquivos de configurações, o web.xml, o red5-web.xml e o red5-web.properties. Cada um têm as suas funções, são poucas as configurações para um aplicação simples. O próximo exemplo é um demo que pode exemplificar a estrutura de um projeto Red5.

Exemplo:
A aplicação de demonstração do Red 5, oflaDemo, serve como exemplo:
C:\red5\webapps\oflaDemo

Obs: a pasta videos foi incluida por mim, não faz parte da estrutura e a pasta persistencia está vazia.

C:\red5\webapps\oflaDemo\META-INF


C:\red5\webapps\oflaDemo\WEB-INF


7.1. Arquivos de configuração
- Arquivo red5-web.PROPERTIES
O arquivo red5-web.properties informa o caminho, host e portas da  nossa aplicação.
webapp.contextPath=/oflaDemo
webapp.virtualHosts=*, localhost, localhost:8088, 127.0.0.1:8088

webapp.virtualHosts define os ips e domínios onde o servidor red5 podem ser encontrados.
Para acessar um serviço RTMP, myserver, localizado na pasta de publicações, webapps é:
com webapp.virtualHosts = localhost
rtmp://localhost/myserver

- Arquivo red5-web.xml
No arquivo red5-web.xml, apenas temos que informar a nossa classe principal, trata-se de um arquivo padrão que pode ser usado sem alterações na grande maioria das aplicações variando apenas na identificação do bean da aplicação principal: bean id=”web.handler” class=”minha.class.Application”.

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd">
<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/red5-web.properties"/>
</bean>
<bean id="web.context" class="org.red5.server.Context" autowire="byType"/>
<bean id="web.scope" class="org.red5.server.scope.WebScope" init-method="register">
<property name="server" ref="red5.server"/>
<property name="parent" ref="global.scope"/>
<property name="context" ref="web.context"/>
<property name="handler" ref="web.handler"/>
<property name="contextPath" value="${webapp.contextPath}"/>
<property name="virtualHosts" value="${webapp.virtualHosts}"/>
</bean>
<bean id="web.handler" class="org.red5.demos.oflaDemo.Application"/>
<!--

    <bean id="web.handler" class="org.red5.server.script.rhino.RhinoScriptFactory">
        <constructor-arg index="0" value="classpath:main.js"/>
        <constructor-arg index="1">
            <list>
                 <value>org.red5.server.api.IScopeHandler</value>
                 <value>org.red5.server.adapter.IApplication</value>
              </list>
        </constructor-arg>
        <constructor-arg index="2">
               <value>org.red5.server.adapter.ApplicationAdapter</value>
        </constructor-arg>
    </bean>

    <bean id="web.handler" class="org.springframework.scripting.jruby.JRubyScriptFactory">
        <constructor-arg index="0" value="classpath:main.rb"/>
        <constructor-arg index="1">
            <list>
                <value>org.red5.server.api.IScopeHandler</value>
                <value>org.red5.server.adapter.IApplication</value>
            </list>
        </constructor-arg>
    </bean>

    <bean id="web.handler" class="org.red5.server.script.groovy.GroovyScriptFactory">
        <constructor-arg index="0" value="classpath:main.groovy"/>
        <constructor-arg index="1">
            <list>
                <value>org.red5.server.api.IScopeHandler</value>
                <value>org.red5.server.adapter.IApplication</value>
            </list>
        </constructor-arg>
    </bean>

    <bean id="web.handler" class="org.red5.server.script.jython.JythonScriptFactory">
        <constructor-arg index="0" value="classpath:main.py"/>
        <constructor-arg index="1">
            <list>
                 <value>org.red5.server.api.IScopeHandler</value>
                 <value>org.red5.server.adapter.IApplication</value>
              </list>
        </constructor-arg>
        <constructor-arg index="2">
            <list>
                <value>One</value>
                <value>2</value>
                <value>III</value>
            </list>
        </constructor-arg>
    </bean>
-->
<bean id="demoService.service" class="org.red5.demos.oflaDemo.DemoService"/>
<!--

    <bean id="demoService.service" class="org.red5.server.script.rhino.RhinoScriptFactory">
        <constructor-arg index="0" value="classpath:demoservice.js"/>
        <constructor-arg index="1">
            <list>
                 <value>org.red5.demos.oflaDemo.IDemoService</value>
              </list>
        </constructor-arg>
        <constructor-arg index="2">
               <value>org.red5.demos.oflaDemo.DemoServiceImpl</value>
        </constructor-arg>
    </bean>

    <bean id="demoService.service" class="org.springframework.scripting.jruby.JRubyScriptFactory">
        <constructor-arg index="0" value="classpath:demoservice.rb"/>
        <constructor-arg index="1">
            <list>
                 <value>org.red5.demos.oflaDemo.IDemoService</value>
              </list>
        </constructor-arg>
    </bean>

    <bean id="demoService.service" class="org.red5.server.script.jython.JythonScriptFactory">
        <constructor-arg index="0" value="classpath:demoservice.py"/>
        <constructor-arg index="1">
            <list>
                <value>org.red5.demos.oflaDemo.IDemoService</value>
            </list>
        </constructor-arg>
        <constructor-arg index="2" ref="web.handler"/>
    </bean>
-->
<!--
 Uncomment this if you are using scripting

    <bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/>
-->
</beans>
Obs:
C:\Red5java\webapps\oflaDemo\WEB-INF\classes\org\red5\demos\oflaDemo\Application.class

- Arquivo web.xml
No Arquivo web.xml, a princípio temos que configurar apenas o displayName da nossa aplicação, o param-name e o param-value para informar ao servidor as configurações mínimas da aplicação.

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
    <display-name>oflaDemo</display-name>
    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>/oflaDemo</param-value>
    </context-param>
    <listener>
        <listener-class>org.red5.logging.ContextLoggingListener</listener-class>
    </listener>
    <filter>
        <filter-name>LoggerContextFilter</filter-name>
        <filter-class>org.red5.logging.LoggerContextFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoggerContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>rtmpt</servlet-name>
        <servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <display-name>SecurityTest</display-name>
        <servlet-name>SecurityTest</servlet-name>
        <servlet-class>org.red5.demos.oflaDemo.SecurityTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>rtmpt</servlet-name>
        <url-pattern>/fcs/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>rtmpt</servlet-name>
        <url-pattern>/open/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>rtmpt</servlet-name>
        <url-pattern>/close/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>rtmpt</servlet-name>
        <url-pattern>/send/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>rtmpt</servlet-name>
        <url-pattern>/idle/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>SecurityTest</servlet-name>
        <url-pattern>/securitytest</url-pattern>
    </servlet-mapping>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Forbidden</web-resource-name>
            <url-pattern>/streams/*</url-pattern>
        </web-resource-collection>
        <auth-constraint />
    </security-constraint>
</web-app>

7.2. Diretórios ou Pastas
WEB-INF/lib
O diretório lib dentro do WEB-INF pode conter todas as bibliotecas necessárias para a aplicação Web, evitando assim que o classpath da máquina que roda a aplicação precise ser alterado.

Além do mais, cada aplicação Web poderá usar suas próprias bibliotecas com suas versões específicas! Você vai encontrar projetos open source que somente fornecem suporte e respondem perguntas aqueles usuários que utilizam tal diretório para suas bibliotecas, portanto evite ao máximo o uso do classpath global.

WEB-INF/classes
Serve para rodarmos nossa aplicação no servidor, precisamos ter acesso as classes compiladas (não necessariamente ao código fonte). Por isso, nossos .class são colocados nessa pasta dentro do projeto. Esse padrão é definido pela especificação de Servlets do Java EE. O próprio Eclipse compila nossas classes na pasta build e depois automaticamente as copia para o WEB-INF/classes.

Note que a pasta WEB-INF é muito importante e contém recursos vitais para o funcionamento do projeto. Imagine se o usuário tiver acesso a essa pasta! Códigos compilados (facilmente descompiláveis), bibliotecas potencialmente sigilosas, arquivos de configuração internos contendo senhas, etc.

Para que isso não aconteça, a pasta WEB-INF com esse nome especial é uma pasta invisível ao usuário final. Isso quer dizer que se alguém acessar a URL http://localhost:8080/fj21-agenda/WEB-INF verá apenas uma página de erro (404).

8. Estrutura de diretórios gerado pelo Eclpse JEE
Repare que um projeto do RED 5 é um projeto do Eclipse JEE.

src - código fonte Java (.java)
build - onde o Eclipse compila as classes (.class)
WebContent - content directory (páginas, imagens, css etc vão aqui)
WebContent/WEB-INF/ - pasta oculta com configurações e recursos do projeto
WebContent/WEB-INF/lib/ - bibliotecas .jar
WebContent/WEB-INF/classes/ - arquivos compilados são copiados para cá
META-INF

A pasta META-INF é opcional mas é gerada pelo Eclipse. É onde fica o arquivo de manifesto como usado em arquivos .jar.

9. Contexto
Todo diretório de contexto tem uma estrutura definida, que consiste de:
- Área de documentos do contexto (/), acessível externamente
- Área inaccessível (/WEB-INF), que possui pelo menos um arquivo de configuração padrão (web.xml)
- O WEB-INF pode conter ainda dois diretórios reconhecidos pelo servidor:
(1) um diretório que pertence ao CLASSPATH da aplicação (/WEB-INF/classes) e (2) outro onde podem ser colocados JARs para inclusão no CLASSPATH (/WEB-INF/lib)

9.1. Componentes de um contexto
A raiz define (geralmente) o nome do contexto, é um diretório ou uma pasta como o mesmo nome do projeto (eclipse).
- Na raiz ficam HTMLs, páginas JSP, imagens, applets e outros objetos para download via HTTP
Contexto/WEB-INF/web.xml
- Arquivo de configuração da aplicação
-Define parâmetros iniciais, mapeamentos e outras configurações de servlets e JSPs.
Contexto/WEB-INF/classes/
- Classpath da aplicação
Contexto/WEB_INF/lib/
- Qualquer JAR incluido aqui será carregado como parte do CLASSPATH da aplicação

9.2. Nome do contexto e URL
- A não ser que seja configurado externamente, o nome do contexto aparece na URL após o nome/porta do servidor
http://serv:8080/contexto/subdir/pagina.html
http://serv:8080/contexto/servlet/pacote.Servlet

- Para os documentos no servidor (links em páginas HTML e formulários), a raiz de referência é a raiz de documentos do servidor, ou DOCUMENT_ROOT: http://serv:8080/

- Documentos podem ser achados relativos ao DOCUMENT_ROOT
/contexto/subdir/pagina.html
/contexto/servlet/pacote.Servlet

- Para a configuração do contexto (web.xml), a raiz de referência é a raiz de documentos do contexto: http://serv:8080/contexto/

- Componentes são identificados relativos ao contexto
/subdir/pagina.html
/servlet/pacote.Servlet

Observe que servlet/ é mapeamento virtual definido no servidor para servlets em WEB-INF/classes

10. Recomendação

Todas as definições de aplicativo devem estar dentro da pasta "webapps", este é diretório raiz do Red5. Então a primeira coisa que você terá que fazer, a fim de criar um novo aplicativo, é criar uma nova subpasta em "webapps". Por convenção esta pasta deve ter o mesmo nome da aplicação que será acessada mais tarde.

Dentro de sua nova aplicação, você vai precisar de uma pasta "WEB-INF" contendo arquivos de configuração sobre as classes.

Durante o início do Red5, todas as pastas dentro "webapps" são procurados no diretório "WEB-INF" contendo os arquivos de configuração.

11. Conecção RTMP
Demos
http://localhost:5080/demos/simpleSubscriber.html
http://localhost:5080/demos/simpleBroadcaster.html


A figura abaixo indica que a conexão foi bem sucedida.