如何解决从麦克风输入获取语音音量
我从设备屏幕录制视频,并希望添加动态图标,该图标并行显示您的声音。对于此任务,我需要获取麦克风输入的音量级别,但是当我开始获取值(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,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)
}
}
任何提示我都会很高兴。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。