实时访问iOS视频帧

3

我需要从服务器上访问视频,并能够实时访问其帧以便对其进行图像处理。

我知道如何使用AVAssetReader离线执行此操作,但该解决方案无法用于实时处理。

1个回答

9
您可以使用 AVPlayerItemVideoOutput 实时访问远程资源的帧(感谢 objc.io)。
附注:始终检查您的远程资源是否被 App Transport Security 阻止。
另外,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)")
            }
        }
    }
}

1
处理完图像后,如何在回放时播放? - user2232305
你可以像在objc.io的文章中一样,在GLKView中绘制CIImage。链接:https://github.com/objcio/core-image-video/blob/master/CoreImageVideo/CoreImageView.swift - Rhythmic Fistman
1
能否在视图的draw函数中手动调用displayLinkDidRefresh方法?我已经通过CADisplayLink使其正常工作,但是如果我手动调用它,即使CACurrentMediaTime在增加,itemTime始终返回0... - endavid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接