• 作用
    AVPLayer:可以用来播放在线及本地音视频
    AVAudioSession:音频会话,主要用来管理音频设置与硬件交互
    使用时需要导入
#import <AVFoundation/AVFoundation.h>
  • AVAudioSession中配置选项:
AVAudioSessionCategory
注意:除了 AVAudioSessionCategoryMultiRoute 外,其他的 Category 都遵循 last in wins 原则,即最后接入的音频设备作为输入或输出的主设备。
1.AVAudioSessionCategoryAmbient
当前App的播放声音可以和其他app播放的声音共存,当锁屏或按静音时停止。 2.AVAudioSessionCategorySoloAmbient
只能播放当前App的声音,其他app的声音会停止,当锁屏或按静音时停止。 3.AVAudioSessionCategoryPlayback
只能播放当前App的声音,其他app的声音会停止,当锁屏或按静音时不会停止。 4.AVAudioSessionCategoryRecord
只能用于录音,其他app的声音会停止,当锁屏或按静音时不会停止 5.AVAudioSessionCategoryPlayAndRecord
在录音的同时播放其他声音,当锁屏或按静音时不会停止
可用于听筒播放,比如微信语音消息听筒播放 6.AVAudioSessionCategoryAudioProcessing
使用硬件解码器处理音频,该音频会话使用期间,不能播放或录音 7.AVAudioSessionCategoryMultiRoute
多种音频输入输出,例如可以耳机、USB设备同时播放等
AVAudioSessionCategoryOptions
1.AVAudioSessionModeDefault
默认的模式,适用于所有的场景,可用于场景还原 2.AVAudioSessionModeVoiceChat
适用类别 :
AVAudioSessionCategoryPlayAndRecord
应用场景VoIP 3.AVAudioSessionModeGameChat
适用类别:
AVAudioSessionCategoryPlayAndRecord
应用场景游戏录制,由GKVoiceChat自动设置,无需手动调用 4.AVAudioSessionModeVideoRecording
适用类别:
AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryRecord
应用场景视频录制 5.AVAudioSessionModeMoviePlayback
适用类别:
AVAudioSessionCategoryPlayBack
应用场景视频播放 6.AVAudioSessionModeVideoChat
适用类别:
AVAudioSessionCategoryPlayAndRecord
应用场景视频通话 7.AVAudioSessionModeMeasurement
适用类别:
AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryRecord
AVAudioSessionCategoryPlayback
AVAudioSessionModeSpokenAudio
AVAudioSessionMode

1.AVAudioSessionCategoryOptionMixWithOthers
适用于:
AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryPlayback
AVAudioSessionCategoryMultiRoute
用于可以和其他app进行混音 2.AVAudioSessionCategoryOptionDuckOthers
适用于:
AVAudioSessionCategoryAmbient
AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryPlayback
AVAudioSessionCategoryMultiRoute
用于压低其他声音播放的音量,使期音量变小 3.AVAudioSessionCategoryOptionAllowBluetooth
适用于:
AVAudioSessionCategoryRecord and AVAudioSessionCategoryPlayAndRecord
用于是否支持蓝牙设备耳机等 4.AVAudioSessionCategoryOptionDefaultToSpeaker
适用于:
AVAudioSessionCategoryPlayAndRecord
用于将声音从Speaker播放,外放,即免提 5.AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers
适用于:
AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryPlayback
AVAudioSessionCategoryMultiRoute 6.AVAudioSessionCategoryOptionAllowBluetoothA2DP
适用于:
AVAudioSessionCategoryPlayAndRecord
蓝牙和a2dp 7.AVAudioSessionCategoryOptionAllowAirPlay
适用于:
AVAudioSessionCategoryPlayAndRecord
airplay

Swift实现iOS录音与播放音频功能

狂奔的胖蜗牛 关注

2017.05.01 15:41* 字数 97 阅读 4275评论 2喜欢 6

自己写的一个类,用于swift实现了录音与播放录制的音频的功能。详细的注意点见注释:

import Foundation

import AVFoundation

class RecordManager {

var recorder: AVAudioRecorder?

var player: AVAudioPlayer?

let file_path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first?.appending("/record.wav")

//开始录音

func beginRecord() {

let session = AVAudioSession.sharedInstance()

//设置session类型

do {

try session.setCategory(AVAudioSessionCategoryPlayAndRecord)

} catch let err{

print("设置类型失败:\(err.localizedDescription)")

}

//设置session动作

do {

try session.setActive(true)

} catch let err {

print("初始化动作失败:\(err.localizedDescription)")

}

//录音设置,注意,后面需要转换成NSNumber,如果不转换,你会发现,无法录制音频文件,我猜测是因为底层还是用OC写的原因

let recordSetting: [String: Any] = [AVSampleRateKey: NSNumber(value: 16000),//采样率

AVFormatIDKey: NSNumber(value: kAudioFormatLinearPCM),//音频格式

AVLinearPCMBitDepthKey: NSNumber(value: 16),//采样位数

AVNumberOfChannelsKey: NSNumber(value: 1),//通道数

AVEncoderAudioQualityKey: NSNumber(value: AVAudioQuality.min.rawValue)//录音质量

];

//开始录音

do {

let url = URL(fileURLWithPath: file_path!)

recorder = try AVAudioRecorder(url: url, settings: recordSetting)

recorder!.prepareToRecord()

recorder!.record()

print("开始录音")

} catch let err {

print("录音失败:\(err.localizedDescription)")

}

}

//结束录音

func stopRecord() {

if let recorder = self.recorder {

if recorder.isRecording {

print("正在录音,马上结束它,文件保存到了:\(file_path!)")

}else {

print("没有录音,但是依然结束它")

}

recorder.stop()

self.recorder = nil

}else {

print("没有初始化")

}

}

//播放

func play() {

do {

player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: file_path!))

print("歌曲长度:\(player!.duration)")

player!.play()

} catch let err {

print("播放失败:\(err.localizedDescription)")

}

}

}

使用的时候,只需要在要录音的地方导入该类,初始化后,使用即可

let recoder_manager = RecordManager()//初始化

recoder_manager.beginRecord()//开始录音

recoder_manager.stopRecord()//结束录音

recoder_manager.play()//播放录制的音频

更多的功能,就需要看各自的项目需求,然后去做相应的修改了。

将原生社交分享整合到应用中

import UIKit

import Social

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

let serviceType = SLServiceTypeTwitter

if SLComposeViewController.isAvailable(forServiceType: serviceType) {

let controller = SLComposeViewController(forServiceType: serviceType)

controller?.setInitialText("设置想与别人分享的文字")

controller?.add(UIImage(named: "风向文章中附带的图片"))

controller?.add(NSURL(string: "为分享文字和图片添加一个URL")! as URL)

controller?.completionHandler = {

(result: SLComposeViewControllerResult) in

print("completed")

}

}

}

}

播放音频文件和录音

//

//  ViewController.swift

//  SwiftExample

//

//  Created by administrator on 2019/2/15.

//  Copyright © 2019 administrator. All rights reserved.

//

import UIKit

import AVFoundation

class ViewController: UIViewController,AVAudioPlayerDelegate,AVAudioRecorderDelegate {

var audioPlayer: AVAudioPlayer?

var audioRecoder: AVAudioRecorder?

/**通知消息,播放器完成播放音频文件的通知**/

func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flay:  Bool) {

print("Finish playing the song")

}

override func viewDidLoad() {

super.viewDidLoad()

DispatchQueue.global().async {[weak self] in

self?.playAudio()

}

let workItem = DispatchWorkItem{

self.playAudio()

}

DispatchQueue.global().async(execute: workItem)

//录音

let session = AVAudioSession.sharedInstance()

do {

if #available(iOS 10.0, *) {

try session.setCategory(.playAndRecord, mode: .default, options: .duckOthers)

} else {

try session.setMode(.default)

try session.setActive(true, options: .notifyOthersOnDeactivation)

}

session.requestRecordPermission { [weak self](allowed: Bool) in

if allowed {

self?.startRecordingAudio()

}else{

print("have no permission")

}

}

} catch let error as NSError {

print("error \(error)")

}

}

func playAudio() {

let mainBundle = Bundle.main

let filePath = mainBundle.path(forResource: "MySong", ofType: ".mp3")

if let path = filePath {

let fileData = NSData(contentsOf: URL(fileURLWithPath: path))

var error: NSError

do {

self.audioPlayer = try AVAudioPlayer(data: fileData! as Data)

//                try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))

if let player = self.audioPlayer{

player.delegate = self

if player.prepareToPlay() && player.play(){

print("play success")

} else {

print("play failor")

}

}

}catch let error as NSError{

if error != nil{

print("创建播放器失败")

self.audioPlayer = nil

}

}

}

}

func audioRecodingPath() -> NSURL {

let fileManager = FileManager()

var documentsFolderUrl:URL?

do {

documentsFolderUrl = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)

} catch let error as NSError {

print("error \(error)")

}

return documentsFolderUrl?.appendingPathComponent("recording.m4a") as! NSURL

}

func audioRecordingSettings() -> NSDictionary {

//音频录制选项

return [AVFormatIDKey : kAudioFormatMPEG4AAC,

AVSampleRateKey : 16000.0 as NSNumber,

AVNumberOfChannelsKey : 1 as NSNumber,

AVEncoderAudioQualityKey : AVAudioQuality.low.rawValue as NSNumber]

}

func startRecordingAudio() {

let audioRecordingURL = self.audioRecodingPath()

do {

audioRecoder = try AVAudioRecorder(url: audioRecordingURL as URL, settings: self.audioRecordingSettings() as! [String : Any])

if let recorder = audioRecoder {

recorder.delegate = self

if recorder.prepareToRecord() && recorder.record(){

let delayInSeconds = 5.0

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {

self.audioRecoder?.stop()

}

//                    DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + delayInSeconds){}

}else{

print("error")

}

}

} catch let error as NSError {

print("error \(error)")

}

}

}

Swift实现iOS录音与播放音频功能的更多相关文章

  1. Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题

    error:Domain=NSOSStatusErrorDomain Code=1937337955 ,这个错误很常见, 原因是因为我们需要调用另外一个AVAudioPlayer 的初始化方法,来确定 ...

  2. C# NAudio录音和播放音频文件-实时绘制音频波形图(从音频流数据获取,而非设备获取)

    NAudio的录音和播放录音都有对应的类,我在使用Wav格式进行录音和播放录音时使用的类时WaveIn和WaveOut,这两个类是对功能的回调和一些事件触发. 在WaveIn和WaveOut之外还有对 ...

  3. C# NAudio录音和播放音频文件及实时绘制音频波形图(从音频流数据获取,而非设备获取)

    下午写了一篇关于NAudio的录音.播放和波形图的博客,不太满意,感觉写的太乱,又总结了下 NAudio是个相对成熟.开源的C#音频开发工具,它包含录音.播放录音.格式转换.混音调整等功能.本次介绍主 ...

  4. 实战AudioToolbox--在iOS平台上播放音频

    上午看了关于AudioToolbox.framework相关的资料,结合网上的资料对AudioToolbox的基本使用有了整体上的认识,上一篇文章 笔谈AudioToolbox(一) 中提到使用Aud ...

  5. 【iOS录音与播放】实现利用音频队列,通过缓存进行对声音的采集与播放

    都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用 ...

  6. iOS录音加播放.

    现在发现的事实有: 如果没有蓝牙设备, 那么可以用下面的方法边录音, 边放音乐: 在录音按钮按下的时候: _avSession = [AVAudioSession sharedInstance];   ...

  7. .net简单录音和播放音频文件代码

    本代码特点:不用DirectX ,对于C/S .B/S都适用. 方法: //mciSendStrin.是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下面介绍一下它的 ...

  8. ios平台cocos2d-x播放音频、视频、音效的Demo(支持网络视频)

    最近由ios应用转做游戏,游戏开始时需要播放一个视频,由于本身cocos2d-x播放视频的相关库,在网上搜到的资料都不是很全,我自己试过在cocos2dx直接调用ios的MediaPlayer来播放, ...

  9. Android 录音和播放

    今天工作上需要做一个一边录音一边播放的功能,大致原因是有一个外部设备输入音频到我们机器,然后我们机器需要马上把音频播放出来.所以了解了一些有关录音和播放的知识.接到这个任务的第一反应就是看看Andro ...

随机推荐

  1. PHP获取远程图片

    <?php // // Function: 获取远程图片并把它保存到本地 // // // 确定您有把文件写入本地服务器的权限 // // // 变量说明: // $url 是远程图片的完整UR ...

  2. 十二 事务&安全问题&隔离级别

    事务 transaction,指一组操作,里面包含许多单一逻辑,只要一个逻辑没有执行成功,那么都算失败.所有的数据都回到最初的状态(回滚). 为什么要有事务? 确保逻辑的成功,例子:银行转账 事务针对 ...

  3. Monkey自动化测试命令

    adb shell monkey –p com.baidu.yuedu -s 123  --throttle 2000 --ignore-crashes  --ignore-security-exce ...

  4. Echarts 折线图y轴标签值过长 显示

    参考: https://blog.csdn.net/dandelion_drq/article/details/79270597 改变Y轴单位:https://www.cnblogs.com/cons ...

  5. beanstalkd队列

    数据结构里面的队列是先进先出的数据结构,在服务器开发中使用队列可以有效的实现任务的异步处理,把耗时的任务放在一个队列中,由消费者去自动处理,比如客户端用户把错题生成pdf文件下载,可以在客户端点击生成 ...

  6. Kubernetes——容器集群

    kuberneteskubernetes(k8s)是google的容器集群管理系统,在docker的基础之上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整的功能,提高了大规模容 ...

  7. php+ajax 实现无限树列表

    首先介绍我实现的是xhprof插件的日志转为无限树状图,先看效果图: 废话不多说,直接看代码:(辛辛苦苦敲了好久才搞定,逻辑比较多,新手多揣摩) 控制器: 1 <?php 2 3 namespa ...

  8. SpringMVC 文件的上传、下载

    文件上传 (1)下载添加2个jar包 commons-fileupload.jar commons-io.jar SpringMVC的文件上传依赖于Apache的FileUpload组件,需要下载添加 ...

  9. 07.swoole学习笔记--tcp客户端

    <?php //创建tcp客户端 $client=new swoole_client(SWOOLE_SOCK_TCP); //连接服务器 $client->connect(,) or di ...

  10. ConfigureDefender – Windows Defender 设置工具

    用于配置Windows 10内置Defender防病毒设置的实用程序.它是一个便携式实用程序 ConfigureDefender实用程序是一个GUI应用程序,用于在Windows 10上查看和配置重要 ...