无法使用AVAssetTrackReaderOutput在while循环中更新UIViewImage

问题描述 投票:0回答:1

[我正在尝试从视频中提取每一帧,然后进行一些图像处理,然后将图像显示回UIImageView。

如果我手动单击UIButton,则图像将显示并遍历整个视频并显示每一帧。

但是,如果我将更新显示嵌入while循环中,则视图不会更新(即,在不更新的设备上。)>

我以为是因为相对于在屏幕上绘制更新的图像而言,帧的处理太快了,所以我放了一条睡眠线以将其减慢到视频的帧速率,但这并没有工作。

这里是代码:

import UIKit
import Foundation
import Vision
import AVFoundation
import Darwin

class ViewController: UIViewController {

    var uiImage: UIImage?

    var displayLink: CADisplayLink?

    var videoAsset: AVAsset!
    var videoTrack: AVAssetTrack!
    var videoReader: AVAssetReader!
    var videoOutput: AVAssetReaderTrackOutput!


    @IBOutlet weak var topView: UIImageView!

    @IBOutlet weak var bottomView: UIImageView!

    @IBOutlet weak var rightLabel: UILabel!

    @IBOutlet weak var leftLabel: UILabel!

    @IBAction func tapButton(_ sender: Any) {

        while let sampleBuffer = videoOutput.copyNextSampleBuffer() {
            print ("sample at time \(CMSampleBufferGetPresentationTimeStamp(sampleBuffer))")
            if let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {

                let ciImage = CIImage(cvImageBuffer: imageBuffer)
                uiImage = UIImage(ciImage: ciImage)
                self.topView.image = uiImage
                self.topView.setNeedsDisplay()
                usleep(useconds_t(24000))

            }

        }
    }


    override func viewDidLoad() {

        super.viewDidLoad()

    }



    override func viewDidAppear(_ animated: Bool) {




        guard let urlPath = Bundle.main.path(forResource: "video1", ofType: "mp4")  else {
            print ("No File")
            return
        }

        videoAsset = AVAsset(url: URL(fileURLWithPath: urlPath))
        let array = videoAsset.tracks(withMediaType: AVMediaType.video)
        videoTrack = array[0]


        do {
            videoReader = try AVAssetReader(asset: videoAsset)
        } catch {
            print ("No reader created")
        }

        videoOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange])
        videoReader.add(videoOutput)
        videoReader.startReading()


    }

}

我正在尝试从视频中提取每一帧,然后进行一些图像处理,然后将图像显示回UIImageView。如果我手动单击UIButton,图像将显示并遍历...

ios swift uikit avfoundation
1个回答
2
投票

而不是睡觉,您应该使用计时器。尝试类似以下的内容:

© www.soinside.com 2019 - 2024. All rights reserved.