Sei sulla pagina 1di 9

1

Descrio da tarefa de programao a ser feita na disciplina de Redes de Alto


Desempenho (RAD) SSC-144. Turmas A e B.
A tarefa de programao referente ao Captulo 7 do Livro: Redes de Computadores e a
Internet: Uma abordagem top-down. (Kurose & Rosss, 2006).

Streaming vdeo com RTSP e RTP
1. O cdigo
Neste laboratrio, voc implementar um servidor de streaming vdeo e cliente que se
comunica usando o protocolo de fluxo contnuo em tempo real (RTSP) e envia dados
usando o protocolo de tempo real (RTP). Sua tarefa implementar o protocolo RTSP no
cliente e implementar o empacotamento RTP no servidor.
Forneceremos o cdigo que implementa o protocolo RSTP no servidor, o
desempacotamento RTP no cliente e trataremos de exibir o vdeo transmitido. Voc no
precisa mexer neste cdigo.
2. Classes
Existem quatro classes nesta tarefa.
Client
Esta classe implementa o cliente e a interface de usurio que voc usar para
enviar comandos RTSP e que ser utilizada para exibir o vdeo. Abaixo vemos
como a interface. Voc dever implementar as aes que so tomadas quando
os botes so pressionados.
Server
Esta classe implementa o servidor que responde s requisies RTSP e
encaminha o vdeo de volta. A interao RTSP j est implementada e o servidor
chama as rotinas na classe RTPpacket para empacotar os dados de vdeo. Voc
no precisa mexer nesta classe.
RTPpacket
Esta classe usada para manipular os pacotes RTP. Ela possui rotinas separadas
para tratar os pacotes recebidos no lado cliente que j dado e voc no precisa
modific-lo (mas veja os Exerccios opcionais). Voc dever completar o
primeiro construtor desta classe para implementar o empacotamento RTP dos
2
dados de vdeo. O segundo construtor usado pelo cliente para desempacotar os
dados. Voc no precisa modific-lo tambm.
VideoStream
Esta classe usada para ler os dados de vdeo do arquivo em disco. Voc no
precisa modificar esta classe.
3. Executando o cdigo
Aps completar o cdigo, voc pode execut-lo da seguinte forma:
Primeiro, inicie o servidor com o comando:
java Server server_port
onde server_port a porta onde seu servidor escuta as conexes RTSP que chegam. A
porta RTSP padro a 554, mas voc deve escolher um nmero de porta maior que
1024.
Ento, inicie o cliente com o comando:
java Client server_name server_port video_file
onde server_name o nome da mquina onde o servidor est sendo executado,
server_port a porta que o servidor est escutando, e video_file o nome do
arquivo que voc quer requisitar (fornecemos um arquivo de exemplo movie.Mjpeg). O
formato do arquivo est descrito no Apndice.
O cliente abre uma conexo com o servidor e abre uma janela como esta:

3
Voc pode enviar comandos RTSP para o servidor pressionando os botes. Uma
interao normal RTSP acontece assim:
1. O cliente envia SETUP. Esse comando usado para ajustar os parmetros de
sesso e de transporte.
2. O cliente envia PLAY. Isso inicia a reproduo.
3. O cliente pode enviar PAUSE se ele quiser pausar durante a reproduo.
4. O cliente envia TEARDOWN. Isso termina a sesso e fecha a conexo.
O servidor sempre responde a todas as mensagens que o cliente envia. Os cdigos de
resposta so exatamente os mesmos do HTTP. O cdigo 200 indica que a requisio foi
bem-sucedida. Neste laboratrio, voc no precisa implementar nenhum outro cdigo de
resposta. Para mais informaes sobre o RTSP, veja a RFC-2326.

4. Cliente
Sua primeira tarefa implementar o RTSP do lado cliente. Para fazer isso, voc deve
completar as funes que so chamadas quando o usurio clica nos botes da interface
de usurio. Para cada boto na interface, h uma funo manipuladora do cdigo. Voc
deve implementar as seguintes aes em cada funo manipuladora.
Quando o cliente iniciado, ele tambm abre o socket RTSP para o servidor. Use este
socket para enviar todas as requisies RTSP.
SETUP
Crie um socket para receber os dados RTP e ajustar o tempo de expirao no
socket para 5 milissegundos.
Envie uma requisio SETUP para o servidor. Voc deve inserir o cabealho de
Transporte onde voc especificar a porta para o socket de dados RTP que voc
criou.
Leia a resposta do servidor e analise o cabealho de Sesso na resposta para obter
o ID da sesso.
4
PLAY
Envie uma requisio PLAY. Voc deve inserir o cabealho de sesso e usar o ID
de sesso fornecido na resposta ao SETUP. No coloque cabealho de Transporte
nesta requisio.
Leia a resposta do servidor.
PAUSE
Envie uma requisio PAUSE. Voc deve inserir o cabealho de Sesso e usar o
ID de sesso fornecido na resposta ao SETUP. No coloque cabealho de
Transporte nesta requisio.
Leia a resposta do servidor.
TEARDOWN
Envie uma requisio TEARDOWN. Voc deve inserir o cabealho de Sesso e
usar o ID de sesso fornecido na resposta ao SETUP. No preciso colocar
cabealho de Transporte neste requisio.
Leia a resposta do servidor.
Nota: Voc deve inserir o cabealho CSeq em cada requisio que voc enviar. O valor
do cabealho CSeq um numero que ser incrementado de 1 a cada requisio que voc
enviar.

Exemplo
Aqui est uma interao de amostra entre cliente e servidor. As requisies dos clientes
so marcadas com C: e as respostas dos servidores com S:. Neste laboratrio, tanto o
cliente quanto o servidor so bem simples. Eles no precisam ter rotinas de anlise
sofisticadas e esperam sempre encontrar os campos do cabealho na ordem que voc
ver abaixo, ou seja, numa requisio, o primeiro cabealho o CSeq, e o segundo ou
o de Transporte (para SETUP) ou o de Sesso (para todas as outras requisies). Na
resposta, CSeq novamente o primeiro e de Sesso o segundo.
C: SETUP movie.Mjpeg RTSP/1.0
C: CSeq: 1
C: Transport: RTP/UDP; client_port= 25000
5

S: RTSP/1.0 200 OK
S: CSeq: 1
S: Session: 123456

C: PLAY movie.Mjpeg RTSP/1.0
C: CSeq: 2
C: Session: 123456

S: RTSP/1.0 200 OK
S: CSeq: 2
S: Session: 123456

C: PAUSE movie.Mjpeg RTSP/1.0
C: CSeq: 3
C: Session: 123456

S: RTSP/1.0 200 OK
S: CSeq: 3
S: Session: 123456

C: PLAY movie.Mjpeg RTSP/1.0
C: CSeq: 4
C: Session: 123456

S: RTSP/1.0 200 OK
S: CSeq: 4
S: Session: 123456

C: TEARDOWN movie.Mjpeg RTSP/1.0
C: CSeq: 5
C: Session: 123456

S: RTSP/1.0 200 OK
S: CSeq: 5
S: Session: 123456

Estado do cliente
Uma das diferenas entre HTTP e RTSP que no RTSP cada sesso possui um estado.
Neste laboratrio, voc precisar manter o estado do cliente atualizado. O cliente muda
6
de estado quando ele recebe uma resposta do servidor de acordo com o seguinte
diagrama.

5. Servidor
No servidor, voc precisar implementar o empacotamento dos dados de vdeo em
pacotes RTP. Para isso, ser necessrio criar o pacote, ajustar os campos no cabealho
do pacote e copiar a carga til (exemplo: um quadro de vdeo) dentro do pacote.
Quando o servidor recebe a requisio PLAY do cliente, ele aciona um temporizador
que ativado a cada 100ms. Nesses tempos, o servidor ler um quadro de vdeo do
arquivo e o enviar para o cliente. O servidor cria um objeto RTPpacket, que o
encapsulamento RTP do quadro de vdeo.
O servidor chama o primeiro construtor da classe RTPpacket para realizar o
encapsulamento. Sua tarefa escrever essa funo. Voc precisar fazer o seguinte: (as
letras em parnteses se referem aos campos no formato do pacote RTP abaixo)
1. Ajuste o campo RTP-version (V). Voc deve ajust-lo para 2.
2. Ajuste os campos padding (P), extension (X), number of contributing sources
(CC), e marker (M). Todos eles so ajustados em zero neste laboratrio.
3. Ajuste o campo carga til (PT). Neste laboratrio, usamos MJPEG e o tipo para
ele 26.
4. Ajuste o nmero de seqncia. O servidor fornece esse nmero de seqncia
como argumento Framenb para o construtor.
5. Ajuste a marca de tempo. O servidor fornece este nmero como argumento Time
para o construtor.
7
6. Ajuste o identificador da fonte (SSRC). Este campo identifica o servidor. Voc
pode usar o valor inteiro que desejar.
Como no temos nenhuma outra fonte de contribuio (campo CC == 0), o campo
CSRC no existe. O comprimento do cabealho do pacote de 12 bytes, ou as trs
primeiras linhas do diagrama abaixo.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Voc deve preencher o cabealho na disposio header da classe RTPpacket. Voc
tambm precisar copiar a carga til (fornecida como argumento data) para a varivel
payload. O comprimento da carga til dado no argumento data_length.
O diagrama acima est na ordem de byte de rede (tambm conhecido como big-endian).
A Java Virtual Machine usa a mesma ordem de byte, ento voc no precisa transformar
seu cabealho de pacote na ordem de byte de rede.
Para mais detalhes sobre RTP, veja a RFC-3550.

Manipulando os bits
Aqui esto alguns exemplos de como ajustar e verificar bits individuais ou grupo de
bits. Note que no formato do cabealho do pacote RTP, os menores nmeros de bit se
referem a maiores ordens de bits, ou seja, o bit nmero 0 de um byte 2^7, e o bit
nmero 7 1 (ou 2^0). Nos exemplos abaixo, os nmeros de bit se referem aos nmeros
no diagrama acima.
8
Como o campo header da classe RTPpacket um vetor do tipo byte, voc precisar
ajustar o cabealho de um byte por vez, que um grupo de 8 bits. O primeiro byte
possui os bits 0-7, o segundo byte possui os bits 8-15, e assim por diante. Em Java, um
int tem 32 bits ou 4 bytes.
Para ajustar o nmero n na varivel mybyte do tipo byte:
mybyte = mybyte | 1 << (7 n);
Para ajustar os bits n e n+1 para o valor de foo na varivel mybyte:
mybyte = mybyte | foo << (7 n);
Note que foo deve ter um valor que possa ser expresso com 2 bits, ou seja, 0, 1, 2 ou 3.
Para copiar um foo inteiro de 16-bits em 2-bytes, b1 e b2:
b1 = foo >> 8;
b2 = foo & 0xFF;
Aps fazer isso, b1 ter 8 bits de maior ordem de foo e b2 ter 8 bits de menor ordem
de foo.
Voc pode copiar um inteiro de 32-bits em 4-bytes de maneira similar.
Se voc no se sente confortvel com o ajuste de bits, pode encontrar mais informaes
no Java Tutorial.

Exemplo de bit
Suponha que desejamos preencher o primeiro byte do cabealho do pacote RTP com os
seguintes valores:
V = 2
P = 0
X = 0
CC = 3
Em binrio, isso poderia ser representado como
1 0 | 0 | 0 | 0 0 1 1
V=2 P X CC = 3

2^7 . . . . . . . 2^0
9


Exerccios:
Calcule as estatsticas sobre a sesso. Voc precisar calcular a taxa de perda de
pacotes RTP, a taxa de dados de vdeo (em bits ou bytes por segundo) e qualquer outra
estatstica interessante que voc conseguir encontrar.
A interface de usurio no cliente possui 4 botes para as 4 aes. Se voc compar-la
a um transdutor padro, tal como RealPlayer ou transdutor Windows, voc ver que eles
possuem apenas 3 botes para as mesmas aes, chamadas, PLAY, PAUSE e STOP
(correspondendo exatamente ao TEARDOWN). No h nenhum boto de SETUP
disponvel para o usurio. Dado que o SETUP mandatrio numa interao RTSP,
como voc implementaria isso? apropriado enviar TEARDOWN quando o usurio
clica no boto stop?
At aqui, o cliente e o servidor implementam apenas o mnimo necessrio de
interaes RTSP e PAUSE. Implemente o mtodo DESCRIBE, que usado para passar
informaes sobre o media stream. Quando o servidor recebe uma requisio
DESCRIBE, ele envia de volta um arquivo de descrio de sesso que diz ao cliente que
tipos de streams esto na sesso e quais codificaes esto sendo utilizadas.
Apndice
Formato do MJPEG (Motion JPEG) proprietrio do laboratrio.
Neste laboratrio, o servidor encaminha um vdeo codificado com um formato de
arquivo proprietrio MJPEG. Este formato armazena o vdeo como concatenao de
imagens codificadas em JPEG, com cada imagem sendo precedida por um cabealho de
5-bytes que indica o tamanho em bits da imagem. O servidor analisa o bitstream do
arquivo MJPEG para extrair as imagens JPEG no caminho. O servidor envia as imagens
ao cliente em intervalos peridicos. O cliente ento exibe as imagens JPEG individuais
conforme elas vo chegando do servidor.
REFERNCIA:

(Kurose & Ross, 2006) Kurose, James F. Ross, Keith W. Redes de Computadores e a
Internet: uma abordagem top-down. 3ed. So Paulo, Pearson Addison Wesley, 2006.

Potrebbero piacerti anche