O Android permite que os dispositivos suportem streaming simultâneo de dispositivos de câmera. Por exemplo, isso permite que um dispositivo tenha as câmeras frontal e traseira operando ao mesmo tempo. A partir do Android 11, a API Camera2 inclui os seguintes métodos que os aplicativos podem chamar para determinar se as câmeras são compatíveis com streaming simultâneo e as configurações de streaming compatíveis.
-
getConcurrentStreamingCameraIds
: Obtém o conjunto de combinações de identificadores de dispositivo de câmera atualmente conectados que dão suporte à configuração de sessões de dispositivo de câmera simultaneamente. -
isConcurrentSessionConfigurationSupported
: Verifica se o conjunto fornecido de dispositivos de câmera e suas configurações de sessão correspondentes podem ser configurados simultaneamente.
Um conjunto de combinações de fluxo obrigatórias que devem ser suportadas durante o fluxo simultâneo é incluído por meio das características de câmera de um dispositivo de câmera na propriedade SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Cada dispositivo de câmera anunciado por meio de getConcurrentStreamingCameraIds()
deve oferecer suporte às seguintes configurações garantidas para fluxos simultâneos.
Alvo 1 | Alvo 2 | |||
---|---|---|---|---|
Tipo | tamanho máximo | Tipo | tamanho máximo | Exemplos de casos de uso |
YUV | s1440p | Processamento de vídeo ou imagem no aplicativo | ||
PRIV | s1440p | Análise do visor no aplicativo | ||
JPEG | s1440p | Sem captura de imagem estática no visor | ||
YUV / PRIV | s720p | JPEG | s1440p | Imagens estáticas padrão |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Vídeo no aplicativo ou processamento com visualização |
Dispositivos com o recurso MONOCHROME
( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
inclui CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
) com suporte a Y8 devem oferecer suporte à substituição de fluxos YUV por Y8 em todas as combinações de fluxo garantidas.
s720p
refere-se a 720p (1280 x 720) ou a resolução máxima suportada para o formato específico retornado por StreamConfigurationMap.getOutputSizes()
. s1440p
refere-se a 1440p (1920 x 1440) ou a resolução máxima suportada para o formato específico retornado por StreamConfigurationMap.getOutputSizes()
. Dispositivos cujos recursos não incluem ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
devem suportar pelo menos um único fluxo Y16, Dataspace::DEPTH
DEPTH com resolução sVGA, durante operação simultânea, onde sVGA é a menor das duas resoluções a seguir:
- resolução máxima de saída para o formato fornecido
- 640 x 480
Implementação
Para permitir que aplicativos consultem um dispositivo para determinar se suas câmeras suportam streaming simultâneo, implemente a interface ICameraProvider@2.6
HAL, que inclui os seguintes métodos:
Para obter uma implementação de referência da interface ICameraProvider@2.6
HAL, consulte a biblioteca HAL de câmera emulada em EmulatedCameraProviderHWLImpl.cpp
.
Validação
Para testar se a implementação desse recurso funciona conforme o esperado, use o teste CTS ConcurrentCameraTest.java
. Além disso, teste usando um aplicativo que abre várias câmeras e as opera simultaneamente.
Problemas de alocação de recursos
Se HALs de câmera anunciarem suporte para operação simultânea de dispositivos de câmera, eles poderão ter problemas de alocação de recursos, especialmente no caso de haver recursos de processador de sinal de imagem (ISP) suficientes no telefone para transmitir as câmeras frontal e traseira (ou outras) simultaneamente , mas não em sua capacidade total. Nesse caso, o HAL da câmera deve alocar recursos de hardware limitados para cada dispositivo de câmera.
Cenário de exemplo
O cenário a seguir demonstra esse problema.
Problema
O dispositivo tem a seguinte configuração:
- A Camera ID
0
é uma câmera lógica apoiada por uma câmera ampla e ultralarga, cada uma com um recurso ISP. - Camera ID
1
é uma câmera que usa um recurso ISP.
O dispositivo (telefone) tem dois ISPs. Se a ID da câmera 0
for aberta e uma sessão for configurada, é possível que a câmera HAL reserve dois ISPs antecipando o uso da câmera ultrawide e wide.
Se for esse o caso, a câmera frontal (ID 1
) não pode configurar nenhum fluxo porque ambos os ISPs estão em uso.
Solução
Para resolver esse problema, a estrutura pode abrir os IDs de câmera 0
e 1
antes de configurar as sessões para fornecer uma dica ao HAL da câmera sobre como alocar recursos (porque agora espera operação simultânea de câmeras). No entanto, isso pode levar a recursos limitados, por exemplo, o zoom pode não ser capaz de lidar com a taxa de alcance total do zoom (porque a troca de IDs de câmera física pode ser problemática).
Para implementar essa solução, faça as seguintes atualizações em provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Mandar que para operação simultânea de câmeras, a estrutura da câmera deve abrir dispositivos de câmera (
@3.2::ICameraDevice::open
) antes de configurar qualquer sessão nos dispositivos de câmera. Isso permite que os fornecedores de câmeras aloquem recursos de acordo.Para resolver o problema de não ser capaz de lidar com a taxa de alcance total do zoom, certifique-se de que os aplicativos de câmera, ao usar câmeras simultaneamente, usem a configuração de controle
ZOOM_RATIO
entre apenas 1x eMAX_DIGITAL_ZOOM
em vez doZOOM_RATIO_RANGE
completo (isso evita a troca de câmeras físicas internamente, o que potencialmente requer mais ISPs).
Problema com testDualCameraPreview
Quando você faz as atualizações acima, pode criar um problema com um comportamento permitido pelo teste MultiViewTest.java#testDualCameraPreview
.
O teste testDualCameraPreview
não configura sessões somente após abrir todas as câmeras. Segue esta sequência:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
No entanto, tolera falhas de abertura de câmera com ERROR_MAX_CAMERAS_IN_USE [1]
. Aplicativos de terceiros podem depender desse comportamento.
Como o HAL da câmera não conhecerá o conjunto completo de IDs de câmera que está sendo aberto para operação simultânea antes de configurar as sessões, pode ser difícil alocar recursos de hardware (supondo que haja alguma competição por eles).
Para resolver esse problema, mantendo a compatibilidade com versões anteriores, além de oferecer suporte a streaming simultâneo, as HALs de câmera devem falhar nas chamadas openCamera
com ERROR_MAX_CAMERAS_IN_USE
se não puderem oferecer suporte à configuração de stream completo para todas as câmeras em execução simultaneamente.