it-swarm-pt.tech

O Android não pode gravar vídeo com a câmera frontal, Falha no início do MediaRecorder: -19

Eu tenho duas bases de código diferentes com o mesmo problema.

O primeiro é o código copiado diretamente do developer.Android.com aqui: http://developer.Android.com/guide/topics/media/camera.html#custom- Câmera

O segundo é este código:

http://Android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html

Ambos funcionam bem com a câmera traseira normal, mas assim que eu tento usar a câmera frontal eu recebo o erro.

Isso acontece nos seguintes dispositivos:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1 (só tem câmera frontal)

Eu tentei o que parece 2.2 Camera Params também, o que algumas pessoas afirmam ser necessário em alguns dispositivos Samsung e HTC, embora vários artigos diferentes façam referência a diferentes String Keys:

c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance
Camera.Parameters params = c.getParameters();
params.set("cam-mode", 1);
params.set("cam_mode", 1);
params.set("camera-id", 1);
c.setParameters(params);

Nenhum destes trabalhos, também por favor, note que estou detectando o ID da câmera Front Facing correto, que no Nexus 7 é claro: 0. Mas os resultados são os mesmos em todos os dispositivos.

Eu tentei usar o perfil de baixa qualidade, eu tentei definir a resolução de vídeo, codificador, formato de saída, taxa de bits, taxa de quadros e tamanho de vídeo manualmente em uma infinidade de maneiras, mas nenhum que funcionou.

O que me faz pensar que não há nada de errado com a maior parte do código é que a câmera normal funciona bem. Então, meu palpite é que tem algo a ver com o método prepareVideoRecorder ()/prepareMediaRecorder () que configura o Media Recorder.

Talvez uma configuração manual de codificação do gravador de mídia que seja conhecida por funcionar em uma câmera frontal?

Eu tenho que dizer, a API do Android Camera e MediaRecorder é uma droga. Comparado com o iOS é um pouco confuso, para não mencionar alguns dos assustadores problemas de incompatibilidade de parâmetros e resoluções diferentes em todo o cenário de dispositivos fragmentados.

Supondo que eu possa fazê-lo funcionar em meus dispositivos JB, alguém sabe por experiência se a maioria desses problemas forem resolvidos com o API 15 ICS?

Eu consideraria não dar suporte ao API 10 Gingerbread se for muito difícil de suportar.

22
Madhava Jay

Ok, então finalmente estou trabalhando.

O problema parece estar relacionado às configurações de perfil e, em particular, à taxa de quadros.

No Nexus S, meu principal dispositivo de teste, se eu testar os Camera.Parameters, obtenho:

Para a câmera traseira:
15 FPS a 30 FPS, bastante justo.

Para a câmera frontal:
7,5 FPS a 30 FPS, tudo bem.

Então eu verifico os perfis que estou tentando usar:

FilmadoraPerfil.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

QUALITY_LOW:
audioBitRate: 12200
audioCanais: 1
audioCodec: AMR_NB audioSampleRate: 8000
duração: 30
fileFormat: THREE_GPP
qualidade: 0
videoBitRate: 256000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 176
videoFrameHeight: 144 

QUALITY_HIGH:
audioBitRate: 24000
audioCanais: 1
audioCodec: AAC
audioSampleRate: 16000
duração: 60
fileFormat: MPEG_4
qualidade: 1
videoBitRate: 3000000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 720
videoFrameHeight: 480 

Claramente, o Perfil de Alta Qualidade é voltado para a Câmera Traseira, visto que a frente é de apenas 640x480. Mas ambos afirmam 30 FPS.

Agora....

Aqui está a estranheza.

Se eu definir QUALQUER taxa de quadros para a câmera traseira, não importa o perfil, ele trava com o temido erro: -19

mediaRecorder.setVideoFrameRate(fpsInt);

Isso não é um grande negócio pq eu não me importo com a câmera traseira, mas é estranho, considerando que os perfis são padronizados para 30 e os Params dizem que aceitam 15-30. Mas nenhum valor int iv funcionou. Se eu omitir o setVideoFrameRate está bem.

De qualquer forma, movendo-se para a câmera frontal.

Então, se eu usar o perfil QUALITY_LOW e definir o rácio de fotogramas para 15 ou menos, funciona magicamente.

mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);

Infact qualquer valor, 1 - 15 trabalhos. O que parece estranho.

Assim, o problema, eu provavelmente posso sondar para resolução e selecionar um res apropriado para a maioria das câmeras, embora eu também estou bastante confiante em quase todas as câmeras frontais no mínimo VGA 640x480.

Mas, o que acontece com a taxa de quadros? No caso do Nexus S, eu não vejo nenhuma maneira que eu poderia determinar o valor de 15 ou menos, sem apenas adivinhar? Devo procurar usar sempre a taxa de quadros MAIS BAIXA retornada pela câmera?

Eu dei uma olhada no Galaxy Nexus e ele tem 3 faixas de taxa de quadros, a primeira é de 15 a 15 e a segunda é de 15 a 30. Seu perfil de baixa qualidade é similar a uma resolução mais alta. ] Se eu usar o perfil baixo no Galaxy Nexus, parece funcionar bem.

Com o Nexus 7, eu não posso investigar o Perfil do Camcorder que eu continuo recebendo ponteiros nulos, o que é estranho. Diz que suporta 4 FPS - 60 FPS. Se eu escolho QUALITY_LOW que você acha que deve funcionar, ele falha, e eu não consigo encontrar uma taxa de quadros com a qual ele funcionará. Embora o erro esteja relacionado a setProfile, acho que o problema está no perfil interno. Certamente o ponto da API do Android é que o seu consistente, este é um dispositivo de navio de bandeira e a câmera FF está lá para Videoconferência isnt ele ?????

Então, embora eu tenha trabalhado em dois dos dispositivos que usam configurações personalizadas manuais para cada um, não consigo ver uma maneira clara de fazer com que ele funcione em vários dispositivos por meio de código.

Parece que o Nexus S não se comporta da maneira que promete no que diz respeito a definir o FPS como por seu Camera.getParameters (). GetSupportedPreviewFpsRange ()

Estou todo feliz por ele usar as configurações do Auto FPS, mas aparentemente não é com a câmera FF, então o que devo fazer? Eu tenho que definir explicitamente o FPS no Nexus S e, neste caso, para qualquer coisa de 1 a 15 FPS, apesar da câmera me dizer que lida com 7,5 - 30 FPS.

Parece que a promessa do setProfile de corrigir todos os problemas em 2.x não era inteiramente verdadeira.

Eu posso entender se você está escrevendo o aplicativo de câmera para um determinado ROM você acabou de personalizá-lo para esse hardware específico, o que pode explicar por que as pessoas parecem sempre ter aplicativos de câmera com bugs em roms personalizadas. MAS ..... como funcionam os aplicativos de gravação de vídeo para download? Eles são personalizados para cada dispositivo?

É por isso que não há Facebook Poke e Twitter Vine no Android ainda ???? : P

Merda Google, wtf está com sua API de câmera?

Alguém sabe a melhor maneira de determinar a resolução e a taxa de quadros de todos os dispositivos compatíveis com API 15 ou superior?

Isso é possível, ou vou escrever código personalizado em cada dispositivo que testo e depois jogar os dados no resto?

Ou o Nexus S e o Nexus 7 são apenas acidentes estranhos?

24
Madhava Jay

Eu lutei com este problema um pouco hoje também.

Primeiro, verifique se suas permissões estão configuradas corretamente. Especificamente, para gravar vídeo, você vai querer:

<uses-feature Android:name="Android.hardware.camera.front" />
<uses-feature Android:name="Android.hardware.microphone"/>

<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

Em segundo lugar, e esta é a parte complicada, esta linha do tutorial não funciona com a câmera frontal!

mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

Essa assinatura para CamcorderProfile.get () é padronizada para um perfil para a câmera traseira:

Retorna o perfil da filmadora para a primeira câmera traseira no dispositivo no nível de qualidade determinado. Se O dispositivo não tiver uma câmera voltada para trás, isso retornará null.

Em vez disso, use http://developer.Android.com/reference/Android/media/CamcorderProfile.html#get(int,%20int) . O primeiro parâmetro é o id da câmera que você abriu, especificamente, a câmera frontal.

37
spitzanator

tente com QUALITY_LOW porque QUALITY_HIGH não é suportado na câmera frontal.

2
user2157737

Eu tenho lutado com um erro de -19 por algumas horas agora. A resposta para mim está na resposta de Madhava e, em particular, mCamera.unlock ();

ou seja, em combinação com a primeira resposta sobre o perfil definido, este código 

        Camera cam = Camera.open(frontCamID);
        cam.unlock();
        recorder.setCamera(cam);

Permite-me seleccionar e gravar a partir da câmera frontal. 

1
Tim Smith

você deve procurar aqui http://developer.Android.com/guide/topics/media/camera.html#capture-video

a ordem dos comandos listados ali é muito importante.

eu usei o segundo exemplo do código daqui Como posso capturar uma gravação de vídeo no Android?

e modificou as funções de gravação de início

protected void startRecording() throws IOException 
{
    mrec = new MediaRecorder();  // Works well

    mCamera.setPreviewDisplay(surfaceHolder);
    mCamera.startPreview();

    mCamera.unlock();
    mrec.setCamera(mCamera);

    mrec.setPreviewDisplay(surfaceHolder.getSurface());
    mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mrec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 

    mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    mrec.setOutputFile("/sdcard/zzzz.3gp");
    mrec.setPreviewDisplay(surfaceHolder.getSurface());

    mrec.prepare();
    mrec.start();
}
0
Arkady

Eu tive o mesmo problema. Depois que eu corrigi o que foi a causa eu encontrei apenas 1 culpado., 720 × 480 de resolução, que é o padrão na câmera. Eu mudei para qualquer coisa e sim eu posso gravá-lo bem ????

0
Ankushkushal