Transmita vídeo ao vivo de um telefone Android para outro por WiFi

115

Tenho pesquisado na internet há dias sobre como implementar um recurso de streaming de vídeo de um telefone Android para outro telefone Android por meio de uma conexão WiFi, mas não consigo encontrar nada útil. Procurei nos desenvolvedores do Android um código de amostra, stackoverflow, google, blogs do Android, mas nada. Tudo o que posso encontrar é algum tipo de solução de telefone para desktop ou desktop para telefone para streaming, mas nada que eu possa emprestar em minha implementação.

Preciso controlar um robô usando um arduino ADK, então estou usando 2 telefones, um que será montado no robô e outro que receberá o stream de vídeo do robô. Estou mencionando isso porque estou tentando alcançar o menor atraso entre o tempo de transmissão e o tempo de exibição.

Estou escrevendo 2 aplicativos, um aplicativo mestre para controlar o robô (do telefone portátil) que controlará o aplicativo escravo e receberá o fluxo, e o segundo aplicativo escravo que será executado no telefone amarrado ao robô, controlando os motores / atuadores / streaming para o aplicativo mestre. Não posso usar aplicativos de terceiros, infelizmente. Eu preciso integrar o código de fluxo de vídeo em meus 2 aplicativos.

Que opções existem para conseguir isso? Também é muito difícil de fazer porque nunca trabalhei com videostreaming, mas estou me saindo muito bem tanto no desenvolvimento Java quanto no Android. Como devo codificar / decodificar o stream, como inicio a conexão, precisarei trabalhar com UDP em vez de TCP / IP? Eu realmente não sei por onde começar, sem nenhum código de amostra em lugar nenhum. Tenho certeza de que isso pode ser alcançado. Eu simplesmente não consigo encontrar nada útil para me ajudar a começar na direção certa.

Me deparei com o spydroid, mas ele está usando o VLC em um desktop, então não é bom para mim.


EDIT: Confira o blog de Cagney Moreau . Ele entra em detalhes sobre como implementar isso.

androidu
fonte
1
Você pode compartilhar seu projeto, estou fazendo algo parecido, mas streaming de vídeo entre android e desktop (WebClient) ... Pensei em html5 + websockets mas estou enfrentando muitos problemas ...
Buksy
1
Estou desenvolvendo essa solução, que é 80% igual ao que você está tentando fazer. Você precisa configurar um servidor VOIP e então criar clientes para esse VOIP que irão transferir sua voz e vídeo. Eu também estou procurando por isso. Se alguém souber, por favor me avise.
AZ_
1
o e-mail é fornecido em meu perfil
AZ_
1
Confira meu projeto. Tudo em java e explicado em detalhes cagneymoreau.com/stream-video-android
cagney
1
obrigado, também estou trabalhando em um robô. Coisas divertidas
cagney

Respostas:

55

Se você não precisa da funcionalidade de gravação e reprodução em seu aplicativo, usar o player e o aplicativo de streaming de prateleira é uma escolha razoável.

Se você precisar que eles estejam em seu aplicativo, no entanto, você terá que olhar a API MediaRecorder (para o aplicativo de servidor / câmera) e o MediaPlayer (para o aplicativo cliente / player).

Código de amostra rápida para o servidor:

// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();

No lado do jogador, é um pouco complicado, você pode tentar isto:

// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();

Infelizmente, o mediaplayer tende a não gostar disso, então você tem algumas opções: (a) salvar dados do soquete para o arquivo e (depois de ter um pouco de dados) jogar com o mediaplayer do arquivo ou (b) fazer um pequeno http proxy que é executado localmente e pode aceitar a solicitação GET do mediaplayer, responder com cabeçalhos HTTP e copiar dados do servidor remoto para ele. Para (a) você criaria o mediaplayer com um caminho de arquivo ou url de arquivo, para (b) forneça a ele um url http apontando para seu proxy.

Veja também:

Transmita vídeo ao vivo de um telefone para outro usando o socket fd

MediaPlayer falha no início da reprodução de mp3

Alex I
fonte
2
Olá, Alex, você tem alguma experiência com o envio de um arquivo de áudio armazenado local de um telefone Android via RTP?
B770 de
oi você pode me enviar o projeto completo dele?
Umar Asghar
1
você pode postar seu projeto completo?
Yazhini Murugaiya
qual é o soquete do servidor e o soquete do cliente
Yazhini Murugaiya
1
@AhmedHamdy De fato: na API de nível 23 (Android 6.0) você pode usar em setDataSource(MediaDataSource)vez de FileDescriptor. A implementação MediaDataSourcepermitiria que você fizesse sua própria leitura e armazenamento em buffer na rede, sem gravar em um arquivo temporário.
Alex I de
9

Eu trabalhei em algo assim uma vez, mas enviar um vídeo e reproduzi-lo em tempo real é uma coisa muito complexa. Eu sugiro que você trabalhe apenas com PNGs. Na minha implementação, o que fiz foi capturar PNGs usando a câmera host e depois enviá-los pela rede ao cliente, que exibirá a imagem assim que for recebida e solicitará a próxima imagem do host. Como você está usando wi-fi, a comunicação será rápida o suficiente para obter cerca de 8 a 10 imagens por segundo (apenas aproximação, trabalhei no Bluetooth). Portanto, este será um vídeo contínuo, mas com muito menos esforço. Para comunicação, você pode usar soquetes UDP (mais rápido e menos complexo) ou DLNA (não tenho certeza de como isso funciona).

Arveen
fonte
Sim, este seria meu último recurso. Obrigado pelo feedback!
androidu
3
Certamente um stream jpeg seria mais eficiente do que um stream png.
stealthcopter
Eu estava apenas sugerindo o uso de uma imagem, você pode usar qualquer formato que desejar
Arveen
@krossreg> você pode colar um código de amostra para o que sugere?
Jasper
8

Você pode usar a webcam IP ou talvez usar DLNA. Por exemplo, os dispositivos Samsung vêm com um aplicativo chamado AllShare, que pode compartilhar e acessar dispositivos habilitados para DLNA na rede. Mas acho que a webcam IP é sua melhor aposta. Você deve conseguir abrir o stream que ele cria usando o MX Video player ou algo parecido.

maldição
fonte
2
Estou escrevendo 2 aplicativos, um aplicativo mestre para controlar o robô (do telefone portátil) e ver o que o robô vê, e o segundo aplicativo escravo que será executado no telefone amarrado ao robô, controlando os motores / atuadores / streaming. Não posso usar aplicativos de terceiros, infelizmente. Eu preciso integrar o código de fluxo de vídeo em meus 2 aplicativos.
androidu
Talvez você possa fazer alguma pesquisa sobre as especificações DLNA e tentar fazer um aplicativo usando-o para você ou talvez enviar um e-mail para o desenvolvedor do IP Webcam e pedir ajuda.
Idam
1
Fazer engenharia reversa? : P
mgibson
Sim, acho que não tenho outra escolha.
androidu
5

Você pode verificar o VLC do Android, ele pode transmitir e reproduzir vídeo, se você quiser indagar mais, pode verificar o GIT deles para analisar o que eles fazem. Boa sorte!

Ricardo Ortega Magaña
fonte
3
Estou pesquisando o Android VLC. Você poderia me dizer como usá-lo para transmitir um vídeo?
user1914692