记录两种播放pcm音频方法
单例 .h文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface WYAudioPlayer : NSObject
+ (instancetype)sharedInstance;
- (void)playMusicWithPath:(NSURL *)fileURL;
//结束播放
- (void)stopPlay;
// 播放后台传来的声音流
- (void)playWithData: (NSData *)data;
- (void)clear;
/*
pcm文件转wav播放
*/
- (NSString *)getWavFileFromPcmData:(NSString *)filePath;
@end
方法一:直接播放pcm文件
#define MIN_SIZE_PER_FRAME 5000 //每个包的大小,室内机要求为960,具体看下面的配置信息
#define QUEUE_BUFFER_SIZE 3 //缓冲器个数
#define SAMPLE_RATE 16000 //采样频率
@interface WYAudioPlayer()
{
AudioQueueRef audioQueue; //音频播放队列
AudioStreamBasicDescription _audioDescription;
AudioQueueBufferRef audioQueueBuffers[QUEUE_BUFFER_SIZE]; //音频缓存
BOOL audioQueueBufferUsed[QUEUE_BUFFER_SIZE]; //判断音频缓存是否在使用
NSLock *sysnLock;
NSMutableData *tempData;
OSStatus osState;
}
@end
@implementation WYAudioPlayer
static WYAudioPlayer *_shareInstance;
static dispatch_once_t onceToken;
+ (instancetype)sharedInstance
{
dispatch_once(&onceToken, ^{
_shareInstance = [[self alloc] init];
});
return _shareInstance;
}
- (instancetype)init
{
self = [super init];
if (self) {
[self initAudioDescriptionSetting];
}
return self;
}
- (void)initAudioDescriptionSetting
{
sysnLock = [[NSLock alloc]init];
//设置音频参数 具体的信息需要问后台
_audioDescription.mSampleRate = SAMPLE_RATE;
_audioDescription.mFormatID = kAudioFormatLinearPCM;
// 下面这个是保存音频数据的方式的说明,如可以根据大端字节序或小端字节序,浮点数或整数以及不同体位去保存数据
_audioDescription.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
//1单声道 2双声道
_audioDescription.mChannelsPerFrame = 1;
//每一个packet一侦数据,每个数据包下的桢数,即每个数据包里面有多少桢
_audioDescription.mFramesPerPacket = 1;
//每个采样点16bit量化 语音每采样点占用位数
_audioDescription.mBitsPerChannel = 16;
_audioDescription.mBytesPerFrame = (_audioDescription.m