2017-03-08 24 views
0

ビデオからすべてのフレームを取得するには私はthis codeに従っています。このリンクでは、特定の時間にフレームを取得しようとしています。しかし、私はすべてのフレームを取得する必要があります。ここに私のコードです...スウィフト - ビデオからすべてのフレームを取得

var mutableVideoURL = NSURL() 
var videoFrames = [UIImage]() 

let asset : AVAsset = AVAsset(url: self.mutableVideoURL as URL) 
let mutableVideoDuration = CMTimeGetSeconds(asset.duration) 
print("-----Mutable video duration = \(mutableVideoDuration)") 
let mutableVideoDurationIntValue = Int(mutableVideoDuration) 
print("-----Int value of mutable video duration = \(mutableVideoDurationIntValue)") 

for index in 0..<mutableVideoDurationIntValue { 
    self.generateFrames(url: self.mutableVideoURL, fromTime: Float64(index)) 
} 

    func generateFrames(url : NSURL, fromTime:Float64) { 
     let asset: AVAsset = AVAsset(url: url as URL) 
     let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 
     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!) 
      UIImageWriteToSavedPhotosAlbum(frameImg, nil, nil, nil)//I saved here to check 
      videoFrames.append(frameImg) 
      print("-----Array of video frames *** \(videoFrames)") 
     } else { 
       print("error !!!") 
     } 
    } 

私はこのビデオを2ビデオでテストしました(ビデオの長さは5秒と3.45分です)。このコードは短い時間(ビデオ長さ:5秒)と長時間(ビデオ長:3.45分)で完璧に動作し、NSLogはを表示します。デバッガからのメッセージ:メモリの問題により終了しました

+0

エラーは何ですか? print(error.localizedDescription)をcatchに入れることができます – WeiJay

+0

デバッガからのメッセージ:メモリの問題により終了しました:( –

+0

メモリにフレームが多すぎるため、クラッシュすることになります。より少ないメモリ集約的な方法で画像を通す。 – Harish

答えて

0

Appleはメソッドを使用することをお勧めします以上の1つのフレームを生成する: generateCGImagesAsynchronously(forTimes:completionHandler:)

あなたの現在のアプローチに従うことを好む場合でも、あなたはメモリの使用量を減らすために何ができるの改善のカップルがあります:

  • AVAssetAVAssetImageGeneratorをループ内でインスタンス化しています。これらを一度だけインスタンス化し、generateFramesメソッドに送信できます。
  • あなたは余分なメモリを取る写真 アルバム、内のすべてのフレームを保存しているので、ライン

    UIImageWriteToSavedPhotosAlbum(frameImg, nil, nil, nil)//I saved here to check

    を削除します。

最終的な結果は次のようになります。

var videoFrames:[UIImage] = [UIImage] 
let asset:AVAsset = AVAsset(url:self.mutableVideoURL as URL) 
let assetImgGenerate:AVAssetImageGenerator = AVAssetImageGenerator(asset:asset) 
assetImgGenerate.appliesPreferredTrackTransform = true 
let duration:Float64 = CMTimeGetSeconds(asset.duration) 
let durationInt:Int = Int(mutableVideoDuration) 

for index:Int in 0 ..< durationInt 
{ 
    generateFrames(
     assetImgGenerate:assetImgGenerate, 
     fromTime:Float64(index)) 
} 

func generateFrames(
    assetImgGenerate:AVAssetImageGenerator, 
    fromTime:Float64) 
{ 
    let time:CMTime = CMTimeMakeWithSeconds(fromTime, 600) 
    let cgImage:CGImage? 

    do 
    { 
     cgImage = try assetImgGenerate.copyCGImage(at:time, actualTime:nil) 
    } 
    catch 
    { 
     cgImage = nil 
    } 

    guard 

     let img:CGImage = cgImage 

    else 
    { 
     continue 
    } 

    let frameImg:UIImage = UIImage(cgImage:img) 
    videoFrames.append(frameImg) 
} 
関連する問題