プログラムでIOS画面を記録する方法はありますか。ボタンのクリックやテーブルビューのスクロールなど、実行しているアクティビティを意味します。
動画が再生されている場合でも、他のアクティビティとともに再びキャプチャされますか?
これらを試しました
しかし、これらのライブラリでは高品質のビデオを提供できません。高品質のビデオが必要です。
問題は、ビデオをバックグラウンドで再生すると、画面をキャプチャしたときにスムーズなビデオが表示されないことです。 1フレームのビデオのように表示され、3〜4秒後に2番目のフレームなどが表示されます。また、ビデオの品質は良くなく、ぼやけています
IOS 9では、これを大幅に簡素化するためにReplayKitが利用できるようです。
https://developer.Apple.com/reference/replaykit
https://code.tutsplus.com/tutorials/ios-9-an-introduction-to-replaykit--cms-25458
Update:iOS 11にはスクリーンレコーダーが組み込まれているため、これはあまり重要ではないかもしれませんが、次のSwift 3コードは私のために働きました:
@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)
}
ScreenCaptureViewをチェックしてください。これにはビデオ録画サポートが組み込まれています(リンクを参照)。
これにより、UIViewのコンテンツがUIImageに保存されます。著者は、AVCaptureSessionを介してフレームを渡すことにより、使用中のアプリのビデオを保存できると示唆しています。
私はOpenGLサブビューでテストされていないと思いますが、それが機能すると仮定すると、オーディオを含めるように少し変更して設定できます。
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が利用可能ですが、結果のビデオへのアクセスは許可されていませんが、これまでに見つけた唯一の方法は、スクリーンショットをいくつか作成し(画像の配列に保存)、これらの画像をビデオに変換することです。ただし、パフォーマンスの観点からは効率的ですが、実際に30/60 fpsの画面記録が必要なく、6-20 pfsで問題ない場合に機能する可能性があります。これが 完全な例 です。
このライブラリを使用してビューを記録できます。 screen-cap-view Objective Cで記述されたGitHubで利用できます。
**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/ , ¯\_(ツ)_/¯ ,(╯°□°)╯︵ ┻━┻