2017-12-03 51 views
0

Swift3에서 비디오 기반 응용 프로그램을 개발 중입니다. 비디오 길이에 따라 하나의 비디오 URL과 범위 슬라이더가 있고 슬라이더에서 최소 및 최대 값을 선택할 수 있습니다. 사용자가 최소값 3 초 및 최대 값 7 초를 선택한 것으로 가정하면이 기간 동안 비디오 썸네일 이미지를 생성해야합니다. 나는이를 생성하는 AVAssetImageGenerator을 사용하고이를 위해,이 달성하기 위해 두 코드 아래 시도 :Swift iOS의 URL에서 매번 동일한 비디오 미리보기 이미지 가져 오기

func createThumbnailOfVideoFromFileURL(_ strVideoURL: URL) -> UIImage?{ 

     let asset = AVAsset(url: strVideoURL) 
     let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 
     assetImgGenerate.appliesPreferredTrackTransform = true 
     let time = CMTimeMake(1, 30) 
     let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) 

     guard let cgImage = img else { return nil } 

     let frameImg = UIImage(cgImage: cgImage) 
     return frameImg 
    } 

func generateThumbnailForUrl(vidUrl:URL) -> UIImage { 

     let asset = AVURLAsset(url: vidUrl, options: nil) 
     let imgGenerator = AVAssetImageGenerator(asset: asset) 
     var thmbnlImg = UIImage() 
     do{ 
      let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(0, 1), actualTime: nil) 
      thmbnlImg = UIImage(cgImage: cgImage) 
      thmbnlImg = thmbnlImg.imageRotatedByDegrees(degrees: 90.0, flip: false) 
     } 
     catch{ 
      print(error) 
     } 
     // !! check the error before proceeding 
     return thmbnlImg 
    } 

을하지만 문제는 위의 방법을 모두 사용하여 같은 썸네일 이미지를 얻고있다, bcos 나는 두 가지 방법 모두에서 여기에 지속 시간을 설정하지 마십시오. 각기 다른 기간에 대해 서로 다른 축소판 이미지를 생성하기 위해 최소 및 최대 기간을 어떻게 추가 할 수 있습니까? 제 문제를 해결하도록 도와주세요. 고맙습니다!

편집 : let time: CMTime = CMTimeMakeWithSeconds(rangeSlider!.lowerValue, 1)

가 그럼 난 다른 썸네일 이미지를 얻고 있지만, 일부 슬라이더 범위에 대해 나 또한 전무 썸네일 이미지를 점점 오전 : 내가 좋아하는 기간을 설정했습니다. 누구든지 CMTimeMakeWithSeconds에 preferredTimeScale 값을 설정하는 방법에 대한 아이디어가 있습니까?

답변

-1

트리밍 된 비디오 URL이 videoURL이라고 가정합니다. 동영상을 성공적으로 트리밍 한 후이 코드 스 니펫을 추가하십시오. 실제로이 코드 스 니펫은 각 초마다 트리밍 된 비디오에서 이미지를 추출하는 데 도움이됩니다 (즉, 트리밍 된 비디오의 지속 시간이 10 초인 경우이 코드는 매초마다 10 개의 이미지를 추출하고 이러한 모든 이미지가 배열에 저장되며, videoFrames). 마지막으로,이 이미지로 원하는대로 할 수 있습니다. 이 프로세스가 진행되는 동안 활동 표시기를 추가 할 수도 있습니다. 희망이 도움이됩니다. 당신의 응답을

var videoFrames = [UIImage]() 
let asset : AVAsset = AVAsset(url: videoURL as URL) 
let videoDuration = CMTimeGetSeconds(asset.duration) 
let integerValueOFVideoDuration = Int(videoDuration) 

//start activity indicator here 

for index in 0..<integerValueOFVideoDuration + 1 { 
    self.generateFrames(url: videoURL, fromTime: Float64(index)) 
} 

func generateFrames(url: NSURL, fromTime: Float64) { 
     if videoFrames.count == integerValueOFVideoDuration { 
      //end activity indicator here 
      return 
     } 
     let asset: AVAsset = AVAsset(url: url as URL) 
     let assetImgGenerate: AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 
     assetImgGenerate.maximumSize = CGSize(width: 300, height: 300) 
     assetImgGenerate.appliesPreferredTrackTransform = true 
     let time: CMTime = CMTimeMakeWithSeconds(fromTime, 600) 
     var img: CGImage? 
     do { 
      img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil) 
     } catch { 
     } 
     if img != nil { 
      let frameImg: UIImage = UIImage(cgImage: img!) 
      videoFrames.append(frameImg) 
     } else { 
      //return nil 
     } 
    } 
+0

덕분에, 나는 여기 난 단지 하나의 주요 동영상 URL 및 사용자가 슬라이더에서 최소 및 최대 값을 선택하는 범위 슬라이더를 가지고 .. 트림 동영상 URL이 없습니다. 해당 범위 값을 사용하여 축소판 이미지를 생성해야합니다. 어떤 제안이라도 ... 알 겠어? –

+0

ok ... 슬라이더의 최소값과 최대 값을 CMTimeMakeWithSeconds로 변환하고이 값을 위의 함수에 전달해야합니다. fromTime : Float64가 여기에있는 매개 변수입니다. –

+0

나를 코드로 보여줄 수 있습니까? CMTimeMake 값은 변경되었지만 항상 동일한 축소판이 변경되었습니다. –