前提・実現したいこと
録画撮影アプリの撮影開始兼停止UIbuttonに撮影開始のサウンド、停止のサウンドをつけたいです。
インターネット等でUIbuttonのサウンドについて調べたのですが、storyboard上にUIbuttronを配置されている方の記事しか見つかりませんでした。当方コードによってボタンを配置していて、その方法に該当する記事を見つけることができませんでした。
発生している問題・エラーメッセージ
撮影自体は問題なく行えています。
該当のソースコード
Swift
1import UIKit 2import AVFoundation 3import Photos 4 5class ViewController: 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(ViewController.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} 102
試したこと
特に試せてないです。申し訳ないです。
補足情報(FW/ツールのバージョンなど)
swiftr5 Xcode12.01
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/20 03:20