Criando uma playlist com Flash Communication Server/Flash Media Server

Criando uma playlist com Flash Communication Server/Flash Media Server.

Introdução

Vimos no artigo anterior como gravar stream usando o Flash Communication Server/Flash Media Server, agora vamos implementar uma playlist para esse recurso. Cada vídeo que gravarmos será adicionado a playlist para posterior disponibização.

Pré-Requisitos

Macromedia Flash 8, Flash Communication Server ou Flash Media Server.

Objetivo

Criar uma playlist usando o servidor Flash Communication Server ou Flash Media Server(Ainda não foi testado no Red5).

Conceitos

Para isto usaremos o SharedObject Remote para guardar as informações dos vídeos gravados. SharedObjects oferece compartilhamento de informação em tempo real entre multiplos clientes SWF’s podendo ser persistentes na maquina local ou no servidor remoto. O local Shared object seria como “Cookies” e o SharedObject Remote como transferência de dados em tempo-real.

Conteúdo

Abra um documeno novo no Flash, vamos criar dois movies clips do tipo video, para adicionar um objeto video na sua library, abra o painel library (windom Video object to your library, open the Library panel (Window > Library ou Ctrl+L ou F11) a adicione um embedded Video object selecionando New Video nas opções da library.

Primeiro conectanto ao servidor Flashcom/Flash Media Server:

client_nc = new NetConnection();
client_nc.onStatus = function(info) {
trace(“Level: “+info.level+” Code: “+info.code);
};
client_nc.connect(“rtmp:/playlist”);//considerando localhost

Recuperando os dados do Shared Object Remote, e preenchendo o component “List” usando o método onSync, esse método é o responsável pela sincronização de dados com o servidor.

rec_so = SharedObject.getRemote(“videos”, client_nc.uri, true);
rec_so.onSync = function(list) {
_root.Play_list.removeAll();
for (var i in _root.rec_so.data) {
_root.Play_list.addItem(i);
}
};
rec_so.connect(client_nc);

Na primeira linha note que damos o nome de “vídeo” ao objeto criado, o terceiro parâmetro “true” garantirá que os dados permaneçam no servidor, caso fosse passado o paramêtro false, os dados so permaneceriam enquanto o usuário estivesse conectado ao aplicativo.

No palco teremos dois campos de textos, um com o nome de instância de “ListItem” do tipo “input” e outro com o o nome de instância de “Status_msg” do tipo “dynamic”, também terá dois movie clips do tipo vídeo, um para receber a webcam com o nome de instância de “live” e outro para mostrar os vídeos selecionado da list com o nome de instância de “publicado”.

Criamos uma função para gravar o stream:

function doRecord() {
if (ListItem.text == undefined || ListItem.text == “”) {
Status_msg.text = “Necessario um titulo.”;
ListItem.setFocus();
} else if (Record_btn.label == “Record”) {
Status_msg.text = “Recording…”;
if (Play_btn.label == “Stop”) {
doPlay();
}
Play_btn.enabled = false;
out_ns = new NetStream(_root.client_nc);
out_ns.attachAudio(Microphone.get());
var teste_cam:Camera = Camera.get();
live.attachVideo(teste_cam);
out_ns.attachVideo(teste_cam);
out_ns.publish(ListItem.text, “record”);
_root.rec_so.data[ListItem.text] = ListItem.text;
_root.rec_so.flush();
Record_btn.label = “Stop”;
} else if (Record_btn.label == “Stop”) {
out_ns.close();
Play_btn.enabled = true;
Record_btn.label = “Record”;
ListItem.text = “”;
Status_msg.text = “…”;
}
}

Detalhe interessante no método “publish” da classe NetStream, que pode ter três argumentos, sua sintaxe é a seguinte:

out_ns.publish(nome_do_flv, jeito de salvar);

o primeiro parâmetro sendo o nome do arquivo, no caso o nome do nosso vídeo, e o segundo parâmetro o jeito de publicação que pode ser entre:

record = salva o arquivo como flv no servidor, se o arquivo já existir será sobrescrito.
append = salva o arquivo como flv no servidor, acrescentando a partir do arquivo salvo anteriormente.
live = transmite ao vivo sem salvar, se o arquivo existir será deletado.

Criando o método para rodar o vídeo da list

function doPlay() {
if (Play_btn.label == “Play”) {
Status_msg.text = “Playing…”;
Play_btn.label = “Stop”;
var playFileName = Play_list.selectedItem.label;
_root.in_ns = new NetStream(_root.client_nc);
publicado.attachVideo(_root.in_ns);
_root.in_ns.play(playFileName);
in_ns.onStatus = function(info) {
if (info.level == “error” || info.code == “NetStream.Play.Stop”) {
Status_msg.text = “Stopped sending data…”;
Play_btn.label = “Play”;
}
};
} else if (Play_btn.label == “Stop”) {
Status_msg.text = “Stop…”;
in_ns.onStatus = null;
in_ns.close();
Play_btn.label = “Play”;
}
}

Finalizando com a criação dinamicamente dos botões, da list e associando os métodos doRecord e doPlay aos eventos dos botões.

Play_list.addEventListener(“change”, listListener);
var Play_list = _root.createClassObject(mx.controls.List, “Play_list”, 1, {_x:357, _y:214});
Play_list.setSize(148, 177);
var Play_btn = _root.createClassObject(mx.controls.Button, “Play_btn”, 2, {_x:170, _y:216, label:”Play”});
var Record_btn = _root.createClassObject(mx.controls.Button, “Record_btn”, 3, {_x:47, _y:216, label:”Record”});
Record_btn.onRelease = function() {
doRecord();
};
Play_btn.onRelease = function() {
doPlay();
};
var listListener:Object = new Object();
listListener.change = function(evt_obj:Object) {
var playFileName = evt_obj.target.selectedItem.label;
trace(playFileName);
in_ns.pause();
in_ns = new NetStream(_root.client_nc);
publicado.attachVideo(in_ns);
in_ns.play(playFileName);
};

O código completo:

client_nc = new NetConnection();
client_nc.onStatus = function(info) {
trace(“Level: “+info.level+” Code: “+info.code);
};
client_nc.connect(“rtmp://200.219.239.68/osfederais/playlist”);
rec_so = SharedObject.getRemote(“recordings”, client_nc.uri, true);
rec_so.onSync = function(list) {
_root.Play_list.removeAll();
for (var i in _root.rec_so.data) {
_root.Play_list.addItem(i);
}
};
rec_so.connect(client_nc);
function doRecord() {
if (ListItem.text == undefined || ListItem.text == “”) {
Status_msg.text = “Necessario um titulo.”;
ListItem.setFocus();
} else if (Record_btn.label == “Record”) {
Status_msg.text = “Recording…”;
if (Play_btn.label == “Stop”) {
doPlay();
}
Play_btn.enabled = false;
_root.out_ns = new NetStream(_root.client_nc);
_root.out_ns.attachAudio(Microphone.get());
_root.teste_cam = Camera.get();
_root.live.attachVideo(teste_cam);
_root.out_ns.attachVideo(_root.teste_cam);
_root.out_ns.publish(ListItem.text, “record”);
_root.rec_so.data[ListItem.text] = ListItem.text;
_root.rec_so.flush();
Record_btn.label = “Stop”;
} else if (Record_btn.label == “Stop”) {
_root.out_ns.close();
Play_btn.enabled = true;
Record_btn.label = “Record”;
ListItem.text = “”;
Status_msg.text = “…”;
}
}
function doPlay() {
if (Play_btn.label == “Play”) {
Status_msg.text = “Playing…”;
Play_btn.label = “Stop”;
var playFileName = Play_list.selectedItem.label;
_root.in_ns = new NetStream(_root.client_nc);
publicado.attachVideo(_root.in_ns);
_root.in_ns.play(playFileName);
_root.in_ns.onStatus = function(info) {
if (info.level == “error” || info.code == “NetStream.Play.Stop”) {
Status_msg.text = “parado…”;
Play_btn.label = “Play”;
}
};
} else if (Play_btn.label == “Stop”) {
Status_msg.text = “Stop…”;
_root.in_ns.onStatus = null;
_root.in_ns.close();
Play_btn.label = “Play”;
}
}
Play_list.addEventListener(“change”, cbListener);
var Play_list = _root.createClassObject(mx.controls.List, “Play_list”, 1, {_x:357, _y:214});
Play_list.setSize(148, 177);
var Play_btn = _root.createClassObject(mx.controls.Button, “Play_btn”, 2, {_x:170, _y:216, label:”Play”});
var Record_btn = _root.createClassObject(mx.controls.Button, “Record_btn”, 3, {_x:47, _y:216, label:”Record”});
Record_btn.onRelease = function() {
doRecord();
};
Play_btn.onRelease = function() {
doPlay();
};
var cbListener:Object = new Object();
cbListener.change = function(evt_obj:Object) {
var playFileName = evt_obj.target.selectedItem.label;
trace(playFileName);
in_ns.pause();
in_ns = new NetStream(_root.client_nc);
publicado.attachVideo(in_ns);
in_ns.play(playFileName);

};

Para definir sua aplicação no servidor, crie um diretorio chamado “playlist” no seu servidor do Flash Communication Server/Flash Media Server.

Dê ctrl+enter para testar a aplicação
Veja a aplicaçao em funcionamento

Considerações Finais

Simples e fácil criar uma playlist usando o Flash Communication Server/Flash Media Server, pode servir como um livro de visitas.

Para saber mais:

Meu Blog FCS/FMS
http://www.dotpix.com.br/~leo/?cat=11

Flash Media Server Developer Center
http://www.macromedia.com/devnet/flashmediaserver/

FlashComGuru
http://www.flashcomguru.com/

FlashCom.com.br
http://www.flashcom.com.br/

Flash Media Server Fun
http://www.fczone.com/

Autor: Leonardo França – Colunista R.I.A do Portal MXSTUDIO

Qualquer dúvida envie um email para leo@dotpix.com.br ou acesse o nosso fórum e visitem meu BLOG

Escrito por leonardofranca on março 4, 2006. Arquivado em Flash Media Server. Você pode seguir as respostas a esse artigo pelo RSS 2.0. Você pode deixar respostas para esse artigo

3 respostas a Criando uma playlist com Flash Communication Server/Flash Media Server

  1. Queria Criar uma TV Online mais…
    Ond eu Ponho os Códigos ?
    E.. Ond eu Acesso a TV?

  2. No red5 + Flash Cs3

  3. The correct syntax is SharedObject.getRemote(). To assign the object to a variable, use syntax like:

    var myRemote_so:SharedObject = SharedObject.getRemote(objectName, URI [, persistence])

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>