2013-03-26 4 views
15

Ich habe jetzt vollständig eingerichtet die Möglichkeit, Video mit der AVFoundation Rahmen und das ist alles in Ordnung, aber jetzt suche ich eine Überlagerung während der Aufzeichnung (auch sichtbar auf der AVCaptureVideoPreviewLayer Ebene)Record Overlay zur gleichen Zeit AVFoundation iOS

kann ich dieses Overlay UIView Objekt den VideoPreviewLayer hinzufügen, aber ich habe Schwierigkeiten, wie die gleiche Ansicht erhalten auf dem aufgezeichneten video.This seine UIView alles von UILabel s UIImageView s enthalten könnte.

+1

Hmmm gute Frage. Ich würde denken, dass Sie keine Ebene hinzufügen müssen, um eine Ansicht hinzuzufügen. Vielleicht beinhaltet dies auch eine gewisse Kompostierung der Überlagerung auf den Videoeingang.Will etwas denken ... – Cocoadelica

+0

Ja, das scheint der Ansatz zu sein, fügen Sie sie in einen Puffer von einer Art (hohe FPS halten), wo Kompostierung der CALayers auftreten kann. nur nicht sicher, wo ich anfangen soll .. danke – theiOSDude

+0

Ich bin daran interessiert, eine Antwort zu finden, da es mit etwas in Verbindung steht, an dem ich gerade arbeite. Wird aktualisiert, sobald ich Fortschritte mache. – Cocoadelica

Antwort

9

Ich bin mir nicht sicher, ob dies die Sache ist, die Sie suchen, aber ich denke, Sie können Brad Larson GPU-Bibliothek verwenden, gibt es eine Klasse namens GPUImageElement, die Sie Überlagerungen und Ansichten hinzufügen können.Bitte beachten Sie die Beispiele, insbesondere die eine namens Filter showcase und blättern zu etwas namens UIElement. Hier

ist ein Beispielcode:

else if (filterType == GPUIMAGE_UIELEMENT) 
     { 
      GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; 
      blendFilter.mix = 1.0; 

      NSDate *startTime = [NSDate date]; 

      UILabel *timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 240.0f, 320.0f)]; 
      timeLabel.font = [UIFont systemFontOfSize:17.0f]; 
      timeLabel.text = @"Time: 0.0 s"; 
      timeLabel.textAlignment = UITextAlignmentCenter; 
      timeLabel.backgroundColor = [UIColor clearColor]; 
      timeLabel.textColor = [UIColor whiteColor]; 

      uiElementInput = [[GPUImageUIElement alloc] initWithView:timeLabel]; 

      [filter addTarget:blendFilter]; 
      [uiElementInput addTarget:blendFilter]; 

      [blendFilter addTarget:filterView]; 

      __unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput; 

      [filter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){ 
       timeLabel.text = [NSString stringWithFormat:@"Time: %f s", -[startTime timeIntervalSinceNow]]; 
       [weakUIElementInput update]; 
      }]; 
     } 
+0

OK, ich trete gerade jetzt auf, ich werde dich wissen lassen, wie es mir geht! Danke – theiOSDude

+0

Nice find Kumpel, es hat mich auf den richtigen Weg! Danke für diese – theiOSDude

+0

ich Aufnahme Benutzer berühren und tippt in einer Ansicht durch Erhöhung des Wertes. Gibt es eine Möglichkeit, diese Ansicht auch aufzuzeichnen? –

6

Sie wollen UIView zu überlagern ist, aber wenn man nicht CALayer s nichts dagegen haben mit könnten Sie fügen Sie Ihre Overlay nach dem Export mit AVAssetExportSession 's AVVideoComposition Eigenschaft. Es verfügt über eine Eigenschaft AVVideoCompositionCoreAnimationTool *animationTool, mit der Sie animierende CALayer s zu Ihrer Ausgabe hinzufügen können, obwohl ich denke, dass Sie Pech haben, wenn das Aussehen Ihres Overlays nicht von CABasicAnimation beschrieben werden kann. Ihr Beispiel einer Anzeigenüberschrift kann möglich sein, obwohl ich mir etwas so einfaches vorstelle wie ein aktueller Zeitzähler nicht. Wenn Sie mit dieser Einschränkung leben können, ist das WWDC 2010-Codebeispiel "AVEditDemo" ein guter Ausgangspunkt.

Wenn Sie mehr Kontrolle benötigen, könnten Sie den Overlay machen UIView auf die Capture-Frames, [view.layer renderInContext:contextToThenRenderToFrame] verwenden und dann diese Frames schreiben Datei mit AVAssetWriter (sobald Sie Frames Speicher erfassen können Sie nicht mehr AVCaptureMovieFileOutput verwenden).

Warnung: Die Bilder, die Sie erfassen, können möglicherweise nicht mit einer gleichmäßigen Rate ankommen und hängen von der Umgebungsbeleuchtung und sogar von der Systemlast ab. Wenn sich Ihr Overlay schneller ändert als das Video, müssen Sie die Frames in der zweiten Lösung wiederholen. Dies wird für Sie von AVVideoComposition in der ersten Lösung behandelt.

P.S. Lösung zwei ist fummelig, aber ohne ins Detail zu gehen, scheint iOS7 dies viel einfacher gemacht zu haben.

1

Sie es in AVFoundation Programming Guide im editing finden können

Es gibt einen Abschnitt, der mit Überlagerung von Bild beschäftigt. Ich werde versuchen, einen Beispielcode/ein Projekt zu erstellen.

+0

Beachten Sie, dass [Nur-Link-Antworten] (http://meta.stackoverflow.com/tags/link-only-answers/info) nicht empfohlen werden. SO-Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (vs. ein weiterer Zwischenstopp von Referenzen, die im Laufe der Zeit abgestanden werden). Bitte beachten Sie, dass Sie hier eine eigenständige Zusammenfassung hinzufügen und den Link als Referenz beibehalten. – kleopatra

0

Um herauszufinden, Ihr Problem gibt es zwei sehr detaillierte Erklärungen auf der raywenderlich Tutorial-Seite. Es ist ein zweiteiliges Tutorial.

Die erste ist hier: http://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios

Das zweite ist hier: http://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos

Viel Glück und hoffe, das hilft !!

+1

Danke, diese Turorials zeigen nur, wie es geht, nachdem ich die Aufnahme beendet habe, muss ich es während der Aufnahme tun (d. H. Gerät Überschrift in diesem Rahmen) – theiOSDude

+0

Ok. Ich habe festgestellt, dass die Apple Developer Documentation sehr hilfreich ist. Hier ist die Dokumentation für AVFoundation: https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html Hope this Hilft! – PoKoBros