Ustaw maksymalną liczbę klatek na sekundę za pomocą AVFoundation w systemie iOS 5

Wydaje mi się, że kiedyś robiono to z captureOutput.minFrameDuration. Jest to jednak przestarzałe w systemie iOS 5.

Zamiast tego najwyraźniej muszę użyć AVCaptureConnection ' s video.minFrameDuration. Więc mam swoje wejście, moje wyjście, dodaję je zarówno do sesji przechwytywania-gdzie mogę uzyskać dostęp do połączenia przechwytywania? Myślę, że to jest dla mnie stworzone przez sesję, ale gdzie?

Mógłbym spróbować dodać I / O używając addInputWithNoConnections i addOutputWithNoConnections, a następnie utworzyć połączenie ręcznie. Ale wydaje się to trochę kłopotliwe, aby ustawić maksimum liczba klatek na sekundę. Plus, Xcode skarży się, że te metody nie istnieją.

Author: mizo, 2011-11-12

4 answers

Chris, chyba rozwiązałem ten problem: {]}

(Edit -- Zobacz komentarz Tomasa Camina poniżej na poprawny sposób sprawdzania, czy videomaxframeduration videomaxframeduration są obsługiwane, chociaż poniższy kod działał poprawnie po wysłaniu)

Poniższy wiersz daje dostęp do obiektu AVCaptureConnection powiązanego z obiektem 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);

Jeśli używasz (tak jak ja) delegata didOutputSampleBuffer, możesz potwierdzić, że liczba klatek na Sekundę wideo w wartości fromConnection AVCaptureConnection * przekazany do delegata został poprawnie ustawiony i" zapamiętany " przez powyższy kod.

Zwróć uwagę, że musisz ustawić zarówno videoMinFrameDuration i videoMaxFrameDuration do tej samej wartości, aby skutecznie zacisnąć liczbę klatek na sekundę -- ustawienie min na własną rękę nie wydaje się działać podczas testowania na iPhone 4s. to nie wydaje się być udokumentowane.

Josh

 28
Author: Josh Greifer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-07 09:27:40

AVCaptureConnection videoMinFrameDuration jest przestarzały. Użycie AVCaptureDevice activeVideoMinFrameDuration/activeVideoMaxFrameDuration. Pierwszy fragment kodu w odwołanie do klasy AVCaptureDevice odpowiada na pytanie.

 5
Author: Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 05:21:44

Załóżmy następujących członków.

AVCaptureConnection         *videoConnection;
AVCaptureVideoDataOutput    *videoOutput;
AVCaptureDeviceInput        *videoInput;

Wtedy zrobiłbyś coś takiego. Nie testowałem tego. To tylko domysły z lektury dokumentów.

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];

Nie przekonwertowałem jeszcze własnego kodu na to. Odpowiem za pomocą kodu roboczego, gdy wykonam konwersję. Jeśli do captureSession dodano wiele wejść, może być konieczne jawne załadowanie tego, który chcesz do tablicy. np.

ports = [NSArray arrayWithObject:videoInput];

Następnie przekaż to do inicjalizatora dla AVCaptureConnection.

 2
Author: Steve McFarlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 00:55:42

W przeciwieństwie do innych gier, nie jest to gra logiczna.

Aby być bardziej szczegółowym, 'aktualizacja' przykład 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);
 0
Author: bauerMusic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 19:13:02