1
私は、サーバーからのビデオにアクセスする必要があると私は彼らにいくつかの画像処理を行うことができるようにリアルタイムでそのフレームをアセスすることができるようにしたいです。アクセスしてるビデオフレーム
私はオフラインAVAssetReaderを使用してそれを行う方法を知っているが、このソリューションは、リアルタイム処理のために動作しません。
私は、サーバーからのビデオにアクセスする必要があると私は彼らにいくつかの画像処理を行うことができるようにリアルタイムでそのフレームをアセスすることができるようにしたいです。アクセスしてるビデオフレーム
私はオフラインAVAssetReaderを使用してそれを行う方法を知っているが、このソリューションは、リアルタイム処理のために動作しません。
(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)")
}
}
}
}
画像を処理した後、どのように再生することができますか?彼らはobjc.io記事で行ったよう – user2232305
あなただけの 'GLKView'に' CIImage'を描くことができます。https://github.com/objcio/core-image-video/blob/master/CoreImageVideo/CoreImageView.swift –
ビュー 'draw'関数から' displayLinkDidRefresh'を手動で呼び出すことはできますか?私はそれが 'CADisplayLink'で作業しましたが、私はそれを手動で呼び出す場合' itemTime'は常にCACurrentMediaTime'が進んでも、 'かかわらず、0を返します... – endavid