質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

827閲覧

AVURLAsset で読み込んだ動画をフォトライブラリに保存したい

gtime

総合スコア51

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/17 05:29

編集2017/08/18 08:04

swift

1import UIKit 2import AVFoundation 3import Photos 4class ViewController: UIViewController { 5 6 var videoPlayerView = AVPlayerLayer() 7 var videoPlayer = AVPlayer() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 let urldata = NSURL(string: "https://video.twimg.com/tweet_video/DHYvduMUQAE-DLc.mp4") 12 13 let avAsset = AVURLAsset(url: urldata! as URL) 14 // AVPlayerに再生させるアイテムを生成. 15 let playerItem = AVPlayerItem(asset: avAsset) 16 // AVPlayerを生成. 17 self.videoPlayer = AVPlayer(playerItem: playerItem) 18 19 self.videoPlayerView.frame = CGRect(x:0, y:0, width:self.view.bounds.width, height:self.view.bounds.height - 44 ) 20 21 22 // UIViewのレイヤーをAVPlayerLayerにする. 23 let layer = self.videoPlayerView 24 layer.videoGravity = AVLayerVideoGravityResizeAspect 25 layer.player = self.videoPlayer 26 27 // レイヤーを追加する. 28 self.view.layer.addSublayer(layer) 29 self.videoPlayer.play() 30 31 32 let exportPath: NSString = NSTemporaryDirectory().appendingFormat("video.mov") 33 let exportUrl: NSURL = NSURL.init(fileURLWithPath: exportPath as String) 34 print(exportUrl) 35 let exporter = AVAssetExportSession(asset: avAsset, presetName: AVAssetExportPresetHighestQuality) 36 exporter?.outputURL = exportUrl as URL 37 exporter?.shouldOptimizeForNetworkUse = true 38 exporter?.outputFileType = AVFileTypeQuickTimeMovie 39 40 exporter?.exportAsynchronously(completionHandler: { 41 if exporter?.status == AVAssetExportSessionStatus.completed { 42 PHPhotoLibrary.shared().performChanges({ 43 PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: exportUrl as URL) 44 }) { saved, error in 45 if saved { 46 let alertController = UIAlertController(title: "Your video was successfully saved", message: nil, preferredStyle: .alert) 47 let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil) 48 alertController.addAction(defaultAction) 49 self.present(alertController, animated: true, completion: nil) 50 } else { 51 print("エラー") 52 } 53 } 54 } else { 55 print(exporter?.error.debugDescription) 56 } 57 }) 58 } 59} 60

AVURLAsset で読み込んだ動画をフォトライブラリに保存したいのでこのコードを書いたのですがエラーと出力されフォトライブラリへの保存がうまくいきません。

エラー内容 Optional("Optional(Error Domain=AVFoundationErrorDomain Code=-11838 "Operation Stopped" UserInfo={NSUnderlyingError=0x6000000595f0 {Error Domain=NSOSStatusErrorDomain Code=-12109 "(null)"}, NSLocalizedFailureReason=The operation is not supported for this media., NSLocalizedDescription=Operation Stopped})")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

AVAssetExportSessionを作成しただけでは書き出しは行われないです。そのあと
exportAsynchronously(completionHandler:) を実行することで実際の書き出しが行われます。

フォトライブラリへの保存はその書き出し完了後に行う必要があるのでconpletionHandlerの中に記述することになりますね。

蛇足ですが、エラーが出た場合は単に「エラーが出ます」ではなく、エラーメッセージも添えた方が良いかと思います。

投稿2017/08/17 09:35

YokemuraTakeshi

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問