e ae pessoal, estou fazendo uma aplicacao q captura o video do celular e envia via Datagrama para outro celular. O codigo que captura da camera eh esse:
No lado do servidor que vai receber os bytes eu nao sei como fazer para ficar capturando esses bytes e colocando na tela. Eu fiz um codigo assim:
while (true) {
Datagram dg = dc.newDatagram(100000);
dc.receive(dg);
ByteArrayInputStream byteArray = new ByteArrayInputStream(dg.getData());
mPlayer = Manager.createPlayer(byteArray, "video/mpeg");
mPlayer.realize();
mVideoControl = (VideoControl) mPlayer.getControl"VideoControl");
//Coloca o video na tela...
}
O problema eh que ele fica criando um Player para cada datagrama que o servidor recebe! eu gostaria de criar esse player no inicio e ficar so setando os bytes recebidos de cada datagrama! Para depois mostrar o video!
Você deve estar querendo fazer isso. Nesse exemplo ele está usando uma URL da internet pra buscar um vídeo, mas repare que nesse caso, ele espera que todo o vídeo seja lido pra depois ele
private InputStream urlToStream(String url) throws IOException
{
// Open connection to the http url...
HttpConnection connection = (HttpConnection) Connector.open(url);
DataInputStream dataIn = connection.openDataInputStream();
byte[] buffer = new byte[1000];
int read = -1;
// Read the content from url.
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
while ((read = dataIn.read(buffer)) >= 0)
{
byteout.write(buffer, 0, read);
}
dataIn.close();
connection.close();
// Fill InputStream to return with content read from the URL.
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteout
.toByteArray());
return byteIn;
}
Veja que nessa parte do Código, onde ele efetivamente executa, chama o vídeo, ele recebe um InputStream que é o resultado da função acima. Ou seja, você está tentando fazer as duas coisas dentro do while(true) e isso não dará certo. Separe as coisas, primeiro carregue os dados pra sua variável, depois você simplesmente cria o Player Manager e executivo o menino.
void initPlayer()
{
try
{
initDone = false;
if (videoFile == null)
{
midlet.alertError("No video file specified");
return;
}
boolean fromHttp = videoFile.startsWith("http://");
InputStream is = fromHttp ? urlToStream(videoFile) : getClass()
.getResourceAsStream(videoFile);
player = Manager.createPlayer(is, "video/3gpp");
player.addPlayerListener(this);
player.prefetch();
player.realize();
// get the video control and attach it to our canvas
VideoControl videoControl = (VideoControl) (player
.getControl("VideoControl"));
if (videoControl == null)
{
midlet.alertError("VideoControl not supported");
}
else
{
videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO,
this);
videoControl.setVisible(true);
}
initDone = true;
}
catch (IOException ioe)
{
discardPlayer();
midlet.alertError("IOException: " + ioe.getMessage());
}
catch (MediaException me)
{
discardPlayer();
midlet.alertError("MediaException: " + me.getMessage());
}
catch (SecurityException se)
{
discardPlayer();
midlet.alertError("SecurityException: " + se.getMessage());
}
catch (Exception ex)
{
discardPlayer();
midlet.alertError("Exception: " + ex.getMessage());
}
}
Esse exemplo eu peguei no site da Nokia. www.forumnokia.com
Existem vários exemplos bem legais lá sobre qualquer coisa de J2ME, vale a Pena dar uma olhada.