Skip to content

Commit 5d0d0f4

Browse files
author
Cesar Vargas Casaseca
committed
Record also app audio
1 parent 5f21f66 commit 5d0d0f4

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed

Wyler/SampleApp/MP3Sample.mp3

746 KB
Binary file not shown.

Wyler/SampleApp/ViewController.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Foundation
1010
import UIKit
1111
import QuartzCore
1212
import Wyler
13+
import AVFoundation
1314

1415
final class ViewController: UIViewController {
1516
@IBOutlet weak var bouncingBall: UIView!
@@ -18,6 +19,7 @@ final class ViewController: UIViewController {
1819
@IBOutlet weak var cameraRollSwitch: UISwitch!
1920
@IBOutlet weak var cameraRollLabel: UILabel!
2021

22+
private var player: AVAudioPlayer?
2123
private let screenRecorder = ScreenRecorder()
2224

2325
override func viewDidLoad() {
@@ -40,13 +42,30 @@ final class ViewController: UIViewController {
4042
@IBAction func startRecordingButtonWasPressed(_ sender: Any) {
4143
enableElements(isRecording: true)
4244

45+
playSound()
4346
animateBall()
4447

4548
screenRecorder.startRecording(saveToCameraRoll: cameraRollSwitch.isOn, errorHandler: { error in
4649
debugPrint("Error when recording \(error)")
4750
})
4851
}
4952

53+
private func playSound() {
54+
guard let url = Bundle.main.url(forResource: "MP3Sample", withExtension: "mp3") else { return }
55+
56+
do {
57+
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
58+
try AVAudioSession.sharedInstance().setActive(true)
59+
60+
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
61+
62+
player?.play()
63+
64+
} catch let error {
65+
print(error.localizedDescription)
66+
}
67+
}
68+
5069
private func enableElements(isRecording: Bool) {
5170
startRecordingButton.isEnabled = !isRecording
5271
stopRecordingButton.isEnabled = isRecording

Wyler/Wyler.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
370DA4EA244367A700BAB2B7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370DA4E9244367A700BAB2B7 /* ViewController.swift */; };
1818
370DA4EC2443710500BAB2B7 /* Wyler.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 370DA4C12440D8C300BAB2B7 /* Wyler.framework */; };
1919
370DA4ED2443710500BAB2B7 /* Wyler.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 370DA4C12440D8C300BAB2B7 /* Wyler.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
20+
37B519B7244C71D30048B034 /* MP3Sample.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 37B519B6244C71D30048B034 /* MP3Sample.mp3 */; };
2021
/* End PBXBuildFile section */
2122

2223
/* Begin PBXContainerItemProxy section */
@@ -56,6 +57,7 @@
5657
370DA4E42440D96900BAB2B7 /* ScreenRecorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenRecorder.swift; sourceTree = "<group>"; };
5758
370DA4E72443678400BAB2B7 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
5859
370DA4E9244367A700BAB2B7 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
60+
37B519B6244C71D30048B034 /* MP3Sample.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = MP3Sample.mp3; sourceTree = "<group>"; };
5961
/* End PBXFileReference section */
6062

6163
/* Begin PBXFrameworksBuildPhase section */
@@ -109,6 +111,7 @@
109111
370DA4D12440D8DA00BAB2B7 /* SampleApp */ = {
110112
isa = PBXGroup;
111113
children = (
114+
37B519B6244C71D30048B034 /* MP3Sample.mp3 */,
112115
370DA4E9244367A700BAB2B7 /* ViewController.swift */,
113116
370DA4E72443678400BAB2B7 /* Main.storyboard */,
114117
370DA4D22440D8DA00BAB2B7 /* AppDelegate.swift */,
@@ -238,6 +241,7 @@
238241
buildActionMask = 2147483647;
239242
files = (
240243
370DA4DF2440D8DE00BAB2B7 /* LaunchScreen.storyboard in Resources */,
244+
37B519B7244C71D30048B034 /* MP3Sample.mp3 in Resources */,
241245
370DA4DC2440D8DE00BAB2B7 /* Preview Assets.xcassets in Resources */,
242246
370DA4D92440D8DE00BAB2B7 /* Assets.xcassets in Resources */,
243247
370DA4E82443678400BAB2B7 /* Main.storyboard in Resources */,

Wyler/Wyler/ScreenRecorder.swift

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ final public class ScreenRecorder {
1818
private var videoOutputURL: URL?
1919
private var videoWriter: AVAssetWriter?
2020
private var videoWriterInput: AVAssetWriterInput?
21-
private var audioWriterInput: AVAssetWriterInput?
21+
private var micAudioWriterInput: AVAssetWriterInput?
22+
private var appAudioWriterInput: AVAssetWriterInput?
2223
private var saveToCameraRoll = false
2324
let recorder = RPScreenRecorder.shared()
2425

@@ -40,7 +41,8 @@ final public class ScreenRecorder {
4041
errorHandler: @escaping (Error) -> Void) {
4142
createVideoWriter(in: outputURL, error: errorHandler)
4243
addVideoWriterInput(size: size)
43-
addAudioWriterInput()
44+
self.micAudioWriterInput = createAndAddAudioInput()
45+
self.appAudioWriterInput = createAndAddAudioInput()
4446
startCapture(error: errorHandler)
4547
}
4648

@@ -89,8 +91,8 @@ final public class ScreenRecorder {
8991
newVideoWriterInput.expectsMediaDataInRealTime = true
9092
videoWriter?.add(newVideoWriterInput)
9193
}
92-
93-
private func addAudioWriterInput() {
94+
95+
private func createAndAddAudioInput() -> AVAssetWriterInput {
9496
let settings = [
9597
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
9698
AVSampleRateKey: 12000,
@@ -99,10 +101,11 @@ final public class ScreenRecorder {
99101
]
100102

101103
let audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: settings)
102-
self.audioWriterInput = audioInput
103104

104105
audioInput.expectsMediaDataInRealTime = true
105106
videoWriter?.add(audioInput)
107+
108+
return audioInput
106109
}
107110

108111
private func startCapture(error: @escaping (Error) -> Void) {
@@ -115,10 +118,10 @@ final public class ScreenRecorder {
115118
switch sampleType {
116119
case .video:
117120
self.handleSampleBuffer(sampleBuffer: sampleBuffer)
118-
case .audioApp, .audioMic:
119-
if self.audioWriterInput?.isReadyForMoreMediaData ?? false {
120-
self.audioWriterInput?.append(sampleBuffer)
121-
}
121+
case .audioApp:
122+
self.add(sample: sampleBuffer, to: self.appAudioWriterInput)
123+
case .audioMic:
124+
self.add(sample: sampleBuffer, to: self.micAudioWriterInput)
122125
default:
123126
break
124127
}
@@ -134,6 +137,12 @@ final public class ScreenRecorder {
134137
self.videoWriterInput?.append(sampleBuffer)
135138
}
136139
}
140+
141+
private func add(sample: CMSampleBuffer, to writerInput: AVAssetWriterInput?) {
142+
if writerInput?.isReadyForMoreMediaData ?? false {
143+
writerInput?.append(sample)
144+
}
145+
}
137146

138147
/**
139148
Stops recording the content of the application screen, after calling startRecording
@@ -148,7 +157,8 @@ final public class ScreenRecorder {
148157
})
149158

150159
self.videoWriterInput?.markAsFinished()
151-
self.audioWriterInput?.markAsFinished()
160+
self.micAudioWriterInput?.markAsFinished()
161+
self.appAudioWriterInput?.markAsFinished()
152162
self.videoWriter?.finishWriting {
153163
self.saveVideoToCameraRollAfterAuthorized(errorHandler: errorHandler)
154164
}

0 commit comments

Comments
 (0)