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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Iphone 音频

發布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Iphone 音频 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

iPhone microphone輸入事件捕獲

目的:
利用麥克風做為一種事件的輸入方式
核心:
通過AudioSession與AudioQueue實現麥克風輸入的數據捕捉.

開啟AudioSession:
1.? ? AudioSessionInitialize
2.? ? AudioSessionSetProperty(kAudioSessionProperty_AudioCategory)
3.? ? AudioSessionSetActive

建立聲音格式:
1.? ? 聲音格式的數據結構AudioStreamBasicDescription
2.? ? 使用kAudioFormatLinearPCM來做為聲音格式

建立AudioQueue:
1.? ? AudioQueueNewInput
2.? ? AudioQueueStart
3.? ? AudioQueueSetProperty(kAudioQueueProperty_EnableLevelMetering)

獲取聲音峰值數據:
1.? ? 記錄峰值的數據結構AudioQueueLevelMeterState
2.? ? AudioQueueGetProperty(kAudioQueueProperty_CurrentLevelMeterDB)

關閉AudioQueue:
1.? ? AudioQueueStop
2.? ? AudioQueueDispose

代碼:


#import <UIKit/UIKit.h>
#include <AudioToolbox/AudioToolbox.h>

@interface MicrophoneTestViewController : UIViewController {

? ? IBOutlet UILabel*? ? _averagePower;
? ? IBOutlet UILabel*? ? _peakPower;

? ? AudioQueueRef? ?? ?? ?? ?? ? mQueue;
? ? AudioStreamBasicDescription? ? mFormat;
? ? AudioQueueLevelMeterState? ? *_chan_lvls;
? ? NSArray? ?? ?? ?? ?? ?? ?? ?? ?*_channelNumbers;
}

-(void)setChannelNumbers:(NSArray *)v;
-(void)initAudioSession;

- (IBAction)startstop: (id) sender;

@end
[/code]

[code]
#import "MicrophoneTestViewController.h"

static void MyInputBufferHandler(void *? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?inUserData,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?AudioQueueRef? ?? ?? ?? ?? ?? ?? ?? ?? ? inAQ,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?AudioQueueBufferRef? ?? ?? ?? ?? ?? ???inBuffer,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?const AudioTimeStamp *? ?? ?? ?? ?? ?? ???inStartTime,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?UInt32? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?inNumPackets,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?const AudioStreamPacketDescription*? ? inPacketDesc)
{
? ? // 如果要記錄聲音,可以在這里做記錄處理.
? ? // 如果要分析聲音數據,可以在這里做記錄處理.
}

static void interruptionListener(void *? ? inClientData,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?UInt32? ? inInterruptionState)
{
? ? // 聲音中斷通知(BEGIN,END)
}

@implementation MicrophoneTestViewController

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
? ? [super viewDidLoad];

? ? _averagePower.text = @"0";
? ? _peakPower.text = @"0";
? ? mQueue = NULL;
? ? _channelNumbers = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], nil];
? ? _chan_lvls = (AudioQueueLevelMeterState*)malloc(sizeof(AudioQueueLevelMeterState) * [_channelNumbers count]);

? ? [self initAudioSession];

? ? [NSTimer
? ???scheduledTimerWithTimeInterval:1.f/30.f
? ???target:self
? ???selector:@selector(_refresh)
? ???userInfo:nil
? ???repeats:YES
? ???];
}

- (void)didReceiveMemoryWarning {
? ? // Releases the view if it doesn't have a superview.
? ? [super didReceiveMemoryWarning];

? ? // Release any cached data, p_w_picpaths, etc that aren't in use.
}

- (void)viewDidUnload {
? ? // Release any retained subviews of the main view.
? ? // e.g. self.myOutlet = nil;
? ? [_channelNumbers release];
? ? free(_chan_lvls);
}


- (void)dealloc {
? ? [super dealloc];
}

-(void)initAudioSession
{
? ? OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, self);
? ? if (error) printf("ERROR INITIALIZING AUDIO SESSION! %d\n", (int)error);
? ? else
? ? {
? ?? ???UInt32 category = kAudioSessionCategory_PlayAndRecord;? ?
? ?? ???error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
? ?? ???if (error) printf("couldn't set audio category!");

? ?? ???error = AudioSessionSetActive(true);
? ?? ???if (error) printf("AudioSessionSetActive (true) failed");
? ? }
}

-(void)setupAudioFormat:(UInt32)inFormatID
{
? ? memset(&mFormat, 0, sizeof(mFormat));

? ? UInt32 size = sizeof(mFormat.mSampleRate);
? ? OSStatus result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate,
? ?? ?? ?? ?? ?? ?? ?? ?? ? &size,
? ?? ?? ?? ?? ?? ?? ?? ?? ? &mFormat.mSampleRate);

? ? size = sizeof(mFormat.mChannelsPerFrame);
? ? result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareInputNumberChannels,
? ?? ?? ?? ?? ?? ?? ?? ?? ? &size,
? ?? ?? ?? ?? ?? ?? ?? ?? ? &mFormat.mChannelsPerFrame);

? ? mFormat.mFormatID = inFormatID;
? ? if (inFormatID == kAudioFormatLinearPCM)
? ? {
? ?? ???// if we want pcm, default to signed 16-bit little-endian
? ?? ???mFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
? ?? ???mFormat.mBitsPerChannel = 16;
? ?? ???mFormat.mBytesPerPacket = mFormat.mBytesPerFrame = (mFormat.mBitsPerChannel / 8) * mFormat.mChannelsPerFrame;
? ?? ???mFormat.mFramesPerPacket = 1;
? ? }
}

-(void)startMicrophone
{
? ? [self setupAudioFormat:kAudioFormatLinearPCM];
? ? OSStatus result = AudioQueueNewInput(&mFormat, MyInputBufferHandler, NULL, NULL, NULL, 0, &mQueue);
? ? if (result == noErr) {
? ?? ???result = AudioQueueStart(mQueue, NULL);
? ?? ???if (result == noErr) {
? ?? ?? ?? ?UInt32 val = 1;
? ?? ?? ?? ?AudioQueueSetProperty(mQueue, kAudioQueueProperty_EnableLevelMetering, &val, sizeof(UInt32));

? ?? ?? ?? ?if (mFormat.mChannelsPerFrame != [_channelNumbers count])
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? NSArray *chan_array;
? ?? ?? ?? ?? ? if (mFormat.mChannelsPerFrame < 2)
? ?? ?? ?? ?? ?? ???chan_array = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], nil];
? ?? ?? ?? ?? ? else
? ?? ?? ?? ?? ?? ???chan_array = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], [NSNumber numberWithInt:1], nil];

? ?? ?? ?? ?? ? [self setChannelNumbers:chan_array];
? ?? ?? ?? ?? ? [chan_array release];

? ?? ?? ?? ?? ? _chan_lvls = (AudioQueueLevelMeterState*)realloc(_chan_lvls, mFormat.mChannelsPerFrame * sizeof(AudioQueueLevelMeterState));
? ?? ?? ?? ?}

? ?? ?? ?? ?return;
? ?? ???}
? ? }

? ? // 失敗
? ? mQueue = NULL;
? ? NSLog(@"startMicrophone:失敗.");
? ? return;
}

-(void)stopMicrophone
{
? ? if (mQueue) {
? ?? ???AudioQueueStop(mQueue, true);
? ?? ???AudioQueueDispose(mQueue, true);
? ?? ???mQueue = NULL;
? ? }
}

-(void)_refresh
{
? ? if (mQueue) {
? ?? ???UInt32 data_sz = sizeof(AudioQueueLevelMeterState) * [_channelNumbers count];
? ?? ???OSErr status = AudioQueueGetProperty(mQueue, kAudioQueueProperty_CurrentLevelMeterDB, _chan_lvls, &data_sz);
? ?? ???if (status == noErr)
? ?? ???{
? ?? ?? ?? ?// 這里沒有去處理多個通道的數據顯示,直接就顯示最后一個通道的結果了
? ?? ?? ?? ?// 這里的值就是我們打算用來做為一些觸發機制的值了,需要用到的時候直接訪問_chan_lvls這個數組
? ?? ?? ?? ?for (int i=0; i<[_channelNumbers count]; i++)
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? NSInteger channelIdx = [(NSNumber *)[_channelNumbers objectAtIndex:i] intValue];
? ?? ?? ?? ?? ? if (channelIdx < [_channelNumbers count] && channelIdx <= 127)
? ?? ?? ?? ?? ? {
? ?? ?? ?? ?? ?? ???_averagePower.text = [NSString stringWithFormat:@"%f", _chan_lvls[channelIdx].mAveragePower];
? ?? ?? ?? ?? ?? ???_peakPower.text = [NSString stringWithFormat:@"%f", _chan_lvls[channelIdx].mPeakPower];
? ?? ?? ?? ?? ? }
? ?? ?? ?? ?}
? ?? ???}
? ? }
}

-(void)setChannelNumbers:(NSArray *)v
{
? ? [v retain];
? ? [_channelNumbers release];
? ? _channelNumbers = v;
}

- (IBAction)startstop: (id) sender
{
? ? if (mQueue) {
? ?? ???[self stopMicrophone];
? ? } else {
? ?? ???[self startMicrophone];
? ? }
}

@end

轉載于:https://blog.51cto.com/3426724/717015

總結

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

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

主站蜘蛛池模板: 看国产黄色片 | 国产精品无码毛片 | 一区二区视频在线免费观看 | 欧美美女性视频 | 日韩午夜视频在线观看 | 大尺度床戏视频 | 国产久草av | 91人妻一区二区 | 日韩另类 | 欧美日韩亚洲一区 | 户外少妇对白啪啪野战 | av色图在线 | 影音先锋国产 | 99久久精品国产一区二区成人 | 毛片在线网址 | 看全色黄大色黄女片18 | 爱情岛av永久入口 | 日本裸体网站 | 黄色免费网站视频 | av资源免费看 | 日本免费小视频 | 黄视频国产 | a级片免费视频 | 欧美激情视频一区 | 久久亚 | 在线中文一区 | 涩涩五月天 | 在线观看免费高清在线观看 | 日本二三区 | 中文字幕一区二区三区乱码人妻 | 97人人爽人人爽人人爽人人爽 | 国产伦精品一区二区三区照片91 | 中国成人毛片 | 亚洲午夜精品久久久 | 久久手机视频 | 国产一区二区毛片 | 美女扒开尿口给男人桶 | 激情涩涩 | 3d动漫精品啪啪一区二区三区免费 | 国产精品乱码久久久久 | 国产大屁股喷水视频在线观看 | 成人av影院 | 精品一区二区三区免费 | 精彩久久 | 国产一级二级三级视频 | 风流老熟女一区二区三区 | 国产亚洲一区二区三区在线观看 | 午夜精品福利一区二区三区蜜桃 | 制服丝袜第一页在线观看 | 国产黄片毛片 | 星空大象mv高清在线观看免费 | 日日夜夜爱爱 | 国产高潮在线观看 | 国产在线伊人 | jzzijzzij亚洲成熟少妇 | 丰满熟女一区二区三区 | 欧美人妖乱大交 | 国语对白 | 蝌蚪av| 日韩有码一区二区三区 | 久久国产精品免费看 | 欧美美女一区二区三区 | 国产主播自拍av | 黄瓜污视频 | 国产又粗又猛又爽 | 锦绣未央在线观看 | 波多野结衣视频一区二区 | 91青青操| 可以免费看污视频的网站 | 亚洲女同一区二区 | 进去里片欧美 | 少妇视频网站 | 国产又黄又粗又爽 | 五月天六月色 | 国产精品2019 | 精品一区二区人妻 | aaaa视频| 久久国产精品精品国产 | 精品一区二区免费视频 | 黑人精品无码一区二区三区 | 91网址入口 | 亚洲国产精品视频 | 日韩啪| 欧美日本在线播放 | 欧美亚洲视频 | 欧美xxxxx高潮喷水麻豆 | 国产3区| 波多野结衣视频播放 | 免费成人黄色av | 午夜免费精品 | 天天射天天射天天射 | 日韩xxx高潮hd| www.插插插 | 人妖被c到高潮欧美gay | 日本三级免费 | 国产成人综合自拍 | 人妻 校园 激情 另类 | 日本中文字幕网站 | 男人天堂一区二区 |