2012-09-29 32 views
0

Media Foundation中的標準電影播放器​​似乎不支持流暢的擦洗。我希望這樣做的目的是,當您在手指上滑動手指時,顯示的視頻會不斷刷新,而不是像默認情況下那樣每隔幾秒就會跳躍一次。起初,我認爲默認控件可能會有某種內置的延遲,但使用我自己的滑塊來設置播放時間並沒有幫助。有任何想法嗎?iOS上的實況視頻擦洗

編輯:我仍在試驗,看起來有可能的清理開始點之間的設置時間間隔。也許有一些方法可以減少間隔。

+0

與H264等格式結合使用時不可行 - 請確保您瞭解視頻壓縮的基本知識(i幀與p幀)。 – Till

+0

你能澄清嗎?有我可以使用的格式嗎? – GoldenJoe

+0

任何解決方案?我正在尋找山姆的答案。 – arpo

回答

2

這對我有用。我在幻燈片更改中從視頻資產中抓取了一幀。見下面的代碼。它從我目前的項目中刪除了一個可能包含索姆錯誤,但你會明白。雖然希望沒關係,但它在Swift 1中。

var urlVideo :NSURL = NSURL() 
var vidLength :CMTime = CMTime() 
var durInSeconds: Float = 0.00 
var timescale:CMTimeScale = CMTimeScale() 
var videoInfo:NSDictionary = NSDictionary() 
var chosePosSlider:UISlider = UISlider() 

@IBOutlet weak var imgCont: UIImageView! 

func generateThumnail(url : NSURL, fromTime:Float64) -> UIImage { 

    var asset :AVAsset = AVAsset.assetWithURL(url) as! AVAsset 
    var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 

    assetImgGenerate.appliesPreferredTrackTransform = true 
    assetImgGenerate.requestedTimeToleranceAfter = kCMTimeZero; 
    assetImgGenerate.requestedTimeToleranceBefore = kCMTimeZero; 

    var error  : NSError? = nil 
    var time  : CMTime = CMTimeMakeWithSeconds(fromTime, timescale) 
    var img   : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error) 
    var frameImg : UIImage = UIImage(CGImage: img)! 

    return frameImg 

} 

func sliderValueDidChange(sender:UISlider!) { 

    var newTime:Float = durInSeconds * sender.value 
    setFrame(newTime) 

} 

func setFrame(pos:Float) { 
    imgCont.image = generateThumnail(urlVideo, fromTime: Float64(pos)) 
} 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 

    self.dismissViewControllerAnimated(true, completion: nil) 

    videoInfo = info as NSDictionary 
    urlVideo = videoInfo.objectForKey(UIImagePickerControllerMediaURL) as! NSURL 

    var asset :AVAsset = AVAsset.assetWithURL(urlVideo) as! AVAsset 

    vidLength = asset.duration 
    durInSeconds = Float(CMTimeGetSeconds(vidLength)) 
    timescale = vidLength.timescale 

    chosePosSlider = UISlider(frame:CGRectMake(20, 450, 340, 20)) 
    chosePosSlider.minimumValue = 0 
    chosePosSlider.maximumValue = 1 
    chosePosSlider.continuous = true 
    chosePosSlider.tintColor = UIColor.greenColor() 
    chosePosSlider.value = 0 
    chosePosSlider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged) 
    self.view.addSubview(chosePosSlider) 


    setFrame(0.0) 

} 
+0

我不再在這個項目上工作,但如果任何人都可以確認這個工作很快,我會將其標記爲有效答案。反正無論如何。 – GoldenJoe

+1

'var time:CMTime = CMTimeMakeWithSeconds(fromTime,timescale)fromTime應該是'timescale * fromTime' - 至少當我測試這個時。 – logikal

+0

所以我得到這個工作,但它有點波濤洶涌,雙方工作同樣快,但可以更順利。你完全平穩嗎? – riverhawk