日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 录音功能实现

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 录音功能实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

音頻基本知識

  • 采樣率(sampleRate)
    所謂采樣就是在時間軸上對信號進行數字化。根據奈奎斯特定理(也稱為采樣定理),按比聲音最高頻率高2倍以上的頻率對聲音進行采樣(也稱為AD轉換),對于高質量的音頻信號,其頻率范圍(人耳能夠聽到的頻率范圍)是20Hz~20kHz,所以采樣頻率一般為44.1kHz,這樣就可以保證采樣聲音達到20kHz也能被數字化,從而使得經過數字化處理之后,人耳聽到的聲音質量不會被降低。而所謂的44.1kHz就是代表1秒會采樣44100次。

  • 量化格式(sampleFormat)
    量化是指在幅度軸上對信號進行數字化,比如用16比特的二進制信號來表示聲音的一個采樣,而16比特(一個short)所表示的范圍是[-32768,32767],共有65536個可能取值,因此最終模擬的音頻信號在幅度上也分為了65536層

  • 聲道數(channel)
    聲道(Sound Channel) 是指聲音在錄制或播放時在不同空間位置采集或回放的相互獨立的音頻信號,所以聲道數也就是聲音錄制時的音源數量或回放時相應的揚聲器數量。

  • PCM
    通常所說的音頻的裸數據格式就是脈沖編碼調制(Pulse Code Modulation,PCM)數據。描述一段PCM數據一般需要以下幾個概念:量化格式(sampleFormat)、采樣率(sampleRate)、聲道數(channel)。以CD的音質為例:量化格式(有的地方描述為位深度)為16比特(2字節),采樣率為44100,聲道數為2,這些信息就描述了CD的音質。而對于聲音格式,還有一個概念用來描述它的大小,稱為數據比特率,即1秒時間內的比特數目,它用于衡量音頻數據單位時間內的容量大小。而對于CD音質的數據,比特率為多少呢?計算如下:
    44100 * 16 * 2 = 1378.125kbps

介紹幾種常用的壓縮編碼格式。

WAV編碼

PCM(通常所說的音頻的裸數據格式就是脈沖編碼調制(Pulse Code Modulation,PCM)數據),WAV編碼的一種實現(有多種實現方式,但是都不會進行壓縮操作)就是在PCM數據格式的前面加上44字節,分別用來描述PCM的采樣率、聲道數、數據格式等信息。

  • 特點:音質非常好,大量軟件都支持。
  • 適用場合:多媒體開發的中間文件、保存音樂和音效素材。

MP3編碼

MP3具有不錯的壓縮比,使用LAME編碼(MP3編碼格式的一種實現)的中高碼率的MP3文件,聽感上非常接近源WAV文件,當然在不同的應用場景下,應該調整合適的參數以達到最好的效果。

  • 特點:音質在128Kbit/s以上表現還不錯,壓縮比比較高,大量軟件和硬件都支持,兼容性好。
  • 適用場合:高比特率下對兼容性有要求的音樂欣賞。

AAC編碼

AAC是新一代的音頻有損壓縮技術,它通過一些附加的編碼技術(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE-AAC v2三種主要的編碼格式。LC-AAC是比較傳統的AAC,相對而言,其主要應用于中高碼率場景的編碼(≥80Kbit/s);HE-AAC(相當于AAC+SBR)主要應用于中低碼率場景的編碼(≤80Kbit/s);而新近推出的HE-AACv2(相當于AAC+SBR+PS)主要應用于低碼率場景的編碼(≤48Kbit/s)。事實上大部分編碼器都設置為≤48Kbit/s自動啟用PS技術,而>48Kbit/s則不加PS,相當于普通的HE-AAC。

  • 特點:在小于128Kbit/s的碼率下表現優異,并且多用于視頻中的音頻編碼。
  • 適用場合:128Kbit/s以下的音頻編碼,多用于視頻中音頻軌的編碼。

Ogg編碼

Ogg是一種非常有潛力的編碼,在各種碼率下都有比較優秀的表現,尤其是在中低碼率場景下。Ogg除了音質好之外,還是完全免費的,這為Ogg獲得更多的支持打好了基礎。Ogg有著非常出色的算法,可以用更小的碼率達到更好的音質,128Kbit/s的Ogg比192Kbit/s甚至更高碼率的MP3還要出色。但目前因為還沒有媒體服務軟件的支持,因此基于Ogg的數字廣播還無法實現。Ogg目前受支持的情況還不夠好,無論是軟件上的還是硬件上的支持,都無法和MP3相提并論。

  • 特點:可以用比MP3更小的碼率實現比MP3更好的音質,高中低碼率下均有良好的表現,兼容性不夠好,流媒體特性不支持。
  • 適用場合:語音聊天的音頻消息場景。

在info.plist 添加

<key>NSMicrophoneUsageDescription</key> <string>獲取麥克風權限</string>

向系統申請麥克風權限

AVCaptureDevice.requestAccess(for: AVMediaType.audio) {(granted: Bool) in}

封裝的簡單工具類

import AVFoundation/// 采樣率 enum AudioSampleRate:Int {case AudioSampleRate8KHZ = 8000case AudioSampleRate12KHZ = 12000case AudioSampleRate16KHZ = 16000case AudioSampleRate24KHZ = 24000case AudioSampleRate32KHZ = 32000 }///聲道數 enum AudioNumberOfChannels:Int {case AudioNumberOfChannelsOne = 1case AudioNumberOfChannelsTwo = 2 }///量化格式 enum AudioLinearPCMBitDepth:Int {case AudioLinearPCMBitDepthKey8 = 8case AudioLinearPCMBitDepthKey16 = 16case AudioLinearPCMBitDepthKey24 = 24case AudioLinearPCMBitDepthKey32 = 32 }enum AudioAuthorizationStatus: Int, CustomStringConvertible {case notDetermined = 0case notAuthorizedcase authorizedpublic var description: String {get {switch self {case .notDetermined:return "用戶沒有做選擇"case .notAuthorized:return "沒有獲得權限"case .authorized:return "獲得權限"}}} }class AudioManager:NSObject{static let shared = AudioManager()//采樣間隔var audioSetting:[String:Any] = [:]/// 設置編碼格式var formatKey:AudioFormatID = kAudioFormatLinearPCM/// 抽樣率var sampleRate:AudioSampleRate = .AudioSampleRate8KHZ/// 聲道數var numberOfChannels:AudioNumberOfChannels = .AudioNumberOfChannelsOne/// 位寬(量化格式)var linearPCMBitDepth:AudioLinearPCMBitDepth = .AudioLinearPCMBitDepthKey8/// 音頻權限var audioAuthorizationStatus:AudioAuthorizationStatus = .notDeterminedvar audioRecorder:AVAudioRecorder?var audioPlayer:AVAudioPlayer?private override init() {super.init()self.checkAudioAuthorization()} }extension AudioManager{func checkAudioAuthorization() {let status = AVCaptureDevice.authorizationStatus(for: AVMediaType.audio)switch status {case .notDetermined:self.audioAuthorizationStatus = .notDeterminedcase .restricted:self.audioAuthorizationStatus = .notAuthorizedcase .denied:self.audioAuthorizationStatus = .notAuthorizedcase .authorized:self.audioAuthorizationStatus = .authorized@unknown default:self.audioAuthorizationStatus = .notDetermined}}func requestAudioAuthorization(completionHandler:@escaping (AudioAuthorizationStatus)->()){AVCaptureDevice.requestAccess(for: AVMediaType.audio) {[weak self] (granted: Bool) inself?.audioAuthorizationStatus = granted ? .authorized : .notAuthorizedDispatchQueue.main.async {completionHandler((granted ? .authorized : .notAuthorized))}}} }extension AudioManager{func startRecorder(voiceUrl:URL) {guard self.audioAuthorizationStatus == .authorized else {self.requestAudioAuthorization { (status) -> () in}return}do {//[AVSampleRateKey:sampleRate,AVFormatIDKey:formatKey,AVNumberOfChannelsKey:numberOfChannels,AVLinearPCMIsFloatKey:linearPCMBitDepth]try audioRecorder = AVAudioRecorder.init(url: voiceUrl, settings:[AVFormatIDKey:formatKey] )try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.record)audioRecorder?.delegate = selfaudioRecorder?.isMeteringEnabled = trueguard let success = audioRecorder?.record()else{return}if success == true{print("開始錄音")}else{print("錄音失敗")}} catch _ {print("錄音異常")}}func pauseRecorderAudio() {audioRecorder?.pause()print("暫停錄音")}func stopRecorderAudio(){audioRecorder?.stop()print("停止錄音")} }extension AudioManager{func playAudio(voiceUrl:URL){do {try audioPlayer = AVAudioPlayer.init(contentsOf:voiceUrl)try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)audioPlayer?.delegate = selfguard let success = audioPlayer?.play() else {return}if success == true {print("開始播放")}else{print("開始播放失敗")}} catch _{print("播放異常")}}func audioPause() {audioPlayer?.pause()print("暫停播放")}func audioStop() {audioPlayer?.stop()print("停止播放")} }extension AudioManager:AVAudioRecorderDelegate{func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) {}func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {} }extension AudioManager:AVAudioPlayerDelegate{func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {}func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {} }

總結

以上是生活随笔為你收集整理的iOS 录音功能实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丁香av | 久热超碰| aaaa毛片| 亚洲无码久久久久久久 | 高潮毛片又色又爽免费 | 色播五月婷婷 | 女女h百合无遮羞羞漫画软件 | 国产免费脚交足视频在线观看 | 男人桶女人桶爽30分钟 | 日韩黄色片在线观看 | 在线国产黄色 | 亚洲天堂精品视频 | 日韩成人免费视频 | 欧美精品免费一区二区 | 黄色高清在线观看 | 国产免费无码一区二区 | 国产亚洲网站 | 日本黄a三级三级三级 | free女性xx性老大太 | 在线视频自拍 | 欧美成人精品一区二区男人小说 | 中国黄色a级 | 欧美黄色大片免费看 | 欧美做爰性生交视频 | 性色av免费观看 | 三级福利 | 成人黄色网址在线观看 | 午夜寂寞院 | 91欧美大片 | 痴女扩张宫交脱垂重口小说 | 夜夜撸av | 亚洲欧美在线综合 | 99色精品| 欧美大片免费高清观看 | 在线视频导航 | 色网视频 | 强迫凌虐淫辱の牝奴在线观看 | 熟女人妻aⅴ一区二区三区60路 | 日韩一区欧美一区 | 丝袜美女啪啪 | 亚洲精品国产精品国自产在线 | 国产无遮挡又黄又爽在线观看 | 在线国产不卡 | 91麻豆国产视频 | 男女日屁视频 | 亚州色图欧美色图| 天天操操| 丰满秘书被猛烈进入高清播放在 | 9久久9毛片又大又硬又粗 | 一区二区三区爱爱 | 美女福利视频网 | 在线天堂www在线国语对白 | 玖色视频| 欧美在线观看一区二区 | 成人免费视频网址 | 波多野在线播放 | 97精品熟女少妇一区二区三区 | b站大片免费直播 | 久久99精品久久久久 | 怡红院亚洲 | 无套白嫩进入乌克兰美女 | 国产又黄又粗又猛又爽 | 国产精品污www一区二区三区 | 97久久久久久久久久 | 麻豆69xxnxxporn | 91精品大片 | 久久久久无码国产精品一区李宗瑞 | 亚洲天堂网络 | 99久久综合网 | 一区二区三区在线观看免费 | 亚洲综合不卡 | 污网在线看 | 九七电影院97理论片 | 日本h在线观看 | 高清欧美性猛交xxxx | 国产视频精品久久 | 国产精品永久免费视频 | 在线观看特色大片免费网站 | 日本精品一区二区视频 | 日本中文字幕网 | 艳母在线视频 | 国产大片一区二区三区 | 一区二区三区在线免费视频 | 一级片在线免费 | 草莓视频在线观看18 | 午夜福利毛片 | 日批视屏 | 韩日一区二区 | av手机免费看 | 污视频免费在线观看网站 | 青青草国产在线播放 | 麻豆系列 | 五月激情综合网 | 婷婷深爱五月 | 97精品人人a片免费看 | 久草免费福利视频 | 97香蕉久久超级碰碰高清版 | 中文成人无字幕乱码精品区 | 国产精品天天操 |