2012-09-29 5 views
0

Media Foundation의 표준 무비 플레이어는 유동적 인 스크러빙을 지원하지 않습니다. 나는 기본적으로 그러 하듯이 매초마다 점프하는 것이 아니라 막대를 가로 질러 손가락을 움직일 때 보여지는 비디오가 지속적으로 새로 고침되도록하고 싶습니다. 처음에는 기본 컨트롤에 일종의 딜레이가 내장되어 있다고 생각했지만 재생 시간을 설정하기 위해 자체 슬라이더를 사용하면 도움이되지 않았습니다. 어떤 아이디어?iOS에서 라이브 비디오 스크러빙

편집 : 아직 실험 중이며 가능한 스크럽 시작 지점 사이에 일정 간격이있는 것처럼 보입니다. 간격을 줄이는 방법이있을 수 있습니다.

+0

H264와 같은 형식으로 사용할 수없는 경우 - 비디오 압축의 기본 사항 (i- 프레임 대 p- 프레임)을 이해해야합니다. – Till

+0

당신은 분명히 할 수 있습니까? 내가 사용할 수있는 형식이 있습니까? – GoldenJoe

+0

이 모든 솔루션? 샘 대답을 찾고 있어요. – arpo

답변

2

나를 위해 작동합니다. 슬라이드 변경시 동영상 애셋의 프레임을 가져옵니다. 아래 코드를 참조하십시오. 내 현재 프로젝트에서 잘라낸 것일 수도 있습니다 som 오류가 있지만 당신은 아이디어를 얻을 것이다. 괜찮 으면 좋겠지 만 스위프트 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

더 이상이 프로젝트에 참여하지는 않겠지 만 누구나 신속하게 작동하는지 확인할 수 있다면 유효한 답변으로 표시하겠습니다. 어쨌든 upvoting. – GoldenJoe

+1

'var time : CMTime = CMTimeMakeWithSeconds (fromTime, timescale)'fromTime은'timescale * fromTime'과 같아야합니다. 적어도 이것을 테스트했을 때입니다. – logikal

+0

그래서이 작업이 가능해졌지만 약간 고르지는 않지만 두 가지 방법이 똑같이 빠르지 만 부드럽게 처리 될 수 있습니다. 네가 완전히 부드럽습니까? – riverhawk