iOS กำหนดจำนวนเฟรมในวิดีโอ

หากฉันมี MPMoviePlayerController ใน Swift:

MPMoviePlayerController mp = MPMoviePlayerController(contentURL: url)

มีวิธีใดที่ฉันจะได้รับจำนวนเฟรมภายในวิดีโอที่ url หรือไม่ ถ้าไม่ มีวิธีอื่นในการกำหนดจำนวนเฟรมหรือไม่


person Oliver Spryn    schedule 08.04.2015    source แหล่งที่มา


คำตอบ (3)


ฉันไม่คิดว่า MPMoviePlayerController สามารถช่วยคุณได้

ใช้ AVAssetReader และนับจำนวน CMSampleBuffers ที่มันส่งกลับมาหาคุณ คุณสามารถกำหนดค่าไม่ให้ถอดรหัสเฟรมได้ ทำให้แยกวิเคราะห์ไฟล์ได้อย่างมีประสิทธิภาพ ดังนั้นจึงควรจะรวดเร็วและใช้หน่วยความจำได้ดี

สิ่งที่ต้องการ

    var asset = AVURLAsset(URL: url, options: nil)
    var reader = AVAssetReader(asset: asset, error: nil)
    var videoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0] as! AVAssetTrack

    var readerOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: nil) // NB: nil, should give you raw frames
    reader.addOutput(readerOutput)
    reader.startReading()

    var nFrames = 0

    while true {
        var sampleBuffer = readerOutput.copyNextSampleBuffer()
        if sampleBuffer == nil {
            break
        }

        nFrames++
    }

    println("Num frames: \(nFrames)")

ขออภัยถ้านั่นไม่ใช่สำนวนฉันไม่รู้จักรวดเร็ว

person Rhythmic Fistman    schedule 08.04.2015
comment
ยอดเยี่ยม! คุณมีตัวอย่างสั้นๆ ที่คุณสามารถแสดงได้หรือไม่? นั่นจะเป็นประโยชน์มากที่สุด - person Oliver Spryn; 08.04.2015

สวิฟท์ 5

 func getNumberOfFrames(url: URL) -> Int {
        let asset = AVURLAsset(url: url, options: nil)
        do {
            let reader = try AVAssetReader(asset: asset)
        //AVAssetReader(asset: asset, error: nil)
            let videoTrack = asset.tracks(withMediaType: AVMediaType.video)[0]

            let readerOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: nil) // NB: nil, should give you raw frames
            reader.add(readerOutput)
        reader.startReading()

        var nFrames = 0

        while true {
            let sampleBuffer = readerOutput.copyNextSampleBuffer()
            if sampleBuffer == nil {
                break
            }

            nFrames = nFrames+1
        }

        print("Num frames: \(nFrames)")
            return nFrames
        }catch {
            print("Error: \(error)")
        }
        return 0
    }
person Amal T S    schedule 26.06.2019
comment
อย่าลืมตั้งค่า ไม่เช่นนั้นคุณอาจได้รับหมายเลขผิด let readerSettings = [String(kCVPixelBufferPixelFormatTypeKey): Int(kCVPixelFormatType_32BGRA)]จะทำ - person yuji; 05.01.2021

คุณสามารถใช้เฟรมต่อวินาทีเพื่อคำนวณจำนวนเฟรมทั้งหมดได้

var player: AVPlayer?
var playerController = AVPlayerViewController()
var videoFPS: Int = 0
var totalFrames: Int?


guard let videoURL = "" else { return }
player = AVPlayer(url: videoURL)
playerController.player = player
guard player?.currentItem?.asset != nil else {
    return
}
let asset = self.player?.currentItem?.asset
let tracks = asset!.tracks(withMediaType: .video)
let fps = tracks.first?.nominalFrameRate
let duration = self.player?.currentItem?.duration

self.videoFPS = lround(Double(fps!))
self.totalFrames = lround(Double(self!.videoFPS) * durationSeconds)
person Chathuranga Silva    schedule 10.06.2021