• iOS之音频录制及播放


    https://www.jianshu.com/p/fb7dfb033989

    https://blog.csdn.net/u014084081/article/details/89027144

    https://blog.csdn.net/crazy_sunshine/article/details/93715973

    1)Demo环境:

    Swift4.2,

    Xcode10.1

    2)Demo地址:

    https://github.com/cxymq/RecordForChat

    3)AVAudioSession学习记录

    https://blog.csdn.net/Crazy_SunShine/article/details/80104838

    步骤如下:

    1.需要申请麦克风权限

    2.调用 AVFoundation 的API 

    主要用到 AVAudioRecorder(录音) 、AVAudioPlayer(播放)、AVAudioSession(设置音频硬件设备)

    录音开始前,先检测权限,如果允许,则设置音频硬件设备:

    audioS.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
    audioS.setActive(true, options: AVAudioSession.SetActiveOptions.init(rawValue: 0))

    设置存放路径:

    1.  
      letpath: String= (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?? nil)!
    2.  
       
    3.  
      let order = voiceList.count as Int
    4.  
       
    5.  
      let namePath = "/Record(String(describing: order)).wav"
    6.  
       
    7.  
      let voiceFilePath = path.appending(namePath)

    进行录音设置:

    (详情见附录1)

    1.  
      letrecordSetting = [
    2.  
       
    3.  
      AVFormatIDKey: kAudioFormatLinearPCM,
    4.  
       
    5.  
      AVSampleRateKey: 8000.0,
    6.  
       
    7.  
      AVNumberOfChannelsKey: 1,
    8.  
       
    9.  
      AVLinearPCMBitDepthKey: 16,
    10.  
       
    11.  
      AVLinearPCMIsNonInterleaved: false,
    12.  
       
    13.  
      AVLinearPCMIsFloatKey: false,
    14.  
       
    15.  
      AVLinearPCMIsBigEndianKey: false
    16.  
       
    17.  
      ] as [String : Any]

    然后调用 record() 开始录音。

    播放录音,只需要提供音频路径,调用 play() 即可。

     附录:

    1.录音设置标注(参考:https://www.jianshu.com/p/692304a8fc95

    AVFormatIDKey

    录音的文件格式

    CF_ENUM(AudioFormatID)

    {

        kAudioFormatLinearPCM               = 'lpcm',

        kAudioFormatAC3                     = 'ac-3',

        kAudioFormat60958AC3                = 'cac3',

        kAudioFormatAppleIMA4               = 'ima4',

        kAudioFormatMPEG4AAC                = 'aac ',

        kAudioFormatMPEG4CELP               = 'celp',

        kAudioFormatMPEG4HVXC               = 'hvxc',

        kAudioFormatMPEG4TwinVQ             = 'twvq',

        kAudioFormatMACE3                   = 'MAC3',

        kAudioFormatMACE6                   = 'MAC6',

        kAudioFormatULaw                    = 'ulaw',

        kAudioFormatALaw                    = 'alaw',

        kAudioFormatQDesign                 = 'QDMC',

        kAudioFormatQDesign2                = 'QDM2',

        kAudioFormatQUALCOMM                = 'Qclp',

        kAudioFormatMPEGLayer1              = '.mp1',

        kAudioFormatMPEGLayer2              = '.mp2',

        kAudioFormatMPEGLayer3              = '.mp3',

        kAudioFormatTimeCode                = 'time',

        kAudioFormatMIDIStream              = 'midi',

        kAudioFormatParameterValueStream    = 'apvs',

        kAudioFormatAppleLossless           = 'alac',

        kAudioFormatMPEG4AAC_HE             = 'aach',

        kAudioFormatMPEG4AAC_LD             = 'aacl',

        kAudioFormatMPEG4AAC_ELD            = 'aace',

        kAudioFormatMPEG4AAC_ELD_SBR        = 'aacf',

        kAudioFormatMPEG4AAC_ELD_V2         = 'aacg',   

        kAudioFormatMPEG4AAC_HE_V2          = 'aacp',

        kAudioFormatMPEG4AAC_Spatial        = 'aacs',

        kAudioFormatAMR                     = 'samr',

        kAudioFormatAMR_WB                  = 'sawb',

        kAudioFormatAudible                 = 'AUDB',

        kAudioFormatiLBC                    = 'ilbc',

        kAudioFormatDVIIntelIMA             = 0x6D730011,

        kAudioFormatMicrosoftGSM            = 0x6D730031,

        kAudioFormatAES3                    = 'aes3',

        kAudioFormatEnhancedAC3             = 'ec-3',

        kAudioFormatFLAC                    = 'flac',

        kAudioFormatOpus                    = 'opus'

    };

    • kAudioFormatLinearPCM: 音频的原始文件(caf)

    • kAudioFormatMPEG4AAC: aac文件格式的音频

    注意

    文件格式不可以直接.mp3格式,会报错

    AVSampleRateKey

    采用率(赫兹)``

    常用的有

    • 8,000 Hz: 电话所用采样率, 对于人的说话已经足够

    • 11,025 Hz: 说话

    参考文章:

    https://baike.baidu.com/item/%E9%9F%B3%E9%A2%91%E9%87%87%E6%A0%B7%E7%8E%87/9023551

    AVNumberOfChannelsKey

    采用通道数,一般有:

    • 1: 单声道

    • 2: 双声道

    linear PCM keys

    AVLinearPCMBitDepthKey

    采样深度,影响声音质量,比如从caf转mp3,如果设置为8的话,声音可能会失真,需要设置更高一点(比如16)

    取值有: 8, 16, 24, 32

    AVLinearPCMIsBigEndianKey

    • YES: 大端模式

    • NO: 小端模式

    参考文章:

    https://blog.csdn.net/chivalrousli/article/details/38419995

    AVLinearPCMIsFloatKey

    是否支持浮点处理

    AVLinearPCMIsNonInterleaved

    交叉的

    audio file type key11.0 之后

    AVAudioFileTypeKey

    AudioFile.h文件中可以查看具体的

    encoder property keys

    编码属性

    AVEncoderAudioQualityKey

    编码质量

    取值有:

    typedef NS_ENUM(NSInteger, AVAudioQuality) {

        AVAudioQualityMin    = 0,

        AVAudioQualityLow    = 0x20,

        AVAudioQualityMedium = 0x40,

        AVAudioQualityHigh   = 0x60,

        AVAudioQualityMax    = 0x7F

    };

    AVEncoderAudioQualityForVBRKey

    动态比特率,取值是 AVAudioQuality,只和AVAudioBitRateStrategy_Variable有关

    AVEncoderBitRateKey

    编码比特率

    注意

    AVEncoderBitRateKey和AVEncoderBitRatePerChannelKey只需要设置一个 ;only one of AVEncoderBitRateKey and AVEncoderBitRatePerChannelKey should be provided.

    AVEncoderBitRatePerChannelKey

    每个声道的比特率

    AVEncoderBitRateStrategyKey

    编码比特率的策略

    取值有:

    /* values for AVEncoderBitRateStrategyKey */

    AVF_EXPORT NSString *const AVAudioBitRateStrategy_Constant              NS_AVAILABLE(10_9, 7_0);

    AVF_EXPORT NSString *const AVAudioBitRateStrategy_LongTermAverage       NS_AVAILABLE(10_9, 7_0);

    AVF_EXPORT NSString *const AVAudioBitRateStrategy_VariableConstrained   NS_AVAILABLE(10_9, 7_0);

    AVF_EXPORT NSString *const AVAudioBitRateStrategy_Variable              NS_AVAILABLE(10_9, 7_0);

    AVEncoderBitDepthHintKey

    取值 8 to 32

    -----------------------------------------------------------

    个人博客:https://blog.csdn.net/Crazy_SunShine

    Github:https://github.com/cxymq

    个人公众号:Flutter小同学

    个人网站:http://chenhui.today/
    --------------------- 

  • 相关阅读:
    三、瀑布流中的ajax请求详解 Confi
    显示GridControl的横向滚动条
    耳目一新的感觉(转)
    JavaScript学习笔记——变量,作用域和内存管理
    Servlet编程笔记
    JavaScript,应该选择内嵌形式还是外链形式(Inline Code Versus External Files)
    JavaScript学习笔记——Javascript基本语法
    为主机空间添加一个phpmyadmin
    关于Post中明文传送密码以及其他
    Maven原理和Maven2新特性
  • 原文地址:https://www.cnblogs.com/itlover2013/p/14414236.html
Copyright © 2020-2023  润新知