GVKun编程网logo

Swift-如何使用UIImagePickerController以MP4格式录制视频?(swiftui视频教程)

14

本篇文章给大家谈谈Swift-如何使用UIImagePickerController以MP4格式录制视频?,以及swiftui视频教程的知识点,同时本文还将给你拓展iOSswift中UIImagePi

本篇文章给大家谈谈Swift-如何使用UIImagePickerController以MP4格式录制视频?,以及swiftui视频教程的知识点,同时本文还将给你拓展iOS swift中UIImagePickerControllerDelegate代理不执行问题、ios – Swift 3中的UIImagePickerController、ios – Swift 3:在不使用UIImagePickerController的情况下从照片/相机胶卷加载照片、ios – swift:如何在不使用UIImagePickerController的情况下从照片库加载照片?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Swift-如何使用UIImagePickerController以MP4格式录制视频?(swiftui视频教程)

Swift-如何使用UIImagePickerController以MP4格式录制视频?(swiftui视频教程)

我正在创建一个应用程序,其中需要录制视频并将其上传到服务器。现在我的项目也有一个android版本。为了支持android版本,我必须以mp4格式录制视频。我按照本教程将UIImagePicker媒体类型设置为电影格式imagePicker.mediaTypes = [kUTTypeMovie asString]

UIImagePickerController是最适合我的要求,我唯一需要更改的是将其保存为mp4格式。我试过了kUTTypeMPEG4mediaTypes但是在运行时抛出错误,没有错误描述。

这是我的视频捕获功能

func startCameraFromViewController() {        if UIImagePickerController.isSourceTypeAvailable(.Camera) == false {            return        }        viewBlack.hidden = false        presentViewController(cameraController, animated: false, completion: nil)        cameraController.sourceType = .Camera        cameraController.mediaTypes = [kUTTypeMovie as String]        //cameraController.mediaTypes = [kUTTypeMPEG4 as String]        cameraController.cameraCaptureMode = .Video        cameraController.videoQuality = .TypeMedium        if(getPurchaseId() as! Int == 0)        {            if(txtBenchMark.text?.isEmpty == false)            {                cameraController.videoMaximumDuration = NSTimeInterval(300.0)            }else{                cameraController.videoMaximumDuration = NSTimeInterval(60.0)            }        }else{            cameraController.videoMaximumDuration = NSTimeInterval(600.0)        }        cameraController.allowsEditing = false    }

我正在使用Swift 2.2和Xcode 8 Use Legacy swift Language version = Yes

任何替代解决方案也表示赞赏。提前致谢。

编辑:我发现没有任何方法可以直接以mp​​4格式直接录制视频。只能从Apple的quicktime mov格式转换为所需的格式。

答案1

小编典典

您可以使用以下代码将录制的视频转换为MP4:

func encodeVideo(videoURL: NSURL)  {let avAsset = AVURLAsset(URL: videoURL, options: nil)var startDate = NSDate()//Create Export sessionexportSession = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetPassthrough)// exportSession = AVAssetExportSession(asset: composition, presetName: mp4Quality)//Creating temp path to save the converted videolet documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]let myDocumentPath = NSURL(fileURLWithPath: documentsDirectory).URLByAppendingPathComponent("temp.mp4").absoluteStringlet url = NSURL(fileURLWithPath: myDocumentPath)let documentsDirectory2 = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURLlet filePath = documentsDirectory2.URLByAppendingPathComponent("rendered-Video.mp4")deleteFile(filePath)//Check if the file already exists then remove the previous fileif NSFileManager.defaultManager().fileExistsAtPath(myDocumentPath) {    do {        try NSFileManager.defaultManager().removeItemAtPath(myDocumentPath)    }    catch let error {        print(error)    }} urlexportSession!.outputURL = filePathexportSession!.outputFileType = AVFileTypeMPEG4exportSession!.shouldOptimizeForNetworkUse = truevar start = CMTimeMakeWithSeconds(0.0, 0)var range = CMTimeRangeMake(start, avAsset.duration)exportSession.timeRange = rangeexportSession!.exportAsynchronouslyWithCompletionHandler({() -> Void in    switch self.exportSession!.status {    case .Failed:        print("%@",self.exportSession?.error)    case .Cancelled:        print("Export canceled")    case .Completed:        //Video conversion finished        var endDate = NSDate()        var time = endDate.timeIntervalSinceDate(startDate)        print(time)        print("Successful!")        print(self.exportSession.outputURL)    default:        break    }})}func deleteFile(filePath:NSURL) {guard NSFileManager.defaultManager().fileExistsAtPath(filePath.path!) else {    return}do {    try NSFileManager.defaultManager().removeItemAtPath(filePath.path!)}catch{    fatalError("Unable to delete file: \(error) : \(__FUNCTION__).")}}

iOS swift中UIImagePickerControllerDelegate代理不执行问题

iOS swift中UIImagePickerControllerDelegate代理不执行问题


///代码块1

import UIKit
import MobileCoreServices
import AssetsLibrary

/// 检查设备是否支持相机录制
///
/// - Returns: true or false
public func isSupportCameraRecording() -> Bool {
    guard let avTypes: [String] = UIImagePickerController.availableMediaTypes(for: .camera) else {
        return false
    }
    return avTypes.contains(kUTTypeMovie as String)
}

open class cameraVC: NSObject,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    public var cameraVC: UIImagePickerController?
    
    /// 
    public var setCameraDeviceFront: Bool = false
    
    override init() {
        super.init()
        cameraVC = setupImagePicker()
    }    
    
    private func setupImagePicker() -> UIImagePickerController {
        let camera = UIImagePickerController()
            camera.sourceType = UIImagePickerControllerSourceType.camera
            camera.mediaTypes = [kUTTypeMovie as String]
            camera.videoQuality = .typeHigh
            camera.delegate = self
            setCameraDeviceFront(picker: camera)
//            configureCustomUI(picker: camera)
        return camera
    }
    
    private func setCameraDeviceFront(picker: UIImagePickerController) {
        
        let defCameraDeviceFront = UIImagePickerController.isCameraDeviceAvailable(.rear)
        if setCameraDeviceFront && defCameraDeviceFront {
            picker.cameraDevice = .front
        }
    }
    
    private func configureCustomUI(picker: UIImagePickerController) {
        let cameraOverlay = UIView()
        picker.showsCameraControls = false
        picker.cameraOverlayView = cameraOverlay
    }
    
//MARK:            delegate
    public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
    
    public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let library = ALAssetsLibrary()
        let url: URL = info["UIImagePickerControllerMediaURL"] as! URL
        if library.videoAtPathIs(compatibleWithSavedPhotosAlbum: url) {
            library.writeVideoAtPath(toSavedPhotosAlbum: url, completionBlock: { ( _, _)in})
        }
        picker.dismiss(animated: true, completion: nil)
    }
}

/// 调用的地方 控制器里面
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if !isSupportCameraRecording() {
            return
        }
        let camera = cameraVC()
/// 如果 camera.cameraVC.delegate = self 写在这里
        present(camera.cameraVC!, animated: true, completion: nil)
    }
/// 并执行代理方法就会执行,而同样的代码Oc里面不会存在这种情况

如上代码中在相机录制结束后或者点击Cancle 是没有执行代理方法的,而如果把代理方法写在调用的地方,且实现代理方法就会执行,这是什么原因?一样的代码Oc里面却没问题?

 

 

 

ios – Swift 3中的UIImagePickerController

ios – Swift 3中的UIImagePickerController

我最近使用开发人员测试版更新了 Xcode 8中的 Swift 3.
我正在尝试实施Firebase Auth,一切进展顺利.

我的问题:

我正在尝试将图像作为用户的个人资料图片上传到Firebase数据库.

我以为我可以使用UIImagePickerController来做到这一点,但是当我这样做时,我得到了一个

“Thread 7: Signal SIGABRT

我知道这通常表示什么,但我检查了,当我点击它时,我的图像确实打印了我的测试语句.

我失败的方法:

ViewController.swift

import UIKit
import Firebase
import Photos

class ViewController: UIViewController,UITextFieldDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate{

@IBOutlet weak var imageView: UIImageView!
@IBOutlet var emailTextField: UITextField!
@IBOutlet var passWordTextField: UITextField!
@IBOutlet var nameTextField: UITextField!

override func viewDidLoad() {
        super.viewDidLoad()

        if FIRAuth.auth()?.currentUser?.uid != nil {
            let storyboard = UIStoryboard(name: "Main",bundle: nil)
            let view = storyboard.instantiateViewController(withIdentifier: "ProfileViewController")
            self.present(view,animated: true,completion: nil)
        }

        imageView.addGestureRecognizer(UITapGestureRecognizer(target: self,action: #selector(handleSelectProfileImageView)))
        imageView.isUserInteractionEnabled = true

        self.emailTextField.delegate = self;
        self.passWordTextField.delegate = self;
        self.nameTextField.delegate = self;
    }

func handleSelectProfileImageView() {
    let picker = UIImagePickerController()

    picker.delegate = self
    picker.allowsEditing = true

    present(picker,completion: nil)
}

我不确定这是否只是Swift 3和开发人员Xcode 8 beta的问题,或者我只是对swift 3做错了.

编辑:

我正在使用GM版的xcode8,但仍然会遇到同样的错误.

解决方法

我认为您需要添加隐私 – 在info.plist文件中为camara和照片库添加密钥,例如xcode 8,例如,
Key : Privacy - Media Library Usage Description
 Value : YES 

 Key : Privacy - Photo Library Usage Description
 Value : YES 

 Key : Privacy - Camara Usage Description
 Value : YES

这里的值是字符串而非布尔值.

试试吧.

查看Apple documentation了解更多详情!

参考:this so post

ios – Swift 3:在不使用UIImagePickerController的情况下从照片/相机胶卷加载照片

ios – Swift 3:在不使用UIImagePickerController的情况下从照片/相机胶卷加载照片

This question has been asked before但没有Swift 3的答案.我正在寻找过去3周我遇到的相同解决方案.

我已经完成了我的研究并观看了许多关于使用UIImagePickerController将照片/相机卷中的图像加载到应用程序中的Youtube视频,但我想在没有用户操作的情况下访问这些照片.

我想从相机胶卷中读取一系列照片并将它们放在照片幻灯片中,逐一显示.如何在没有UIImagePickerController的情况下访问这些照片?

解决方法

您可以使用Photos框架从CameraRoll / Photos中获取照片.

这是Swift 3代码的版本.

导入照片框架

import Photos

//Array of PHAsset type for storing photos
var images = [PHAsset]()

使用此功能可以在viewDidLoad中的某个位置或在您想要获取照片的任何位置获取照片.

func getimages() {
    let assets = PHAsset.fetchAssets(with: PHAssetMediaType.image,options: nil)
    assets.enumerateObjects({ (object,count,stop) in
       // self.cameraAssets.add(object)
        self.images.append(object)
    })

    //In order to get latest image first,we just reverse the array
    self.images.reverse() 

    // To show photos,I have taken a UICollectionView       
    self.photosCollectionView.reloadData()
}

其余是UICollectionView数据源和代理.请参阅如何显示图像的cellForItem数据源方法.

func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
       return images.count
    }

func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell",for: indexPath) as! PhotoCollectionViewCell
    let asset = images[indexPath.row]
    let manager = PHImageManager.default()
    if cell.tag != 0 {
            manager.cancelImageRequest(PHImageRequestID(cell.tag))
        }
    cell.tag = Int(manager.requestimage(for: asset,targetSize: CGSize(width: 120.0,height: 120.0),contentMode: .aspectFill,options: nil) { (result,_) in
                                                cell.photoImageView?.image = result
        })
    return cell
}

根据您的需要调整以下代表.

func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeforItemAt indexPath: IndexPath) -> CGSize {
    let width = self.view.frame.width * 0.32
    let height = self.view.frame.height * 0.179910045
    return CGSize(width: width,height: height)
}

func collectionView(_ collectionView: UICollectionView,minimumLinespacingForSectionAt section: Int) -> CGFloat {
    return 2.5
}

func collectionView(_ collectionView: UICollectionView,insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 5,left: 5,bottom: 5,right: 5)
}

func collectionView(_ collectionView: UICollectionView,minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 0
}

务必保持照片权限.如果单击“不允许”,则必须使用PHPhotoLibrary.authorizationStatus()管理授权.

您可以阅读有关Photos框架的更多信息.

ios – swift:如何在不使用UIImagePickerController的情况下从照片库加载照片?

ios – swift:如何在不使用UIImagePickerController的情况下从照片库加载照片?

我正在使用swift从照片库加载图像.我知道我可以使用UIImagePickerController让用户从相机胶卷中选择图像,但我想在没有用户操作的情况下访问照片.例如,我想阅读一系列来自相机胶卷的照片,并将它们放在照片幻灯片中,逐一显示.如何在没有UIImagePickerController的情况下访问这些照片?

解决方法

您可以使用 Photos框架(适用于iOS 8)访问照片库.看看 this的例子.在AAPLRootListViewController的代码中,如果使用awakeFromNib方法,您可以看到如何创建PHFetchResult对象以检索特定的照片数据.然后,在AAPLAssetGridViewController中,PHAsset对象(来自PHFetchResult)用于检索实际图像数据.看看方法

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

代码是用Objective-C而不是Swift编写的,但你可以使用Swift做同样的事情.提出问题,如果有的话

关于Swift-如何使用UIImagePickerController以MP4格式录制视频?swiftui视频教程的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于iOS swift中UIImagePickerControllerDelegate代理不执行问题、ios – Swift 3中的UIImagePickerController、ios – Swift 3:在不使用UIImagePickerController的情况下从照片/相机胶卷加载照片、ios – swift:如何在不使用UIImagePickerController的情况下从照片库加载照片?等相关知识的信息别忘了在本站进行查找喔。

本文标签: