Pracuję nad aplikacją na iPhone'a, którą niedługo będę prezentować publiczności na żywo.Pomoc demo na iPhone'a: każdy wie o szybszym przechwytywaniu ekranu zamiast UIGetScreenImage()?
Chciałbym pokazać wersję demonstracyjną aplikacji na żywo zamiast VGA, zamiast wyświetlać zrzuty ekranu.
Kupiłem adapter VGA dla iPhone'a i dostosowałem Rob Terrell's TVOutManager do moich potrzeb. Niestety, liczba klatek na sekundę po przetestowaniu na moim telewizorze w domu po prostu nie jest dobra - nawet na iPhone 4 (może 4-5 klatek na sekundę, zmienia się).
Uważam, że powodem tego powolności jest to, że główną procedurą używaną do przechwytywania ekranu urządzenia (które jest następnie wyświetlane na zewnętrznym wyświetlaczu) jest UIGetScreenImage()
. Ta procedura, która nie może już być częścią aplikacji do wysyłki, jest dość powolna. Oto kod używam do przechwytywania ekranu (FYI mirrorView
jest UIImageView
):
CGImageRef cgScreen = UIGetScreenImage();
self.mirrorView.image = [UIImage imageWithCGImage:cgScreen];
CGImageRelease(cgScreen);
Czy istnieje szybszy sposób mogę wykorzystać do przechwytywania ekranu iPhone i osiągnąć lepszą szybkość klatek (Strzelanie dla 20+ fps)? Nie trzeba przesyłać recenzji aplikacji Apple - ten kod demonstracyjny nie będzie dostępny w aplikacji do wysyłki. Jeśli ktokolwiek wie o szybszych prywatnych interfejsach API, byłbym wdzięczny za pomoc!
Ponadto, powyższy kod jest wykonywany przy użyciu powtarzającego się NSTimer
, który odpala co każdesekund (obecnie co 0,1 sekundy). Zastanawiam się, czy zamiast tego zawijanie tych wywołań w bloku i używanie GCD lub NSOperationQueue
może być bardziej wydajne, niż gdybym miał NSTimer
wywoływać moją metodę 01:obj-c, która obecnie zawiera te wywołania. Byłby wdzięczny za niektóre dane wejściowe - niektóre wyszukiwania wydają się wskazywać, że wysyłanie wiadomości obj-c jest nieco powolne w porównaniu do innych operacji.
Wreszcie, jak widać powyżej, CGImageRef
że UIGetScreenImage()
powraca jest przekształcony w UIImage
i wtedy UIImage
jest przekazywany do UIImageView
, która jest prawdopodobnie zmiana rozmiaru obrazu w locie. Zastanawiam się, czy zmiana rozmiaru może spowolnić jeszcze bardziej. Pomysły, jak to zrobić szybciej?
Witaj Jonah, dzięki za twoją sugestię. Jak się okazało, spróbowałem użyć metody renderInContext: CALayer. Jest jeszcze wolniej. AVFoundation nie pomoże mi w tym przypadku, ponieważ nie przechwytywam z kamery lub innego źródła AV - próbuję uchwycić sam ekran. Apple zaleca alternatywy dla UIGetScreenImage, ponieważ nie pozwalają na to więcej, ale ten kod nie jest przeznaczony do przesyłania do App Store, tylko do wersji demo. –