2016-09-21 118 views
1

我必須從服務器訪問視頻,我希望能夠實時訪問其幀,以便我可以對其進行一些圖像處理。實時處理視頻幀iOS

我知道如何使用AVAssetReader離線執行此操作,但此解決方案不適用於實時處理。

回答

2

您可以使用AVPlayerItemVideoOutput(感謝objc.io)實時訪問遠程資產的幀。

p.s.總是檢查您的遠程資產沒有被App Transport Security阻止。

p.p.s AVAssetReader對遠程資產的支持is complicated

import UIKit 
import AVFoundation 

class ViewController: UIViewController {   
    let player = AVPlayer(url: URL(string: "http://0.s3.envato.com/h264-video-previews/80fad324-9db4-11e3-bf3d-0050569255a8/490527.mp4")!) 
    let videoOutput = AVPlayerItemVideoOutput(pixelBufferAttributes: [String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_32BGRA)]) 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     player.currentItem!.add(videoOutput) 
     player.play() 

     let displayLink = CADisplayLink(target: self, selector: #selector(displayLinkDidRefresh(link:))) 
     displayLink.add(to: RunLoop.main, forMode: RunLoopMode.commonModes) 
    } 

    func displayLinkDidRefresh(link: CADisplayLink) { 
     let itemTime = videoOutput.itemTime(forHostTime: CACurrentMediaTime()) 

     if videoOutput.hasNewPixelBuffer(forItemTime: itemTime) { 
      if let pixelBuffer = videoOutput.copyPixelBuffer(forItemTime: itemTime, itemTimeForDisplay: nil) { 
       print("pixelBuffer \(pixelBuffer)") // yay, pixel buffer 
       let image = CIImage(cvImageBuffer: pixelBuffer) // or maybe CIImage? 
       print("CIImage \(image)") 
      } 
     } 
    } 
} 
+0

處理完圖像後,如何播放然後播放? – user2232305

+0

您可以像在objc.io文章中一樣將「CIImage」繪製到「GLKView」中:https://github.com/objcio/core-image-video/blob/master/CoreImageVideo/CoreImageView.swift –

+0

是否可以從'draw'函數手動調用'displayLinkDidRefresh'?我用'CADisplayLink'工作,但是如果我手動調用它'itemTime'總是返回0,即使'CACurrentMediaTime'提前... – endavid