ios – 我想每秒调用20次installTapOnBus:bufferSize:format:block:

前端之家收集整理的这篇文章主要介绍了ios – 我想每秒调用20次installTapOnBus:bufferSize:format:block:前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从麦克风实时输入波形显示.
我已经使用installTapOnBus:bufferSize:format:block:来实现,这个函数在一秒钟内被调用三次.
我想将此函数设置为每秒调用20次.
我在哪里可以设置?
  1. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  2.  
  3. NSError* error = nil;
  4. if (audioSession.isInputAvailable) [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
  5. if(error){
  6. return;
  7. }
  8.  
  9. [audioSession setActive:YES error:&error];
  10. if(error){
  11. retur;
  12. }
  13.  
  14. self.engine = [[[AVAudioEngine alloc] init] autorelease];
  15.  
  16. AVAudioMixerNode* mixer = [self.engine mainMixerNode];
  17. AVAudioInputNode* input = [self.engine inputNode];
  18. [self.engine connect:input to:mixer format:[input inputFormatForBus:0]];
  19.  
  20. // tap ... 1 call in 16537Frames
  21. // It does not change even if you change the bufferSize
  22. [input installTapOnBus:0 bufferSize:4096 format:[input inputFormatForBus:0] block:^(AVAudioPCMBuffer* buffer,AVAudioTime* when) {
  23.  
  24. for (UInt32 i = 0; i < buffer.audioBufferList->mNumberBuffers; i++) {
  25. Float32 *data = buffer.audioBufferList->mBuffers[i].mData;
  26. UInt32 frames = buffer.audioBufferList->mBuffers[i].mDataByteSize / sizeof(Float32);
  27.  
  28. // create waveform
  29. ...
  30. }
  31. }];
  32.  
  33. [self.engine startAndReturnError:&error];
  34. if (error) {
  35. return;
  36. }

解决方法

他们说,Apple支持回复否:( 2014年9月)

Yes,currently internally we have a fixed tap buffer size (0.375s),
and the client specified buffer size for the tap is not taking effect.

但有人调整缓冲区大小,并获得40毫秒
https://devforums.apple.com/thread/249510?tstart=0

在ObjC中无法检查它:(

UPD它有效!只是单行:

  1. [input installTapOnBus:0 bufferSize:1024 format:[mixer outputFormatForBus:0] block:^(AVAudioPCMBuffer *buffer,AVAudioTime *when) {
  2. buffer.frameLength = 1024; //here

猜你在找的iOS相关文章