Android: gravação e streaming ao mesmo tempo
Esta não é realmente uma pergunta, mas sim uma apresentação de todas as minhas tentativas de resolver uma das funcionalidades mais desafiadoras que eu enfrentei.
eu usolibstreaming biblioteca para transmitir vídeos em tempo real paraServidor Wowza e preciso gravá-lo ao mesmo tempo dentro do cartão SD. Estou apresentando abaixo todas as minhas tentativas para coletar novas idéias da comunidade.
Copie bytes do fluxo libstreaming para um arquivo mp4Desenvolvimento
Criamos uma interceptação na biblioteca libstreaming para copiar todos os bytes enviados para um arquivo mp4. Libstreaming envia os bytes para o servidor Wowza através de um LocalSocket. Ele usa o MediaRecorder para acessar a câmera e o microfone do dispositivo e define o arquivo de saída como o fluxo de entrada do LocalSocket. O que fazemos é criar um wrapper em torno desse fluxo de entrada que se estenda a partir de InputStream e criar um fluxo de saída de arquivo dentro dele. Portanto, toda vez que o libstreaming executa uma leitura no fluxo de entrada do LocaSocket, copiamos todos os dados no fluxo de saída, tentando criar um arquivo MP4 válido.
Impedimento
Quando tentamos ler o arquivo, ele está corrompido. Percebemos que há meta informações ausentes no arquivo MP4. Especificamente, o átomo de moov. Tentamos atrasar o fechamento do streaming para dar tempo para enviar esse cabeçalho (ainda era um palpite), mas não funcionou. Para testar a coerência desses dados, usamos um software pago para tentar recuperar o vídeo, incluindo o cabeçalho. Tornou-se jogável, mas era principalmente tela verde. Portanto, isso se tornou uma solução não confiável. Também tentamos usar o "untrunc", um programa gratuito de linha de comando de código aberto e não foi possível iniciar a recuperação, pois não havia um átomo de moov.
Use ffmpeg compilado para android para acessar a câmeraDesenvolvimento
O FFMPEG possui um plug-in gradle com uma interface java para usá-lo em aplicativos Android. Pensamos que poderíamos acessar a câmera via linha de comando (provavelmente está em "/ dev / video0") e a enviamos ao servidor de mídia.
Impedimento
Ocorreu o erro "Permissão negada" ao tentar acessar a câmera. A solução alternativa seria fazer a raiz do dispositivo para ter acesso a ele, mas isso faria com que os telefones perdessem a garantia e poderiam prejudicá-los.
Use o ffmpeg compilado para o Android combinado com o MediaRecorderDesenvolvimento
Tentamos fazer o FFMPEG transmitir um arquivo mp4 sendo gravado dentro do telefone via MediaRecorder
Impedimento
O FFMPEG não pode transmitir arquivos MP4 que ainda não foram concluídos com a gravação.
Use ffmpeg compilado para android com libstreamingDesenvolvimento
O Libstreaming usa LocalServerSocket como a conexão entre o aplicativo e o servidor, então pensamos em usar o ffmpeg conectado ao endereço local LocalServerSocket para copiar o streaming diretamente para um arquivo local dentro do cartão SD. Logo após o início da transmissão, também executamos o comando ffmpeg para começar a gravar os dados em um arquivo. Usando o ffmpeg, acreditamos que ele criaria um arquivo MP4 da maneira correta, o que significa que o cabeçalho do moov atom foi incluído.
Impedimento
O "endereço" criado não é legível via linha de comando, como um endereço local dentro do telefone. Portanto, a cópia não é possível.
Use OpenCVDesenvolvimento
O OpenCV é uma biblioteca de código aberto e plataforma cruzada que fornece blocos de construção para experimentos e aplicativos de visão computacional. Oferece interfaces de alto nível para captura, processamento e apresentação de dados de imagem. Ele tem suas próprias APIs para conectar-se à câmera do dispositivo, então começamos a testá-la para ver se ela tinha as funcionalidades necessárias para transmitir e gravar ao mesmo tempo.
Impedimento
Descobrimos que a biblioteca não está realmente definida para fazer isso, mas mais como manipulação matemática da imagem. Recebemos até a recomendação de usar a libstreaming (o que já fazemos).
Use o Kickflip SDKDesenvolvimento
O Kickflip é um serviço de streaming de mídia que fornece seu próprio SDK para desenvolvimento no Android e IOS. Ele também usa HLS em vez de RTMP, que é um protocolo mais recente.
Impedimento
O SDK deles exige a criação de uma Atividade com a visualização da câmera que ocupa a tela inteira do dispositivo, quebrando a usabilidade do nosso aplicativo.
Use o Adobe AirDesenvolvimento
Começamos a consultar outros desenvolvedores de aplicativos já disponíveis na Play Store, que já transmitem para servidores.
Impedimento
Ao entrar em contato com esses desenvolvedores, eles garantiram que não seria possível gravar e transmitir ao mesmo tempo usando essa tecnologia. Além disso, teríamos que refazer todo o aplicativo do zero usando o Adobe Air.
ATUALIZARWebrtcDesenvolvimento
Começamos a usar o WebRTC seguindoesse grande projeto. Incluímos o servidor de sinalização no servidor NODEJS e começamos a fazer o handshake padrão via soquete. Ainda estávamos alternando entre gravação local e streaming via webrtc.
Impedimento
O Webrtc não funciona em todas as configurações de rede. Fora isso, a aquisição da câmera é todo o código nativo, o que torna muito mais difícil tentar copiar os bytes ou interceptá-los.