2016-09-21 5 views
1

私は、サーバーからのビデオにアクセスする必要があると私は彼らにいくつかの画像処理を行うことができるようにリアルタイムでそのフレームをアセスすることができるようにしたいです。アクセスしてるビデオフレーム

私はオフラインAVAssetReaderを使用してそれを行う方法を知っているが、このソリューションは、リアルタイム処理のために動作しません。

答えて

2

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

画像を処理した後、どのように再生することができますか?彼らはobjc.io記事で行ったよう – user2232305

+0

あなただけの 'GLKView'に' CIImage'を描くことができます。https://github.com/objcio/core-image-video/blob/master/CoreImageVideo/CoreImageView.swift –

+0

ビュー 'draw'関数から' displayLinkDidRefresh'を手動で呼び出すことはできますか?私はそれが 'CADisplayLink'で作業しましたが、私はそれを手動で呼び出す場合' itemTime'は常にCACurrentMediaTime'が進んでも、 'かかわらず、0を返します... – endavid

関連する問題