ios - library - objective c documentation
Establezca la velocidad de cuadro máxima con AVFoundation en iOS 5 (4)
Asume los siguientes miembros.
AVCaptureConnection *videoConnection;
AVCaptureVideoDataOutput *videoOutput;
AVCaptureDeviceInput *videoInput;
Entonces harías algo como lo siguiente. No he probado esto. Esto es sólo una conjetura de la lectura de los documentos.
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ( videoDevice ) {
NSError *error;
videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
[captureSession addInput:videoInput];
}
videoOutput = [[AVCaptureVideoDataOutput alloc] init];
//setup video options
if ([captureSession canAddOutput:videoOutput])
[captureSession addOutput:videoOutput];
videoConnection = [[AVCaptureConnection alloc] initWithInputPorts:captureSession.inputs output:videoOutput];
videoConnection.videoMinFrameDuration = CMTimeMake(1, frameRate);
[captureSession addConnection:videoConnection];
Todavía no he convertido mi propio código a esto. Responderé con el código de trabajo cuando haga la conversión. Si tiene varias entradas agregadas a la captureSession, es posible que deba cargar explícitamente la que desea en una matriz. p.ej
ports = [NSArray arrayWithObject:videoInput];
Luego pase esto al inicializador para AVCaptureConnection.
Creo que esto solía hacerse con captureOutput.minFrameDuration
. Sin embargo, esto está en desuso en iOS 5.
En cambio, aparentemente necesito usar el AVCaptureConnection
de video.minFrameDuration
. Así que tengo mi entrada, mi salida, las agrego a la sesión de captura. ¿Dónde puedo acceder a la conexión de captura? Creo que está creado para mí por la sesión, pero ¿dónde?
Podría intentar agregar la E / S utilizando addInputWithNoConnections
y addOutputWithNoConnections
y luego crear la conexión manualmente. Pero esto parece un poco complicado simplemente para establecer una velocidad de fotogramas máxima. Además, Xcode se queja de que estos métodos no existen.
Chris, creo que he resuelto este problema:
(Editar: vea el comentario de Tomas Camin a continuación sobre la forma correcta de verificar si se admite videoMinFrameDuration videoMaxFrameDuration, aunque el código de abajo funcionó bien cuando se publicó)
La línea a continuación da acceso al objeto AVCaptureConnection
asociado con el objeto AVCaptureVideoDataOutput
:
AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo];
CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);
if (conn.isVideoMinFrameDurationSupported)
conn.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (conn.isVideoMaxFrameDurationSupported)
conn.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
CMTimeShow(conn.videoMinFrameDuration);
CMTimeShow(conn.videoMaxFrameDuration);
Si está utilizando (como lo estoy didOutputSampleBuffer
), el delegado didOutputSampleBuffer
, puede confirmar que la velocidad de fotogramas del video en el fromConnection
AVCaptureConnection * fromConnection pasado al delegado se haya establecido y "recordado" correctamente mediante el código anterior.
Tenga en cuenta que necesita configurar tanto videoMinFrameDuration
como videoMaxFrameDuration
en el mismo valor para sujetar con éxito la velocidad de fotogramas; la configuración de min por sí sola no parece funcionar cuando se prueba en un iPhone 4s. Esto no parece estar documentado.
Josh
Como mencionó Kiran, AVCaptureConnection videoMinFrameDuration
está en desuso desde iOS 7.
Solo para ser más específico, ''actualizando'' el ejemplo de Apple :
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = ... // Following the example
// ** Create and Configure the Video Data Output **
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
output.videoSettings = @{
(NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)
};
device.activeVideoMinFrameDuration = CMTimeMake(1, 15);
AVCaptureConnection
videoMinFrameDuration
está en desuso. Use AVCaptureDevice
activeVideoMinFrameDuration
/ activeVideoMaxFrameDuration
. El primer fragmento de código en la referencia de clase AVCaptureDevice responde a la pregunta.