如何从Swift中的本地视频文件中获取帧?

时间:2018-03-20 17:34:21

标签: swift video avfoundation avplayer ios11

我需要从本地视频文件中获取帧,以便我可以在播放视频之前处理它们。我已经尝试过使用AVAssetReader和VideoOutput。

[编辑]以下是我在Accesing Individual Frames using AV Player

中使用的代码
let asset = AVAsset(URL: inputUrl)
let reader = try! AVAssetReader(asset: asset)

let videoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]

// read video frames as BGRA
let trackReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings:[String(kCVPixelBufferPixelFormatTypeKey): NSNumber(unsignedInt: kCVPixelFormatType_32BGRA)])

reader.addOutput(trackReaderOutput)
reader.startReading()

while let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() {
    print("sample at time \(CMSampleBufferGetPresentationTimeStamp(sampleBuffer))")
    if let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
        // process each CVPixelBufferRef here
        // see CVPixelBufferGetWidth, CVPixelBufferLockBaseAddress, CVPixelBufferGetBaseAddress, etc
    }
}

4 个答案:

答案 0 :(得分:1)

我相信AVAssetReader应该可行。你尝试了什么?您是否看过Apple的示例代码? https://developer.apple.com/library/content/samplecode/ReaderWriter/Introduction/Intro.html

答案 1 :(得分:0)

您可以查看VideoToolbox:https://developer.apple.com/documentation/videotoolbox

但要注意:这与硬件解压缩器和稀疏记录的地形非常接近。

答案 2 :(得分:0)

根据您要执行的处理,OpenCV可能是一个选项 - 特别是如果您正在检测或跟踪帧中的对象。如果你的需求更简单,那么使用swift的OpenCV的努力可能有点太多了 - 见下文。

您可以打开视频,逐帧阅读,然后在框架上进行工作,然后再显示 - 请注意有效避免显示延迟的必要性。

基本代码结构非常简单 - 这是一个python示例,但相同的原则适用于支持的语言

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    ret, frame = cap.read()

    //Do whatever work you want on the frame here - in this example
    //from the tutorial the image is being converted from one colour 
    //space to another
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    //This displays the resulting frame 
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

此处有更多信息:http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html

一个警告是,使用OpenCV和swift需要一些额外的努力 - 这是一个很好的例子,但它不断发展,所以如果你决定采用这种方式值得搜索:https://medium.com/@yiweini/opencv-with-swift-step-by-step-c3cc1d1ee5f1

答案 3 :(得分:0)

我发现了问题所在!这是我的实施。我发布的代码是正确的。谢谢大家