最近xcodeを触り始めた初心者です。
動画撮影できるアプリを作成しようとしています。
下記のプログラムを参考にしようと考えているのですか、これはSwiftUIで記述しているのでしょうか?それともStoryboardで記述しているのでしょうか?ご回答頂けると嬉しいです。
https://qiita.com/daigou26/items/74bbdfce46db8898fb47[リンク内容]
使用環境:xcode11.6、swift5を使っています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
基本的にtsuki01さんご回答通り、参照されているコードは Swift + StroyBoard での開発です。
ただ、注意しなければならない点がいくつかあります。
##1.ページ末尾のソースコードの変数参照の誤りがあるのと、Swift5で引数が変更になったメソッドがあるので、それぞれ適切に変更する。
以下は改変後のソースです。
Swift
1import UIKit 2import AVFoundation 3import Photos 4 5class RecordViewController: UIViewController, AVCaptureFileOutputRecordingDelegate { 6 let fileOutput = AVCaptureMovieFileOutput() 7 8 var recordButton: UIButton! 9 var isRecording = false 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 setUpPreview() 15 } 16 17 func setUpPreview() { 18 let videoDevice = AVCaptureDevice.default(for: AVMediaType.video) 19 let audioDevice = AVCaptureDevice.default(for: AVMediaType.audio) 20 21 do { 22 if videoDevice == nil || audioDevice == nil { 23 throw NSError(domain: "device error", code: -1, userInfo: nil) 24 } 25 let captureSession = AVCaptureSession() 26 27 // video inputを capture sessionに追加 28 let videoInput = try AVCaptureDeviceInput(device: videoDevice!) 29 captureSession.addInput(videoInput) 30 31 // audio inputを capture sessionに追加 32 let audioInput = try AVCaptureDeviceInput(device: audioDevice!) 33 captureSession.addInput(audioInput) 34 35 // max 30sec 36 self.fileOutput.maxRecordedDuration = CMTimeMake(value: 30, timescale: 1) 37 captureSession.addOutput(fileOutput) 38 39 // プレビュー 40 let videoLayer : AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 41 videoLayer.frame = self.view.bounds 42 videoLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 43 self.view.layer.addSublayer(videoLayer) 44 45 captureSession.startRunning() 46 47 setUpButton() 48 } catch { 49 // エラー処理 50 } 51 } 52 53 func setUpButton() { 54 recordButton = UIButton(frame: CGRect(x: 0,y: 0,width: 120,height: 50)) 55 recordButton.backgroundColor = UIColor.gray 56 recordButton.layer.masksToBounds = true 57 recordButton.setTitle("録画開始", for: .normal) 58 recordButton.layer.cornerRadius = 20.0 59 recordButton.layer.position = CGPoint(x: self.view.bounds.width/2, y:self.view.bounds.height-50) 60 recordButton.addTarget(self, action: #selector(RecordViewController.onClickRecordButton(sender:)), for: .touchUpInside) 61 62 self.view.addSubview(recordButton) 63 } 64 65 @objc func onClickRecordButton(sender: UIButton) { 66 if !isRecording { 67 // 録画開始 68 let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 69 let documentsDirectory = paths[0] as String 70 let filePath : String? = "(documentsDirectory)/temp.mp4" 71 let fileURL : NSURL = NSURL(fileURLWithPath: filePath!) 72 fileOutput.startRecording(to: fileURL as URL, recordingDelegate: self) 73 74 isRecording = true 75 changeButtonColor(target: recordButton, color: UIColor.red) 76 recordButton.setTitle("録画中", for: .normal) 77 } else { 78 // 録画終了 79 fileOutput.stopRecording() 80 81 isRecording = false 82 changeButtonColor(target: recordButton, color: UIColor.gray) 83 recordButton.setTitle("録画開始", for: .normal) 84 } 85 } 86 87 func changeButtonColor(target: UIButton, color: UIColor) { 88 target.backgroundColor = color 89 } 90 91 func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { 92 // ライブラリへ保存 93 PHPhotoLibrary.shared().performChanges({ 94 PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: outputFileURL) 95 }) { completed, error in 96 if completed { 97 print("Video is saved!") 98 } 99 } 100 } 101}
##2.StoryBoard には、ViewController を一つだけ配置し、そのカスタムクラスを RecordViewController
に設定する。
カスタムクラスの設定がわからない、ということであれば、上記のソースコードのうち
Swift
1class RecordViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {
を
Swif
1class ViewController: UIViewController, AVCaptureFileOutputRecordingDelegate {
にすることでも解決します。
##3.プライバシーが強化されているため、ビデオ録画、音声録音、ならびにフォトライブラリへの保存については許可を出すように設定する。
これらの設定をわすれると、実行時にクラッシュします。
クラッシュした時に出てきたメッセージに沿って必要な設定を行えば良いのですが、基本的に次の3つの値を Info.plist に対して適切に設定します。
- Privacy - Camera Usage Description
- Privacy - Microphone Usage Description
- Privacy - Photo Library Usage Description
追加方法については、この辺りの前半の内容が参考になるのではないでしょうか。
##4.実機で動作させる
一番重要なことですが、実機でないと動かせません。
投稿2020/09/16 01:37
総合スコア5086
0
カスタムクラスの設定を行った後、全ての設定を見直して再度ビルドさせたらできました!ありがとうございました。
投稿2020/09/30 15:17
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SwiftUIが発表されたのが2019年6月で、その記事が書かれたのは2018年8月です。
投稿2020/09/16 01:31
総合スコア16733
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
文法的にStoryboardを利用して開発されているものと思います。
※以下リンク先の、SwiftUIの文法と比較すると異なる。
SwiftUIの文法 その1 View
投稿2020/09/16 01:10
総合スコア1751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/24 13:13
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/09/24 13:08
2020/09/24 13:21