Pergunta

Estou procurando a melhor maneira (se houver...) de capturar vídeo contínuo em um buffer circular no cartão SD, permitindo ao usuário capturar eventos depois que eles acontecerem.

A API de gravação de vídeo padrão permite apenas gravar diretamente em um arquivo, e quando atingir o limite (definido pelo usuário, ou a capacidade do cartão SD) você deve parar e reiniciar a gravação.Isso cria uma janela de até 2 segundos onde a gravação não está em execução.Isso é o que alguns aplicativos existentes como o DailyRoads Voyager já fazem.Para minimizar a chance de perder algo importante, você pode definir o tempo de divisão para algo longo, como 10 minutos, mas se um evento ocorrer próximo ao final desse intervalo de tempo, você estará desperdiçando espaço armazenando os 9 minutos de nada no início.

Então, minha ideia por enquanto é a seguinte:Terei um arquivo grande que servirá como buffer.Usarei algum código que encontrei para capturar os quadros e salvá-los no arquivo, finalizando no final.Quando o usuário quiser manter alguma parte, marcarei com ponteiros para o início e o fim no buffer.A gravação pode continuar como antes, ignorando as regiões marcadas para retenção.

Depois que a gravação for interrompida, ou talvez durante um thread em segundo plano (dependendo da velocidade do telefone/cartão), copiarei a região marcada para outro arquivo e removerei a proteção contra gravação.

Pergunta principal, se você não se importa com os detalhes acima: Não consigo encontrar uma maneira de converter os quadros individuais em um arquivo de vídeo no Android SDK.É possível?Caso contrário, existem bibliotecas disponíveis, talvez em código nativo, que possam fazer isso?

Eu realmente não me importo com o grande buffer de quadros não compactados, mas os vídeos exportados devem ser compactados em um formato compatível com Android.Mas se houver uma maneira de compactar o buffer, gostaria de ouvir sobre isso.

Obrigado.

Foi útil?

Solução

No Android MediaRecorder há duas maneiras de especificar a saída.Um é um nome de arquivo e outro é um FileDescriptor.

Usando método estático fromSocket de ParcelFileDescriptor você pode criar uma instância de ParcelFileDescriptor apontando para um soquete.Em seguida, ligue getFileDescriptor para obter o FileDescriptor para ser repassado ao MediaRecorder.

Como você pode obter o vídeo codificado do soquete (como se estivesse criando um servidor web local), você poderá acessar quadros individuais do vídeo, embora não tão diretamente, porque precisará decodificá-lo primeiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top