iOS Menentukan Jumlah Frame dalam Video

Jika saya memiliki MPMoviePlayerController di Swift:

MPMoviePlayerController mp = MPMoviePlayerController(contentURL: url)

Adakah cara agar saya bisa mendapatkan jumlah frame dalam video yang terletak di url? Jika tidak, apakah ada cara lain untuk menentukan jumlah frame?


person Oliver Spryn    schedule 08.04.2015    source sumber


Jawaban (3)


Saya rasa MPMoviePlayerController tidak dapat membantu Anda.

Gunakan AVAssetReader dan hitung jumlah CMSampleBuffer yang dikembalikan kepada Anda. Anda dapat mengonfigurasinya bahkan untuk tidak mendekode bingkai, menguraikan file secara efektif, sehingga harus cepat dan hemat memori.

Sesuatu seperti

    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)")

Maaf jika itu tidak idiomatis, saya tidak tahu Swift.

person Rhythmic Fistman    schedule 08.04.2015
comment
Bagus sekali! Apakah Anda punya contoh singkat yang bisa Anda tunjukkan? Itu akan sangat membantu. - person Oliver Spryn; 08.04.2015

Cepat 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
pastikan untuk mengatur pengaturannya, atau Anda mungkin mendapatkan nomor yang salah. let readerSettings = [String(kCVPixelBufferPixelFormatTypeKey): Int(kCVPixelFormatType_32BGRA)] akan berhasil - person yuji; 05.01.2021

Anda juga bisa menggunakan frame per detik untuk menghitung total frame.

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