web-dev-qa-db-fra.com

Comment enregistrer IOS écran par programmation

Est-il possible d’enregistrer IOS écran par programmation? Peu importe l'activité que vous faites, comme cliquer sur des boutons, faire défiler les vues de table.

Même si une vidéo est en cours de lecture, elle sera capturée à nouveau avec une autre activité?

Ont essayé ces

  1. https://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos
  2. https://github.com/alskipp/ASScreenRecorder

mais avec ces bibliothèques ne fournira pas une vidéo de qualité. J'ai besoin d'une vidéo de qualité.

Le problème est qu'avec une vidéo en arrière-plan, lorsque je capture un écran, la vidéo ne s'affiche pas correctement. Il apparaît comme une image de la vidéo, puis après 3 ou 4 secondes de seconde image, etc. Aussi, la qualité de la vidéo n'est pas bonne

7
Testiphone

Depuis iOS 9, il semble que ReplayKit soit disponible pour simplifier grandement cela.

https://developer.Apple.com/reference/replaykit

https://code.tutsplus.com/tutorials/ios-9-an-introduction-to-replaykit--cms-25458

Update : Cela peut être moins pertinent maintenant qu'iOS 11 a un enregistreur d'écran intégré, mais le code Swift 3 suivant a fonctionné pour moi:

    @IBAction func toggleRecording(_ sender: UIBarButtonItem) {
    let r = RPScreenRecorder.shared()

    guard r.isAvailable else {
        print("ReplayKit unavailable")
        return
    }

    if r.isRecording {
        self.stopRecording(sender, r)

    }
    else {
        self.startRecording(sender, r)
    }
}

func startRecording(_ sender: UIBarButtonItem, _ r: RPScreenRecorder) {

    r.startRecording(handler: { (error: Error?) -> Void in
        if error == nil { // Recording has started
            sender.title = "Stop"
        } else {
            // Handle error
            print(error?.localizedDescription ?? "Unknown error")
        }
    })
}

func stopRecording(_ sender: UIBarButtonItem, _ r: RPScreenRecorder) {
    r.stopRecording( handler: { previewViewController, error in

        sender.title = "Record"

        if let pvc = previewViewController {

            if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
                pvc.modalPresentationStyle = UIModalPresentationStyle.popover
                pvc.popoverPresentationController?.sourceRect = CGRect.zero
                pvc.popoverPresentationController?.sourceView = self.view
            }

            pvc.previewControllerDelegate = self
            self.present(pvc, animated: true, completion: nil)
        }
        else if let error = error {
            print(error.localizedDescription)
        }

    })
}

// MARK: RPPreviewViewControllerDelegate
func previewControllerDidFinish(_ previewController: RPPreviewViewController) {
    previewController.dismiss(animated: true, completion: nil)
}
3
biomiker

Découvrez ScreenCaptureView, qui intègre la prise en charge de l'enregistrement vidéo (voir lien).

Cela permet de sauvegarder le contenu d'un UIView dans un UIImage. L'auteur suggère que vous puissiez enregistrer une vidéo de l'application en cours d'utilisation en passant les images dans AVCaptureSession.

Je crois que cela n’a pas été testé avec une sous-vue OpenGL, mais en supposant que cela fonctionne, vous pourrez peut-être le modifier légèrement pour inclure l’audio, puis vous serez défini.

Exemple AVCaptureSession

Référence AVCaptureSession

import UIKit
import AVFoundation
class ViewController: UIViewController {
    let captureSession = AVCaptureSession()
    let stillImageOutput = AVCaptureStillImageOutput()
    var error: NSError?
    override func viewDidLoad() {
        super.viewDidLoad()
        let devices = AVCaptureDevice.devices().filter{ $0.hasMediaType(AVMediaTypeVideo) && $0.position == AVCaptureDevicePosition.Back }
        if let captureDevice = devices.first as? AVCaptureDevice  {

            captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &error))
            captureSession.sessionPreset = AVCaptureSessionPresetPhoto
            captureSession.startRunning()
            stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]
            if captureSession.canAddOutput(stillImageOutput) {
                captureSession.addOutput(stillImageOutput)
            }
            if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) {
                previewLayer.bounds = view.bounds
                previewLayer.position = CGPointMake(view.bounds.midX, view.bounds.midY)
                previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                let cameraPreview = UIView(frame: CGRectMake(0.0, 0.0, view.bounds.size.width, view.bounds.size.height))
                cameraPreview.layer.addSublayer(previewLayer)
                cameraPreview.addGestureRecognizer(UITapGestureRecognizer(target: self, action:"saveToCamera:"))
                view.addSubview(cameraPreview)
            }
        }
    }
    func saveToCamera(sender: UITapGestureRecognizer) {
        if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) {
            stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
                (imageDataSampleBuffer, error) -> Void in
                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                 UIImageWriteToSavedPhotosAlbum(UIImage(data: imageData), nil, nil, nil)
            }
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
2
Nattudurai

ReplayKit est disponible, bien que vous ne soyez pas autorisé à accéder à la vidéo résultante, le seul moyen que j’ai trouvé jusqu’à présent est de faire un certain nombre de captures d’écran (les stocker dans un tableau d’images), puis de convertir ces images en vidéo. Efficace du point de vue des performances, cependant, mais peut fonctionner si vous n'avez pas vraiment besoin d'un enregistrement d'écran à 30/60 i/s et si tout va bien avec 6 à 20 pfs. Voici l'exemple complet .

0
Mikita Manko

Vous pouvez utiliser cette bibliothèque pour enregistrer une vue:screen-cap-viewdisponible sur GitHub écrit en Objective C., (益 ಠ)

**And to use it in Swift:**

--> Drag and drop the .m and .h files in your xcode project.

--> Make a header file and import the this file in that : *#import "IAScreenCaptureView.h"*

--> Then give a View this class from the PropertyInspector and then make a IBOutlet for that view . Something like this:
*@IBOutlet weak var contentView: IAScreenCaptureView!*

--> Then Finally just simply start and stop the recording of the view where ever and when ever you want and for that the code will be like this :

For Starting the Recording : *contentView.startRecording()*
For Stoping the Recording : *contentView.stopRecording()*


//Hope this helps.Happy coding.  \o/ , ¯\_(ツ)_/¯ ,(╯°□°)╯︵ ┻━┻
0
Swifty Codes