我需要从服务器上访问视频,并能够实时访问其帧以便对其进行图像处理。
我知道如何使用AVAssetReader离线执行此操作,但该解决方案无法用于实时处理。
我需要从服务器上访问视频,并能够实时访问其帧以便对其进行图像处理。
我知道如何使用AVAssetReader离线执行此操作,但该解决方案无法用于实时处理。
AVPlayerItemVideoOutput
实时访问远程资源的帧(感谢 objc.io)。AVAssetReader
对于远程资源的支持很复杂。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)")
}
}
}
}
GLKView
中绘制CIImage
。链接:https://github.com/objcio/core-image-video/blob/master/CoreImageVideo/CoreImageView.swift - Rhythmic Fistmandraw
函数中手动调用displayLinkDidRefresh
方法?我已经通过CADisplayLink
使其正常工作,但是如果我手动调用它,即使CACurrentMediaTime
在增加,itemTime
始终返回0... - endavid