AVCaptureSession Screen (NSWindow) in Video einblenden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • AVCaptureSession Screen (NSWindow) in Video einblenden

    Hallo,

    ich möchte die Darbietung eines Sportlers, mit einer MacOS-App, als Video aufzeichnen. Die Aufzeichung soll mit 1 oder 2 Kameras durchgeführt werden. Am Ende der Darbietung soll der Screen eingeblendet werden, der die Bewertung darstellt.

    Erste Gehversuche habe ich erfolgreich mit einer Kamera und AVCaptureSession, AVCaptureConnection, AVCaptureMovieFileOutput und AVCaptureVideoPreviewLayer gemacht.

    Nur habe ich keinen Plan wie ich den Screen mit der Bewertung in das Video eingeblendet bekomme. Googeling hat mir keine Idee für eine Lösung für diese Aufgabe gebracht.

    Wie kann ich einen Screen (NSWindow) in das gerade aufgezeichnete Video einblenden?

    Danke für eure Vorschläge.

    Inzwischen habe ich AVCaptureScreenInput entdeckt und damit experimentiert. Allerdings komme ich nicht wirklich weiter. Hier habe ich meinen Code mit dem ich die Session erstelle:


    C-Quellcode

    1. self.session = [[AVCaptureSession alloc] init];
    2. [..]
    3. AVCaptureDevice * myDevice = nil;
    4. AVCaptureDeviceInput * inputDevice = nil;
    5. NSArray * allDevices = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera,AVCaptureDeviceTypeExternalUnknown]
    6. mediaType:AVMediaTypeVideo
    7. position:AVCaptureDevicePositionUnspecified].devices;
    8. for (AVCaptureDevice * device in allDevices) {
    9. NSLog(@"Device: %@ %li", device.localizedName, (long)device.position);
    10. if ( device.position == AVCaptureDevicePositionUnspecified) {
    11. myDevice = device;
    12. }
    13. }
    14. inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:myDevice error:nil];
    15. if ( [self.session canAddInput:inputDevice] ) {
    16. [self.session addInput:inputDevice];
    17. }
    18. [..]
    19. CGDirectDisplayID screenID = CGMainDisplayID();
    20. AVCaptureScreenInput * screenInput = [[AVCaptureScreenInput alloc] initWithDisplayID:screenIDs[0]];
    21. screenInput.scaleFactor = 0.5;
    22. CMTime minimumFrameDuration = CMTimeMake(1, (int32_t)1);
    23. screenInput.minFrameDuration = minimumFrameDuration;
    24. if ( [self.session canAddInput:screenInput] ) {
    25. [self.session addInput:screenInput];
    26. }
    27. // Save captured video to an file at given URL
    28. // URL given at start capturing
    29. self.fileOutput = [[AVCaptureMovieFileOutput alloc] init];
    30. if ( [self.session canAddOutput:self.fileOutput] ) {
    31. [self.session addOutput:self.fileOutput];
    32. }
    Alles anzeigen
    Füge ich beide Inputs hinzu, sehe ich nur das Bild der Kamera, Wenn nur der AVCaptureScreenInput zur session hinzugefügt wird, sehe ich den Screen im Video.

    Wie kann ich beide sehen?

    Danke
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von uschu.do ()

  • Mein Basisverständnis bisher war, dass jedes Input einen Output braucht.
    2 Inputs, 1 Output resultiert in 1 Output von 1 Input. Reihenfolge keine Ahnung.

    Du wirst Dir vermutlich 2 Outputs erstellen und diese händisch zu einem zusammentackern müssen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • ja, das habe ich gemacht.

    Quellcode

    1. self.cameraConnection = [self connectInput:self.cameraInput toOutput:self.cameraOutput];
    2. if ([self.session canAddConnection:self.cameraConnection]) {
    3. [self.session addConnection:self.cameraConnection];
    4. self.cameraConnection.enabled = NO;
    5. }
    6. self.screenConnection = [self connectInput:self.screenInput toOutput:self.screenOutput];
    7. if ([self.session canAddConnection:self.screenConnection]) {
    8. [self.session addConnection:self.screenConnection];
    9. self.screenConnection.enabled = NO;
    10. }
    Alles anzeigen

    Und je nach dem welchen Inhalt ich im Video haben will, enable ich die AVCaptureConnection.

    Wenn ich die AVCaptureSession startRunning sende, läuft sie Aufzeichnung eine Weile gut, doch dann...

    Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-16364), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x600000d251a0 {Error Domain=NSOSStatusErrorDomain Code=-16364 "(null)"}}

    Das ist die Delegate Methode für AVCaptureVideoDataOutput fürs Device und den AVCaptureScreenInput

    Quellcode

    1. - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    2. AVAssetWriterInput * videoInput = self.assetWriter.inputs.firstObject;
    3. ...
    4. [videoInput appendSampleBuffer:sampleBuffer]
    5. ...
    6. }
    Wie kommt der Error zustande ?
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von uschu.do ()