我从设备屏幕录制视频,并希望添加动态图标,该图标并行显示您的声音。对于此任务,我需要获取麦克风输入的音量级别,但是当我开始获取值(tracker.amplitude)时,来自麦克风的声音就不再录制到视频了。
对于屏幕录制,我使用ReplayKit框架和广播扩展类。 在扩展名中,我有用于录制的此类和设置:
class SampleHandler: RPBroadcastSampleHandler {
var videoWriterInput: AVAssetWriterInput!
var microphoneWriterInput: AVAssetWriterInput!
var videoWriter: AVAssetWriter!
override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
guard !isRecording else { return }
isRecording = true
sessionBeginAtSourceTime = nil
setUpWriter()
}
func setUpWriter() {
let width = UIScreen.main.bounds.width * 2
let height = UIScreen.main.bounds.height * 2
self.outputFileLocation = videoFileLocation()
// Add the video input
videoWriter = try? AVAssetWriter.init(outputURL: self.outputFileLocation, fileType: AVFileType.mp4)
let videoCompressionPropertys = [
AVVideoAverageBitRateKey: width * height * 10.1
]
let videoSettings: [String: Any] = [
AVVideoCodecKey: AVVideoCodecType.h264,
AVVideoWidthKey: width,
AVVideoHeightKey: height,
AVVideoCompressionPropertiesKey: videoCompressionPropertys
]
videoWriterInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: videoSettings)
videoWriterInput.expectsMediaDataInRealTime = true
// Add the microphone input
var acl = AudioChannelLayout()
memset(&acl, 0, MemoryLayout<AudioChannelLayout>.size)
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
let audioOutputSettings: [String: Any] =
[ AVFormatIDKey: kAudioFormatMPEG4AAC,
AVSampleRateKey : 44100,
AVNumberOfChannelsKey : 1,
AVEncoderBitRateKey : 64000,
AVChannelLayoutKey : Data(bytes: &acl, count: MemoryLayout<AudioChannelLayout>.size)]
microphoneWriterInput = AVAssetWriterInput(mediaType: AVMediaType.audio, outputSettings: audioOutputSettings)
microphoneWriterInput.expectsMediaDataInRealTime = true
if videoWriter.canAdd(videoWriterInput) {
videoWriter.add(videoWriterInput)
}
if videoWriter.canAdd(microphoneWriterInput) {
videoWriter.add(microphoneWriterInput)
}
videoWriter.startWriting()
}
在我的应用中,我尝试使用AudioKit获取输入语音音量:
var timer: Timer!
func startMicrophoneListening() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(refreshAudioView(_:)), userInfo: nil, repeats: true)
}
var mic: AKMicrophone?
var micCopy2: AKBooster!
var tracker: AKFrequencyTracker!
@objc internal func refreshAudioView(_:Timer) {
if mic == nil {
do {
mic = AKMicrophone()
micCopy2 = AKBooster(mic)
if let inputs = AudioKit.inputDevices {
try AudioKit.setInputDevice(inputs[1])
try mic!.setDevice(inputs[1])
}
tracker = AKFrequencyTracker(micCopy2, hopSize: 4_096, peakCount: 20)
let silence = AKBooster(tracker, gain: 0)
AudioKit.output = silence
try AudioKit.start()
} catch {
print("error")
}
}
print(tracker.amplitude)
}
}
任何提示我都会很高兴。