使用 UIImagePickerController 为 Dashcam 应用程序保存视频
Saving Video using UIImagePickerController for a Dashcam App
我正在尝试弹出警报以保存来自 CoreMotion
数据触发器的视频。
我无法通过是提示保存视频。
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = true
imagePicker.delegate = self
imagePicker.sourceType = .camera;
imagePicker.mediaTypes = [kUTTypeMovie as String]
imagePicker.allowsEditing = false
imagePicker.showsCameraControls = false
imagePicker.perform(#selector(UIImagePickerController.startVideoCapture), with: nil, afterDelay: 1)
// shows camera onto screen
self.present(imagePicker, animated: true)
do {
motion.accelerometerUpdateInterval = 0.25
motion.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
print(data as Any)
if let trueData = data {
//self.view.reloadInputViews()
let x = trueData.acceleration.x
let y = trueData.acceleration.y
let z = trueData.acceleration.z
let totalAcceleration = calculateMagnitude (no1:Float (x), no2: Float (y),no3: Float (z))
if (Float(totalAcceleration) > 2.00){
self.dismiss(animated: true, completion : nil)
let alert = UIAlertController (title: "Sudden acceleration detected", message: "Are you in an accident?", preferredStyle: .alert)
self.present(alert, animated: true, completion: nil)
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected Yes")//Here is where I want to save the video
}))
alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected No")
imagePicker.perform(#selector(UIImagePickerController.startVideoCapture), with: nil, afterDelay: 1)
// shows camera onto screen
self.present(imagePicker, animated: true)
}))
}
我找到的所有答案都没有真正帮助我:[
TLDR:运行 应用程序。 Phone记录前面的内容。 CoreMotion
数据变化。弹出是或否提示。 No 继续录音。是保存视频。
不要忘记点击屏幕开始捕捉
import UIKit
import Photos
import MobileCoreServices
import CoreMotion
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
lazy var imagePicker: UIImagePickerController = {
let ip = UIImagePickerController()
ip.delegate = self
ip.sourceType = .camera
ip.mediaTypes = [kUTTypeMovie as String]
ip.allowsEditing = false
ip.showsCameraControls = false
return ip
}()
let motion: CMMotionManager = {
let motion = CMMotionManager()
motion.accelerometerUpdateInterval = 0.25
return motion
}()
var videoUrl: URL?
override func viewDidLoad() {
super.viewDidLoad()
// First Check for photo library permission
checkPhotoLibraryPermission()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
startCapture()
}
func checkPhotoLibraryPermission() {
let status = PHPhotoLibrary.authorizationStatus()
switch status {
case .authorized:
//handle authorized status
break
case .denied, .restricted :
//handle denied status
break
case .notDetermined:
// ask for permissions
PHPhotoLibrary.requestAuthorization { status in
switch status {
case .authorized:
// as above
break
case .denied, .restricted:
// as above
break
case .notDetermined:
// won't happen but still
break
}
}
}
}
func startCapture() {
self.present(imagePicker, animated: true) {
self.imagePicker.perform(#selector(self.imagePicker.startVideoCapture), with: nil, afterDelay: 1)
}
motion.startAccelerometerUpdates(to: .main) { (data, error) in
if let error = error {
print(error)
return
}
guard let data = data else { return }
let x = data.acceleration.x
let y = data.acceleration.y
let z = data.acceleration.z
let totalAcceleration = sqrt(x*x + y*y + z*z)
if totalAcceleration > 2 {
self.imagePicker.stopVideoCapture()
self.imagePicker.dismiss(animated: true, completion: nil)
self.showAlert()
}
}
}
func showAlert() {
let alert = UIAlertController (title: "Sudden acceleration detected", message: "Are you in an accident?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected Yes") // Here is where I want to save the video
if let videoUrl = self.videoUrl {
self.saveVideoToPhotos(videoUrl)
}
}))
alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected No")
self.present(self.imagePicker, animated: true) {
self.imagePicker.perform(#selector(self.imagePicker.startVideoCapture), with: nil, afterDelay: 1)
}
}))
self.present(alert, animated: true, completion: nil)
}
func saveVideoToPhotos(_ videoUrl: URL) {
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoUrl)
}) { saved, error in
if saved {
let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
}
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let videoUrl = info[.mediaURL] as? URL {
self.videoUrl = videoUrl
}
}
}
我正在尝试弹出警报以保存来自 CoreMotion
数据触发器的视频。
我无法通过是提示保存视频。
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = true
imagePicker.delegate = self
imagePicker.sourceType = .camera;
imagePicker.mediaTypes = [kUTTypeMovie as String]
imagePicker.allowsEditing = false
imagePicker.showsCameraControls = false
imagePicker.perform(#selector(UIImagePickerController.startVideoCapture), with: nil, afterDelay: 1)
// shows camera onto screen
self.present(imagePicker, animated: true)
do {
motion.accelerometerUpdateInterval = 0.25
motion.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
print(data as Any)
if let trueData = data {
//self.view.reloadInputViews()
let x = trueData.acceleration.x
let y = trueData.acceleration.y
let z = trueData.acceleration.z
let totalAcceleration = calculateMagnitude (no1:Float (x), no2: Float (y),no3: Float (z))
if (Float(totalAcceleration) > 2.00){
self.dismiss(animated: true, completion : nil)
let alert = UIAlertController (title: "Sudden acceleration detected", message: "Are you in an accident?", preferredStyle: .alert)
self.present(alert, animated: true, completion: nil)
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected Yes")//Here is where I want to save the video
}))
alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected No")
imagePicker.perform(#selector(UIImagePickerController.startVideoCapture), with: nil, afterDelay: 1)
// shows camera onto screen
self.present(imagePicker, animated: true)
}))
}
我找到的所有答案都没有真正帮助我:[
TLDR:运行 应用程序。 Phone记录前面的内容。 CoreMotion
数据变化。弹出是或否提示。 No 继续录音。是保存视频。
不要忘记点击屏幕开始捕捉
import UIKit
import Photos
import MobileCoreServices
import CoreMotion
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
lazy var imagePicker: UIImagePickerController = {
let ip = UIImagePickerController()
ip.delegate = self
ip.sourceType = .camera
ip.mediaTypes = [kUTTypeMovie as String]
ip.allowsEditing = false
ip.showsCameraControls = false
return ip
}()
let motion: CMMotionManager = {
let motion = CMMotionManager()
motion.accelerometerUpdateInterval = 0.25
return motion
}()
var videoUrl: URL?
override func viewDidLoad() {
super.viewDidLoad()
// First Check for photo library permission
checkPhotoLibraryPermission()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
startCapture()
}
func checkPhotoLibraryPermission() {
let status = PHPhotoLibrary.authorizationStatus()
switch status {
case .authorized:
//handle authorized status
break
case .denied, .restricted :
//handle denied status
break
case .notDetermined:
// ask for permissions
PHPhotoLibrary.requestAuthorization { status in
switch status {
case .authorized:
// as above
break
case .denied, .restricted:
// as above
break
case .notDetermined:
// won't happen but still
break
}
}
}
}
func startCapture() {
self.present(imagePicker, animated: true) {
self.imagePicker.perform(#selector(self.imagePicker.startVideoCapture), with: nil, afterDelay: 1)
}
motion.startAccelerometerUpdates(to: .main) { (data, error) in
if let error = error {
print(error)
return
}
guard let data = data else { return }
let x = data.acceleration.x
let y = data.acceleration.y
let z = data.acceleration.z
let totalAcceleration = sqrt(x*x + y*y + z*z)
if totalAcceleration > 2 {
self.imagePicker.stopVideoCapture()
self.imagePicker.dismiss(animated: true, completion: nil)
self.showAlert()
}
}
}
func showAlert() {
let alert = UIAlertController (title: "Sudden acceleration detected", message: "Are you in an accident?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected Yes") // Here is where I want to save the video
if let videoUrl = self.videoUrl {
self.saveVideoToPhotos(videoUrl)
}
}))
alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: {(action:UIAlertAction!) in
print("User has selected No")
self.present(self.imagePicker, animated: true) {
self.imagePicker.perform(#selector(self.imagePicker.startVideoCapture), with: nil, afterDelay: 1)
}
}))
self.present(alert, animated: true, completion: nil)
}
func saveVideoToPhotos(_ videoUrl: URL) {
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoUrl)
}) { saved, error in
if saved {
let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
}
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let videoUrl = info[.mediaURL] as? URL {
self.videoUrl = videoUrl
}
}
}