PHAsset獲取圖片和獲取視頻,PHAsset轉(zhuǎn)換為Data.封裝等.

前言

最近做項(xiàng)目,使用到了PHAseet,因?yàn)锳LAsset已經(jīng)廢棄了.實(shí)話說(shuō),PHAseet現(xiàn)在比ALAsset麻煩,獲取地址路徑就很惡心,總之,一點(diǎn)點(diǎn)也是趟過(guò)來(lái)了,做個(gè)記錄,以后自己別忘了.

獲取圖片,獲取視頻首幀

        let option = PHImageRequestOptions()
        option.isNetworkAccessAllowed = true //允許下載iCloud的圖片
        option.resizeMode = .fast
        option.deliveryMode = .fastFormat
        PHImageManager.default().requestImage(for: asset,
                                              targetSize: self.bounds.size,
                                              contentMode: .aspectFill,
                                              options: option)
        { (image, nil) in
             //image就是圖片
        }

獲取視頻

       let options = PHVideoRequestOptions()
       options.isNetworkAccessAllowed = true
       options.deliveryMode = .automatic
       PHImageManager.default().requestPlayerItem(forVideo:asset, options: options, resultHandler: { playerItem, info in
           guard self.playerLayer == nil else { return }
           //播放視頻
           let player = AVPlayer(playerItem: playerItem)
           let playerLayer = AVPlayerLayer(player: player)
           playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
           playerLayer.frame = self.layer.bounds
           self.contentView.layer.insertSublayer(playerLayer, below: self.palyBtn.layer)
           player.play()
           self.playerLayer = playerLayer
       })

注意事項(xiàng)

使用的時(shí)候,盡量將option.isNetworkAccessAllowed = true打開(kāi), 允許下載iCloud的圖片和視頻,否則會(huì)照成crash.這塊當(dāng)時(shí)給我弄的很無(wú)奈,因?yàn)槲液脦讉€(gè)地方都上傳圖片,改了好幾遍.

將PHAsset轉(zhuǎn)化為視頻的NSData

我自己封裝了一個(gè)簡(jiǎn)單的類,代碼入下


import UIKit
import Photos
class XXVideoCompression: NSObject {
    
    public func compressVideo(_ exportSession:AVAssetExportSession? , completion: @escaping (_ data: Data)-> Void) {
        
        let uuu = self.compressedUrl()
        exportSession?.outputURL = URL.init(fileURLWithPath: uuu)
        exportSession?.outputFileType = .mp4
        exportSession?.shouldOptimizeForNetworkUse = true;
        
        if let assetTime = exportSession?.asset.duration {
            let duration = CMTimeGetSeconds(assetTime)
            print("視頻時(shí)長(zhǎng) \(duration)");
        }
        
        exportSession?.exportAsynchronously(completionHandler: {
                
            switch exportSession?.status{
                
            case .failed?:
                print("失敗...\(String(describing: exportSession?.error?.localizedDescription))")
                completion(Data())
                break
            case .cancelled?:
                print("取消")
                completion(Data())
                break;
            case .completed?:
                print("轉(zhuǎn)碼成功")
                do {
                    let data = try Data.init(contentsOf: URL.init(fileURLWithPath: uuu), options: Data.ReadingOptions.init())
                    let mp4Path = URL.init(fileURLWithPath: uuu)
                    let size = self.fileSize(url: mp4Path)
                    print("視頻時(shí)長(zhǎng)\(size)")
                    completion(data)
                } catch let error {
                    print("失敗 \(error)")
                    completion(Data())
                }

                break;
            default:
                print("..")
                completion(Data())
                break;
            }
        })
    }
    
    
    //保存壓縮
    func compressedUrl() -> String {
        
        let string = NSHomeDirectory() + "/Documents/\(Date().timeIntervalSince1970).mp4"

        return string//URL.init(fileURLWithPath: string)
    }
        
    //計(jì)算視頻大小
    func fileSize(url:URL) -> CGFloat {
        return CGFloat(NSData.init(contentsOf: url)?.length ?? 0 )/// 1024 / 1024
    }
    
    //獲取視頻首幀
    func imageWithVideoUrl(mediaModel:HEPhotoAsset,completion: @escaping ( _ image:UIImage) -> Void) {
        
        let option = PHImageRequestOptions()
        option.isNetworkAccessAllowed = true
        option.resizeMode = .fast
        option.deliveryMode = .fastFormat
        PHImageManager.default().requestImage(for: mediaModel.asset,
                                              targetSize:PHImageManagerMaximumSize,
                                              contentMode: .aspectFill,
                                              options: option )
        { (image, info) in
            completion(image ?? UIImage())
        }
    }
}

具體使用如下:

    //
    let options = PHVideoRequestOptions()
    options.isNetworkAccessAllowed = true
    options.deliveryMode = .automatic
                
    PHImageManager.default().requestExportSession(forVideo: mediaModel.asset, options: options, exportPreset: AVAssetExportPresetMediumQuality) { (exportSession, info) in
        //將asset轉(zhuǎn)換為AVAssetExportSession對(duì)象,用AVAssetExportSession轉(zhuǎn)化為Data
        XXVideoCompression().compressVideo(exportSession, completion: { (data) in
            if data.count > 0 {//做判斷,判斷是否轉(zhuǎn)化成功
                  //進(jìn)行視頻上傳
            }
        }
    }

具體問(wèn)題具體分析,使用過(guò)程中,總會(huì)遇到各種各樣的問(wèn)題,但是只要有耐心,總會(huì)一點(diǎn)點(diǎn)解決的.歡迎各位留言,提問(wèn).

如果我的文章,對(duì)你有幫助,請(qǐng)給我一個(gè)??哦~~!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末小槐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雀费,更是在濱河造成了極大的恐慌君纫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧蕉,死亡現(xiàn)場(chǎng)離奇詭異肘习,居然都是意外死亡近零,警方通過(guò)查閱死者的電腦和手機(jī)珠洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門溜歪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人许蓖,你說(shuō)我怎么就攤上這事蝴猪。” “怎么了膊爪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵自阱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我米酬,道長(zhǎng)沛豌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任赃额,我火速辦了婚禮加派,結(jié)果婚禮上阁簸,老公的妹妹穿的比我還像新娘。我一直安慰自己哼丈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布筛严。 她就那樣靜靜地躺著醉旦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桨啃。 梳的紋絲不亂的頭發(fā)上车胡,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音照瘾,去河邊找鬼匈棘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛析命,可吹牛的內(nèi)容都是我干的主卫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鹃愤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼簇搅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起软吐,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘩将,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后凹耙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姿现,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年肖抱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了备典。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虐沥,死狀恐怖熊经,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欲险,我是刑警寧澤镐依,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站天试,受9級(jí)特大地震影響槐壳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喜每,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一务唐、第九天 我趴在偏房一處隱蔽的房頂上張望雳攘。 院中可真熱鬧,春花似錦枫笛、人聲如沸吨灭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喧兄。三九已至,卻和暖如春啊楚,著一層夾襖步出監(jiān)牢的瞬間吠冤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工恭理, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拯辙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓颜价,卻偏偏與公主長(zhǎng)得像涯保,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拍嵌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348