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
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
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)
}
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
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()
}
}
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 .
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/ , ¯\_(ツ)_/¯ ,(╯°□°)╯︵ ┻━┻