発生している問題・エラーメッセージ
下記のソースコードで動画から静止画を切り出して保存しようとしているのですが、
切り出した静止画が200枚を超えたあたりでアプリが例外を起こすことなく落ちてしまします
恐らくメモリーリークだとは思っているのですが、どこをどう直せばよいのかが分かりません。
該当のソースコード
C#
1float framerate = 15; 2 3var asset = new AVUrlAsset(movieFileUrl); 4float increment = asset.Duration.TimeScale / framerate; 5float frameMax = asset.Duration.Value / increment; 6 7var imageGenerator = new AVAssetImageGenerator(asset) 8{ 9 AppliesPreferredTrackTransform = true, 10 RequestedTimeToleranceBefore = CMTime.Zero, 11 RequestedTimeToleranceAfter = CMTime.Zero 12}; 13 14var requests = new List<NSValue>(); 15for (var count = 0f; count < asset.Duration.Value; count += increment) 16{ 17 var time = new CMTime((long)count, asset.Duration.TimeScale); 18 var val = NSValue.FromCMTime(time); 19 requests.Add(val); 20} 21 22var documentsDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 23var cacheDir = Path.Combine(documentsDir, "..", "Library", "Caches"); 24 25int fileIndex = 0; 26 27imageGenerator.GenerateCGImagesAsynchronously( 28 requests.ToArray(), 29 new AVAssetImageGeneratorCompletionHandler( 30 (requestedTime, imageRef, actualTime, result, error) => 31 { 32 var fileName = $"{fileIndex:D6}.jpg"; 33 var savePath = Path.Combine(cacheDir, fileName); 34 35 using(CGImage cgImage = new CGImage(imageRef)) 36 using(UIImage saveImage = new UIImage(cgImage)) 37 // using(NSData data = saveImage.AsJPEG((nfloat)1.0)) // この行のコメントアウトを外すと落ちるようになります 38 { 39 // data.Save(savePath, true); 40 } 41 42 fileIndex++; 43 }));
試したこと
- UIImage を作るところまでなら切り出す数が増えても落ちませんでした(4000枚ほどまでは確認)
- Save() の行はコメントアウトしたままで、AsJPEG() の行のコメントアウトを外すと、例外が起きることなくアプリが落ちます
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Professional 2017 Version 15.7.5
Xamarin 4.10.10.2
Xamarin.iOS and Xamarin.Mac SDK 11.12.0.4
あなたの回答
tips
プレビュー