Swift - 從相冊中選擇視頻(過濾掉照片,使用UIImagePickerController)


(本文代碼已升級至Swift4)

 

有時我們需要從系統相冊中選擇視頻錄像,來進行編輯或者上傳操作,這時使用 UIImagePickerController 就可以實現。

默認情況下,UIImagePickerController 打開系統“照片”后允許用戶選擇所有的媒體文件(不管是照片還是錄像),我們可以通過 mediaTypes 屬性設置。讓其只顯示視頻錄像。

 

1,樣例說明

(1)下面樣例點擊“選擇視頻”按鈕后,會自動打開相冊選擇視頻。

(2)由於設置了 mediaTypes,所有的圖片都會過濾掉,只留下視頻選擇。

(3)選擇完畢,系統會自動將視頻復制一個到應用的 tmp 文件夾(臨時文件夾)下。我們可以直接對這個文件進行操作,而不會影響到系統相冊中的原視頻。

(4)本樣例選擇后,就直接使用 AVPlayerViewController 進行播放。

 

2,效果圖

 pastedGraphic.png pastedGraphic_1.png pastedGraphic_2.png

 

可以看到選擇后,視頻會被復制到 tmp 目錄下:

pastedGraphic_3.png

 

選擇完畢后自動播放該視頻:

pastedGraphic_4.png

 

3,樣例代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

import UIKit

import MobileCoreServices

import AssetsLibrary

import AVKit

import AVFoundation

 

class ViewController: UIViewController,  UIImagePickerControllerDelegate,

UINavigationControllerDelegate{

     

    override func viewDidLoad() {

        super.viewDidLoad()

         

        //創建一個ContactAdd類型的按鈕

        let button:UIButton = UIButton(type:.system)

        button.frame = CGRect(x:10, y:150, width:100, height:30)

        button.setTitle("選擇視頻", for:.normal)

        button.addTarget(self, action:#selector(selectVideo), for:.touchUpInside)

        self.view.addSubview(button)

    }

     

    //選擇視頻

    @objc func selectVideo() {

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {

            //初始化圖片控制器

            let imagePicker = UIImagePickerController()

            //設置代理

            imagePicker.delegate = self

            //指定圖片控制器類型

            imagePicker.sourceType = .photoLibrary

            //只顯示視頻類型的文件

            imagePicker.mediaTypes = [kUTTypeMovie as String]

            //不需要編輯

            imagePicker.allowsEditing = false

            //彈出控制器,顯示界面

            self.present(imagePicker, animated: true, completion: nil)

        }

        else {

            print("讀取相冊錯誤")

        }

    }

     

    //選擇視頻成功后代理

    func imagePickerController(_ picker: UIImagePickerController,

                               didFinishPickingMediaWithInfo info: [String : Any]) {

        //獲取視頻路徑(選擇后視頻會自動復制到app臨時文件夾下)

        let videoURL = info[UIImagePickerControllerMediaURL] as! URL

        let pathString = videoURL.relativePath

        print("視頻地址:\(pathString)")

         

        //圖片控制器退出

        self.dismiss(animated: true, completion: {})

         

        //播放視頻文件

        reviewVideo(videoURL)

    }

     

    //視頻播放

    func reviewVideo(_ videoURL: URL) {

        //定義一個視頻播放器,通過本地文件路徑初始化

        let player = AVPlayer(url: videoURL)

        let playerViewController = AVPlayerViewController()

        playerViewController.player = player

        self.present(playerViewController, animated: true) {

            playerViewController.player!.play()

        }

    }

     

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

}

 

原文出自:www.hangge.com  轉載請保留原文鏈接:http://www.hangge.com/blog/cache/detail_1192.html

 

Swift3.0:照片選擇

 

一、介紹

 圖片選擇或者拍照功能:

 1、選擇相冊中的圖片或是拍照,都是通過UIImagePickerController控制器實例化一個對象,然后通過self.presentViewController方法推出界面顯示。但是使用presentViewController的類需要實現UIImagePickerControllerDelegate、UINavigationController兩個代理。

 2、UIImagePickerController可以通過isSourceTypeAvailable方法來判斷設備是否支持照相機/圖片庫/相冊功能。如果支持,可以通過sourceType屬性來設置圖片控制器的顯示類型。類型一共分為3種:PhotoLibrary(照片庫)、Camera(相機)、SavedPhotoAlbum(相冊)

3、實現協議截圖

pastedGraphic_5.png

 

二、實例

1、使用相冊選擇步驟:

  • 判斷是否支持要使用的圖片庫或相冊功能
  • 初始化圖片控制器對象
  • 指定圖片控制器對象的代理
  • 指定圖片控制器的類型,前提是必須先導入MobileCoreServices.framework框架
  • 彈出顯示圖片控制器
  • 實現圖片控制住器代理方法

pastedGraphic_6.png

 func chooseImageFromAlbum(){

        

        //判斷是否支持要使用的圖片庫

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {

            

            //初始化圖片控制器

            let picker = UIImagePickerController()

            

            //設置代理

            picker.delegate = self

            

            //設置媒體類型

            picker.mediaTypes = [kUTTypeImage as String,kUTTypeVideo as String]

            

            //設置允許編輯

            picker.allowsEditing = true

            

            //指定圖片控制器類型

            picker.sourceType = .photoLibrary

            

            //彈出控制器,顯示界面

            self.present(picker, animated: true, completion: nil)

        }

        else{

            

            let alert = UIAlertView.init(title: "讀取相冊錯誤!", message: nil, delegate: nil, cancelButtonTitle: "確定")

            alert.show()

        }

    }

    

 //實現圖片控制器代理方法

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        

        //查看info對象

        print(info)

        

        //獲取選擇的原圖

        let originImage = info[UIImagePickerControllerOriginalImage] as! UIImage

        

        //賦值,圖片視圖顯示圖片

        self.pickerView.image = originImage

        

        //圖片控制器退出

        picker.dismiss(animated: true, completion: nil)

    }

    

    //取消圖片控制器代理

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

        

        //圖片控制器退出

        picker.dismiss(animated: true, completion: nil)

    }

pastedGraphic_6.png

2、拍照步驟:

  • 判斷是否支持拍照功能
  • 初始化圖片控制器對象(可以設置是否允許編輯)
  • 指定圖片控制器對象的代理
  • 指定圖片控制器的類型
  • 彈出顯示圖片控制器

pastedGraphic_6.png

func takePhotoFromCamera() {

        

        //判斷是否支持相機

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {

            

            //初始化圖片控制器

            let picker = UIImagePickerController()

            

            //設置代理

            picker.delegate = self

            

            //設置媒體類型

            picker.mediaTypes = [kUTTypeImage as String,kUTTypeVideo as String]

            

            //設置來源

            picker.sourceType = UIImagePickerControllerSourceType.camera

            

            //設置鏡頭 front:前置攝像頭  Rear:后置攝像頭

            if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.front) {

                picker.cameraDevice = UIImagePickerControllerCameraDevice.front

            }

            

            //設置閃光燈(On:開、Off:關、Auto:自動)

            picker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.on

            

            //允許編輯

            picker.allowsEditing = true

            

            //打開相機

            self.present(picker, animated: true, completion: nil)

        }

        else{

            

            let alert = UIAlertView.init(title: "找不到相機!", message: nil, delegate: nil, cancelButtonTitle: "確定")

            alert.show()

        }

    }

pastedGraphic_6.png

 

程序猿神奇的手,每時每刻,這雙手都在改變着世界的交互方式!

 

 

 

 

//

//  ViewController.swift

//  SwiftExample

//

//  Created by administrator on 2019/2/15.

//  Copyright © 2019 administrator. All rights reserved.

//

 

import UIKit

import AVFoundation

import MobileCoreServices

import AssetsLibrary

import AVKit

 

 

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

 

    func isCameraAvailable() -> Bool {

        return UIImagePickerController.isSourceTypeAvailable(.camera)

    }

    

    func cameraSuportsMedia(mediaType:String, sourceType: UIImagePickerController.SourceType) -> Bool {

        let availabelMediaTypes = UIImagePickerController.availableMediaTypes(for: sourceType)

        for type in availabelMediaTypes! {

            if type == mediaType{

                return true

            }

        }

        return false

    }

    

    func doesCameraSupportShootingVideos() -> Bool {

        return cameraSuportsMedia(mediaType: (kUTTypeMovie as NSString) as String, sourceType: .camera)

    }

    func doesCameraSupportTakingPhotos() -> Bool {

        return cameraSuportsMedia(mediaType: (kUTTypeImage as NSString) as String, sourceType: .camera)

    }

    

    func isFrontCameraAvailable() -> Bool {

        return UIImagePickerController.isCameraDeviceAvailable(.front)

    }

    func isRearCameraAvailable() -> Bool {

        return UIImagePickerController.isCameraDeviceAvailable(.rear)

    }

    

    func isFlashAvailableOnFrontCamera() -> Bool {

        return UIImagePickerController.isFlashAvailable(for: .front)

    }

    func isFlashAvailableOnRearCamera() -> Bool {

        return UIImagePickerController.isFlashAvailable(for: .rear)

    }

    

    //確定視圖控制器的ViewDidAppear方法是否被調用,如果沒有則展示拍照視圖

    var beenhereBefore = false

    var imagePickerController :UIImagePickerController?

    override func viewDidAppear(_ animated: Bool) {

        if beenhereBefore {

            //viewDidapear方法無論何時,在視圖控制器展現時都會被調用,設置此值,控制器只展示一次

            return

        } else {

            beenhereBefore = true

        }

        if isCameraAvailable() && doesCameraSupportTakingPhotos() {

            imagePickerController = UIImagePickerController()

            if let theController = imagePickerController{

                theController.sourceType = .camera

                theController.mediaTypes = [kUTTypeImage as NSString, kUTTypeVideo as NSString] as [String]

//                theController.mediaTypes = [kUTTypeVideo as NSString] as [String]

                theController.allowsEditing = true

                theController.delegate = self

                present(theController, animated: true) {

                    

                }

            }

        } else {

            print("Camera is not available")

        }

    }

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

       

        

    }

    

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        let mediaType = info[.mediaType]

        if let type:AnyObject = mediaType as AnyObject{

            if type is String{

                

                if let stringType :String = type as! String {

                    if stringType as NSString == kUTTypeVideo as NSString {

                        let urlOfVideo = info[.mediaURL] as! NSURL

                        if let url:NSURL = urlOfVideo{

                            print("rul \(url)")

                        }

                    }

                    if stringType as NSString == kUTTypeImage as NSString{

                        if let metadata = info[.mediaMetadata]{

                            let image = info[.originalImage] as! UIImage

                            if let theImage:UIImage = image{

                                print("image MetaData \(metadata)")

                                print("\(theImage)")

                            }

                        }

                    }

                }

                

            }

        }

    }

    

    

}

 

 

 

swift3 訪問相冊和攝像頭

2017年05月10日 11:07:11 EIamor 閱讀數:1245

 

版權聲明:hahahaha , 努力 ing https://blog.csdn.net/EIamor/article/details/71515771

第一步:需要在項目中的Info.plist中添加相應的鍵 

訪問相冊:Privacy - Photo Library Usage Description 

訪問攝像頭:Privacy - Camera Usage Description 

它們對應的值可以隨意填寫,但是其值是顯示給用戶的信息 

pastedGraphic.png

第二步:請求訪問 

pastedGraphic_1.png 

***注意:如果用button設置接收圖片,則此button的類型不能為系統樣式,即 addImageBtn.buttonType = .system 是無法設置成功的。 求大手告訴原因~~ 

這個例子中一整個圖片添加是一個Button點擊觸發選擇圖片事件 

首先要遵守UIImagePickerControllerDelegate,和UINavigationControllerDelegate 

然后在button點擊觸發的事件中添加如下代碼

@IBAction func chosePhoto(_ sender: UIButton) {

        guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary)else{    //如果是要訪問相機只需要將.photoLibrary改為.camera即可

            print("無法獲得相冊授權")

            return

        }

        let picker = UIImagePickerController()

        picker.allowsEditing = false   //不允許編輯圖片

        picker.sourceType = .photoLibrary //選擇器訪問的是相冊(如果是訪問相機則將.photoLibrary改為.camera)

        picker.delegate = self   //設置代理

        self.present(picker, animated: true, completion: nil)//以模態視圖彈出選擇器

    }

 

guard 的作用是保證應用獲得用戶授權之后才能訪問相冊 

第三步:訪問完相冊之后就要讓在相冊中被點擊的圖片設置為Button的圖片

//必須要先設置picker的代理

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

 

//被點擊的圖片的信息保存在info字典中

       self.albumBtn.setImage(info[UIImagePickerControllerOriginalImage] as? UIImage, for: .normal)

 

        self.albumBtn.imageView?.contentMode = .scaleAspectFill

        self.albumBtn.imageView?.clipsToBounds = true

 

        dismiss(animated: true, completion: nil)

    }

 

結果: 

pastedGraphic_2.png

5.15更新**************************************** 

之前的版本里在打開相冊的時候只能選擇圖片而不能選擇視頻,這是因為UIImagePickerViewController.mediaTypes為設置,當mediaTypes沒設置的時候默認為kUTTypeImage ,即:只選擇圖片 

所以當要選擇視頻的時候只需要將mediaTypes 設置為 kUTTypeMovie即可 

例:

let picker = UIImagePickerController()

        picker.delegate = self

        picker.allowsEditing = true

        picker.sourceType = .photoLibrary

        picker.mediaTypes = [kUTTypeMovie as String , kUTTypeImage as String]   //可以選擇視頻和圖片

 

        present(picker, animated: true, completion: nil)

然后在 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])方法中判斷選擇的是圖片還是視頻之后在做需要做的操作 

例:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

 

        let type = info[UIImagePickerControllerMediaType] as? String          //獲取所選中項目的類型

        if type == kUTTypeMovie as String{                               //判斷選中的是圖片還是視頻

            let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL

 

            self.dismiss(animated: true, completion: nil)

            //寫出你要做的操作,我這里的示例是做的共享的操作

            let activityViewController = UIActivityViewController(activityItems: [videoURL], applicationActivities: nil)

            activityViewController.popoverPresentationController?.sourceView = self.view

            self.present(activityViewController, animated: true, completion: nil)

        }else{

            let image = info[UIImagePickerControllerOriginalImage] as! UIImage

            self.selectedImage = image

            self.dismiss(animated: true, completion: nil)

            let shareVC = UIActivityViewController(activityItems: [image], applicationActivities: nil)

 

            shareVC.popoverPresentationController?.sourceView = self.view

            present(shareVC, animated: true, completion: nil)

        }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM