Streaming de video via UDP

483 views
Skip to first unread message

Felipe Lemos

unread,
Dec 26, 2012, 2:52:15 PM12/26/12
to androidb...@googlegroups.com
Boa tarde pessoal,

Preciso construir um player que receba um fluxo de vídeo MPEG-TS via UDP e toque esse vídeo.

Creio que o android não tem nenhuma API nativa que faça isso.

Alguém teria alguma ideia de como eu posso fazer?

Muito obrigado.

--
Felipe Herminio Lemos

Graduate in Computer Science
MSc. in Computer Science
Federal University of Paraíba
E-mail: felipehlemos at gmail dot com
http://lattes.cnpq.br/8118095106293115

Danilo Mendonça

unread,
Dec 27, 2012, 7:23:53 AM12/27/12
to androidb...@googlegroups.com
Fala, Felipe.

Eu não tenho uma resposta fácil pra você, mas acho que o primeiro passo é saber se é live ou progressive streaming que você está querendo.


Uma solução bem abrangente pra trabalhar com vídeos é o ffmpeg. Mas é bem chato de fazer, se achar solução melhor, me avise... rs


Abraços,

Danilo Mendonça Yotta Apps – Desenvolvendo Aplicativos
+55 (48) 9119.9291 | dan...@yottaapps.com.br
Site | Blog Facebook | Twitter |   
 | 
**Já viu nossos games: Delivery Box Robot Escape?


--
 
 

Felipe Lemos

unread,
Dec 27, 2012, 7:56:06 AM12/27/12
to androidb...@googlegroups.com
Fala Danilo,

Eu estou querendo progressive streaming.
A partir do android 3.0 já existe suporte para TS, eu acho que a utilização do FFMPEG é justamente para reproduzir o TS, ou estou enganado?

Uma abordagem que tentei foi receber os pacotes TS via UDP, salvar em um arquivo e reproduzir localmente com o VideoView. Inicialmente, na minha cabeça, a ideia funcionaria com certeza, porém, o VideoView calcula o tamanho do arquivo antes de reproduzir, com isso eu teria que receber o arquivo inteiro antes de reproduzir, o que seria inviável.

Baixei até o código do VLC, pois ele reproduz TS via UDP, mas o código é muito complicado e eu não consegui compilar.
Qualquer ajuda será muito bem vinda.

Abraço

--
 
 

Danilo Mendonça

unread,
Dec 27, 2012, 8:26:56 AM12/27/12
to androidb...@googlegroups.com
Meus testes foram justamente na direção contrária do que você precisa... hehe

Era live stream, e eu não queria exibir, apenas armazenar... além disso, era para Android 2.2, eu não podia usar TS.

A única exibição que fiz era somente de imagens, sem áudio, então optei por fazer o ffmpeg gerar Motion JPEG (salva cada frame como imagem) e exibia em um ImageView (achei um projeto massa que faz isso, se precisar me avise que procuro aqui). Se você não precisar do áudio pode ser uma saída. Fora isso, só com o VideoView mesmo, não vejo outra forma.

Também fiz algumas conversões, tipo, sequência de imagens transformadas em vídeo, e colagem de sequência de vídeos com o ffmpeg. Mas não recomendo. Frita o aparelho, gasta bateria, demora horrores, enfim, smartphone/tablet não serve pra isso... hehe

Você pode tentar uma abordagem na parte servidor também. De repente um servidor rtsp.

Abraços,

Danilo Mendonça Yotta Apps – Desenvolvendo Aplicativos
+55 (48) 9119.9291 | dan...@yottaapps.com.br
Site | Blog Facebook | Twitter |   
 | 
**Já viu nossos games: Delivery Box Robot Escape?


--
 
 

Felipe Lemos

unread,
Dec 27, 2012, 8:35:15 AM12/27/12
to androidb...@googlegroups.com
Entendi Danilo.
O problema é que eu não tenho acesso ao servidor, eu vou receber um fluxo Ts via UDP de uma empresa e tenho que tocar no android 4.0.

Ja revirei o google e não achei nada, to achando que o jeito é usar JNI como o VLC, se eu conseguir eu comento aqui.

Obrigado pela força cara.

Abraço

luciofm

unread,
Dec 27, 2012, 8:39:13 AM12/27/12
to androidb...@googlegroups.com
Você não pode fazer um proxy no meio do caminho?  receber o stream em um server e converter para RTSP.

Lúcio Maciel
luc...@gmail.com


2012/12/27 Felipe Lemos <felipe...@gmail.com>
--
 
 

Danilo Mendonça

unread,
Dec 27, 2012, 8:41:51 AM12/27/12
to androidb...@googlegroups.com
É uma ótima sugestão. Com o ffmpeg no servidor você consegue fazer.

Precisando estamos ae.

Abraços,

Danilo Mendonça Yotta Apps – Desenvolvendo Aplicativos
+55 (48) 9119.9291 | dan...@yottaapps.com.br
Site | Blog Facebook | Twitter |   
 | 
**Já viu nossos games: Delivery Box Robot Escape?


--
 
 

Danilo Mendonça

unread,
Dec 27, 2012, 8:44:56 AM12/27/12
to androidb...@googlegroups.com
Correção: ffserver, na verdade: http://ffmpeg.org/ffserver.html

Danilo Mendonça Yotta Apps – Desenvolvendo Aplicativos
+55 (48) 9119.9291 | dan...@yottaapps.com.br
Site | Blog Facebook | Twitter |   
 | 
**Já viu nossos games: Delivery Box Robot Escape?


Felipe Lemos

unread,
Dec 27, 2012, 8:47:56 AM12/27/12
to androidb...@googlegroups.com
Da pra fazer isso progressivo, a medida que for recebendo o stream, converter, enviar via RTSP e tocar no VideoView?
Rtsp toca TS nativamente?

Se as duas perguntas a resposta for sim, creio que poderá dar certo.

Danilo Mendonça

unread,
Dec 27, 2012, 9:11:49 AM12/27/12
to androidb...@googlegroups.com
Eu sei que faz stream de câmera e de arquivo. Diretamente de outro stream eu não sei.

Se não fizer, dependendo do formato do seu stream original, você pode tentar pegar o stream via ffmpeg e salvar para um arquivo, e fazer a stream a partir do arquivo gerado.

Depende do formato. Se o formato já enviar os pacotes com os cabeçalhos organizados, rola, senão você cai no mesmo problema de ter que esperar o ffmpeg terminar para organizar os cabeçalhos e só então você poder abrir o stream.

Abraços,



Danilo Mendonça Yotta Apps – Desenvolvendo Aplicativos
+55 (48) 9119.9291 | dan...@yottaapps.com.br
Site | Blog Facebook | Twitter |   
 | 
**Já viu nossos games: Delivery Box Robot Escape?


--
 
 

Felipe Lemos

unread,
Dec 27, 2012, 11:59:33 AM12/27/12
to androidb...@googlegroups.com
Mas será que fica em tempo real Danilo, ou pelo menos que o atraso seja mínimo?

Abraço

Danilo Mendonça

unread,
Dec 27, 2012, 7:03:31 PM12/27/12
to androidb...@googlegroups.com
Vai ter um atraso sim, com certeza. Atraso suficiente para não permitir uma live stream, mas como você está trabalhando com progressive, talvez fique bom. 

Seria apenas um 'buffer' inicial. Vai depender de muitas variáveis, desde conexão a hardware, ai tem que avaliar se vai ficar bom para o que você pretende.

Abraços,

Danilo Mendonça Yotta Apps – Desenvolvendo Aplicativos
+55 (48) 9119.9291 | dan...@yottaapps.com.br
Site | Blog Facebook | Twitter |   
 | 
**Já viu nossos games: Delivery Box Robot Escape?


--
 
 

luciofm

unread,
Dec 29, 2012, 7:11:11 AM12/29/12
to androidb...@googlegroups.com
http://code.google.com/p/dolphin-player/

Talvez isso possa te ajudar.. Não cheguei a testar, nem muito menos olhar o código, mas a descrição parece promissora.

Lúcio Maciel
luc...@gmail.com


2012/12/27 Danilo Mendonça <dan...@yottaapps.com.br>
--
 
 

Felipe Lemos

unread,
Dec 29, 2012, 1:56:15 PM12/29/12
to androidb...@googlegroups.com
Eu dei uma olhada por cima, mas só que esse player não da suporte a UDP, ou eu estou enganado?
Mesmo assim obrigado Lúcio.

Abraço

Bruno Albuquerque

unread,
Jan 3, 2013, 8:06:40 AM1/3/13
to androidb...@googlegroups.com
Por que simplesmente não usara  classe MediaPlayer? Como você quer acessar um stream UDP, vai precisar gerenciar o recebimento de dados via UDP por conta mas, uma vez feito isso, pode usar o MediaPlayer pra tocar o stream usando o endpoint UDP local (setDataSource(FileDescriptor fd)). Obviamente isso só vai funcionar se a sua versão do Android possuir o codec pro tipo de stream que está usando.




--
 
 

Felipe Lemos

unread,
Jan 3, 2013, 9:02:48 AM1/3/13
to androidb...@googlegroups.com
Opa Bruno,

A versão do android é a 4.1, essa versão ja tem suporte para stream TS.
Estou recebendo os pacotes do video via UDP bem direitinho. Se eu converter em um FileDescriptor e setar no setDataSource do MediaPlayer ele funciona?
Vou fazer esse teste e comento por aqui!

Abraço

Felipe Lemos

unread,
Jan 3, 2013, 11:58:29 AM1/3/13
to androidb...@googlegroups.com
Bruno, tentei fazer o que você me falou mas não consegui.

Aqui esta o meu Socket.

public void run() {
String lText;
byte[] lMsg = new byte[1316];
DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
DatagramSocket ds = null;

try {
ds = new DatagramSocket(1234);
Log.i("Connection", " OK");

while (true) {
ds.receive(dp);
gravarArquivo(lMsg);
}

// textView.setText(lText);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}

}

}

Aqui esta minha função para gravar em arquivo.

private void gravarArquivo(byte[] buffer) {
        try {
            try {
                f = new File(Environment.getExternalStorageDirectory()+"/"+ARQUIVO);
                out = new FileOutputStream(f, true);
                out.write(buffer);
                out.flush();
                out.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

Tentei dar um start no descritor do arquivo porém não funcionou!

[]s
Reply all
Reply to author
Forward
0 new messages