หากฉันมี MPMoviePlayerController ใน Swift:
MPMoviePlayerController mp = MPMoviePlayerController(contentURL: url)
มีวิธีใดที่ฉันจะได้รับจำนวนเฟรมภายในวิดีโอที่ url
หรือไม่ ถ้าไม่ มีวิธีอื่นในการกำหนดจำนวนเฟรมหรือไม่
หากฉันมี MPMoviePlayerController ใน Swift:
MPMoviePlayerController mp = MPMoviePlayerController(contentURL: url)
มีวิธีใดที่ฉันจะได้รับจำนวนเฟรมภายในวิดีโอที่ url
หรือไม่ ถ้าไม่ มีวิธีอื่นในการกำหนดจำนวนเฟรมหรือไม่
ฉันไม่คิดว่า MPMoviePlayerController
สามารถช่วยคุณได้
ใช้ AVAssetReader
และนับจำนวน CMSampleBuffer
s ที่มันส่งกลับมาหาคุณ คุณสามารถกำหนดค่าไม่ให้ถอดรหัสเฟรมได้ ทำให้แยกวิเคราะห์ไฟล์ได้อย่างมีประสิทธิภาพ ดังนั้นจึงควรจะรวดเร็วและใช้หน่วยความจำได้ดี
สิ่งที่ต้องการ
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)")
ขออภัยถ้านั่นไม่ใช่สำนวนฉันไม่รู้จักรวดเร็ว
สวิฟท์ 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
}
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)