@(iOS Study)[音视频播放]
- 作者: Liwx
- 邮箱: [email protected]
目录
- 01.音频播放 音频播放知识点
- 音频播放
- 1.AVFoundation框架
- 2.实现录音功能
- 简单使用AVAudioRecorder实现录音功能
- 3.使用SystemSoundID播放音效
- 使用SystemSoundID播放音效
- 封装使用SystemSoundID播放音效工具类
- 4.使用AVAudioPlayer播放器播放音乐
音频播放
1.AVFoundation框架
- 可以进行录音
- 播放音效(短暂音频)
- 播放音乐(一首完整的歌)(本地/远程)
- 播放视频(本地/远程)
2.实现录音功能
简单使用AVAudioRecorder实现录音功能
- 录音功能实现步骤
- 1.设置录音文件存放的url,音频相关参数
- 1.1 要保存的路径(沙盒路径)
- 1.2 拼接全路径, caf是录音文件的格式,如mp3
- 1.3 创建url
- 1.4 设置setting
- 2.创建录音对象
- 3.开始录音
[self.recorder record]; - 4.停止录音
[self.recorder stop];
- 1.设置录音文件存放的url,音频相关参数
#pragma mark - 懒加载
// REMARKS: 简单使用AVAudioRecorder实现录音功能
- (AVAudioRecorder *)recorder
{
if (_recorder == nil) {
// 1.设置录音文件存放的url,音频相关参数
// 1.1 要保存的路径(沙盒路径)
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
// 1.2 拼接全路径, caf是录音文件的格式,如mp3
NSString *fullPath = [path stringByAppendingPathComponent:@"123.caf"];
// 1.3 创建url
NSURL *url = [NSURL fileURLWithPath:fullPath];
// 1.4 设置setting
/**
AVEncoderAudioQualityKey : @(AVAudioQualityLow), // 音频质量
AVEncoderBitRateKey : @(16), // 比特率
AVNumberOfChannelsKey : @(2), // 通道
AVFormatIDKey : @(kAudioFormatLinearPCM), // 音频编码
AVSampleRateKey : @(8000.0) // 速率
*/
NSDictionary *settingDict = @{
AVEncoderAudioQualityKey : @(AVAudioQualityLow),
AVEncoderBitRateKey : @(16),
AVNumberOfChannelsKey : @(2),
AVFormatIDKey : @(kAudioFormatLinearPCM),
AVSampleRateKey : @(8000.0)
};
// 2.创建录音对象
_recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settingDict error:nil];
}
return _recorder;
}
- (IBAction)startRecorder {
// SINGLE: 开始录音
[self.recorder record];
}
- (IBAction)stopRecorder {
// SINGLE: 停止录音
[self.recorder stop];
}
3.使用SystemSoundID播放音效
使用SystemSoundID播放音效
- 使用SystemSoundID(C语言AudioServicesPlaySystemSound函数)方式播放短音效
- 1.创建SystemSoundID
- 2.创建音效资源url,url类型为CFURLRef类型,使用
(__bridge CF type)
方式桥联,不需要手动释放
使用(__bridge_retained CF type)
方式桥联,需要手动释放,需要调用CFRelease(CFTypeRef cf)
方法释放 - 3.通过url生成SystemSoundID
- 4.播放音效
- 播放音效没有有震动效果
AudioServicesPlaySystemSound(soundID); - 播放音效有震动效果,需用真机测试
AudioServicesPlayAlertSound(soundID);
- 播放音效没有有震动效果
// REMARKS: 使用SystemSoundID(C语言AudioServicesPlaySystemSound函数)方式播放音效
- (void)AudioServicesPlaySound
{
// 1.创建SystemSoundID
SystemSoundID soundID = 0;
// 2.创建音效资源url
// SINGLE: 使用(__bridge CF type)方式桥联,不需要手动释放
// 使用(__bridge_retained CF type)方式桥联,需要手动释放,需要调用CFRelease(CFTypeRef cf)方法释放
CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:@"buyao.wav" withExtension:nil];
// 3.通过url生成SystemSoundID
AudioServicesCreateSystemSoundID(url, &soundID);
// 4.播放音效
AudioServicesPlaySystemSound(soundID); // 播放音效没有有震动效果
// AudioServicesPlayAlertSound(soundID); // 播放音效有震动效果,需用真机测试
}
封装使用SystemSoundID播放音效工具类
- 封装播放音效WXAudioTool工具类
// SINGLE: 创建一个可变字典缓存歌曲,字典只需创建一次,可以在initialize类方法中创建
static NSMutableDictionary *_soundIDs;
+ (void)initialize {
// 创建可变字典
_soundIDs = [NSMutableDictionary dictionary];
}
// REMARKS: 播放音效类方法
/** 播放音效 */
+ (void)playSoundWithSoundName:(NSString *)soundName
{
// 1.先从内存缓存获取soundID
SystemSoundID soundID = [_soundIDs[soundName] unsignedIntegerValue];
// 2.判断内存是否存在音效资源,内存没有音效资源,则创建
if (soundID == 0) {
// 2.1 若不存在, 创建音效资源url
CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
// 2.2 判断url是否为空,如果为空,说明资源不存在,直接退出
if (url == nil) return;
// 2.3 生成SystemSoundID
AudioServicesCreateSystemSoundID(url, &soundID);
// 2.4 存入可变字典内存缓存
[_soundIDs setObject:@(soundID) forKey:soundName];
}
// 3.播放音效
AudioServicesPlaySystemSound(soundID);
}
4.使用AVAudioPlayer播放器播放音乐
- AVAudioPlayer控制音量属性,音量范围0.0 ~ 1.0
self.player.volume = 0.5; - 使用AVAudioPlayer封装播放音乐工具类WXAudioTool
- 实现播放/暂停/停止音乐等方法
播放音乐: + (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName;
暂停音乐: + (void)pauseMusicWithMusicName:(NSString *)musicName;
停止音乐: + (void)stopMusicWithMusicName:(NSString *)musicName;
播放音效: + (void)playSoundWithSoundName:(NSString *)soundName;
- 实现播放/暂停/停止音乐等方法
#import "WXAudioTool.h"
#import
@implementation WXAudioTool
// SINGLE: 创建一个可变字典缓存音乐,字典只需创建一次,可以在initialize类方法中创建
static NSMutableDictionary *_soundIDs;
// SINGLE: 创建音乐内存缓存,在initialize类方法中创建
static NSMutableDictionary *_players;
#pragma mark - 初始化设置
/** 创建内存缓存 */
+ (void)initialize {
// 创建可变字典,用于存放播放音效SystemSoundID
_soundIDs = [NSMutableDictionary dictionary];
// 创建可变字典,用于存放音乐播放器AVAudioPlayer
_players = [NSMutableDictionary dictionary];
}
#pragma mark - 播放音乐API(AVAudioPlayer)
/** 播放音乐 */
+ (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName
{
// 1.先从内存字典中获取播放器AVAudioPlayer
AVAudioPlayer *player = _players[musicName];
// 2.判断是否从内存获取到播放器,如果没有获取到,新建播放器
if (player == nil) {
// 2.1 获取音乐文件的url
NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil];
if (url == nil) return nil;
// 2.2 根据音频文件的url,创建播放器
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
// 2.3 保存到内存缓存_players
[_players setObject:player forKey:musicName];
}
// SINGLE: 3.播放音乐
[player play];
return player;
}
/** 暂停音乐 */
+ (void)pauseMusicWithMusicName:(NSString *)musicName
{
// 1.从内存字典中取出播放器
AVAudioPlayer *player = _players[musicName];
// 2.如果内存中有获取到播放器,暂停播放
if (player) {
// SINGLE: 暂停播放
[player pause];
}
}
/** 停止音乐 */
+ (void)stopMusicWithMusicName:(NSString *)musicName
{
// 1.从内存字典中取出播放器
AVAudioPlayer *player = _players[musicName];
// 2.如果内存中有获取到播放器,停止播放
if (player) {
// SINGLE: 2.1 停止播放
[player stop];
// 2.2 从内存字典中移除
[_players removeObjectForKey:musicName];
player = nil;
}
}
#pragma mark - 播放短音效API(SystemSoundID)
// REMARKS: 播放音效类方法
/** 播放音效 */
+ (void)playSoundWithSoundName:(NSString *)soundName
{
// 1.先从内存缓存获取soundID
SystemSoundID soundID = [_soundIDs[soundName] unsignedIntValue];
// 2.判断内存是否存在音效资源,内存没有音效资源,则创建
if (soundID == 0) {
// 2.1 若不存在, 创建音效资源url
CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
// 2.2 判断url是否为空,如果为空,说明资源不存在,直接退出
if (url == nil) return;
// 2.3 生成SystemSoundID
AudioServicesCreateSystemSoundID(url, &soundID);
// 2.4 存入可变字典内存缓存
[_soundIDs setObject:@(soundID) forKey:soundName];
}
// 3.播放音效
AudioServicesPlaySystemSound(soundID);
}
@end