打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
AudioStreamBasicDescription

转自 : http://blog.sina.com.cn/s/blog_6568e7880100uf6v.html

  1. AudioStreamBasicDescription format; // 声音格式设置,这些设置要和采集时的配置一致  
  2.   
  3. memset(&format, 0, sizeof(format));  
  4.   
  5.    
  6.   
  7. format.mSampleRate = 44100; // 采样率 (立体声 = 8000)  
  8.   
  9. format.mFormatID = kAudioFormatLinearPCM; // PCM 格式  
  10.   
  11. format.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;  
  12.   
  13. format.mChannelsPerFrame = 1;  // 1:单声道;2:立体声  
  14.   
  15. format.mBitsPerChannel = 16; // 语音每采样点占用位数  
  16.   
  17. format.mBytesPerFrame = (format.mBitsPerChannel/8)  * format.mChannelsPerFrame;//每桢的bytes数  
  18.   
  19. format.mFramesPerPacket = 1; <span style="font-family: Verdana;">//每个数据包下的桢数,即每个数据包里面有多少桢</span>  
  20.   
  21. format.mBytesPerPacket = format.mBytesPerFrame * format.mFramesPerPacket; //每个数据包的bytes总数,每桢的bytes数*每个数据包的桢数  
  22.   
  23.    
  24.   
  25. AudioQueueRef queue;  
  26.   
  27. AudioQueueNewOutput(&format,  
  28.   
  29.                 AQPlayer::AQOutputCallback,  
  30.   
  31.                 this,  // opaque reference to whatever you like  
  32.   
  33.                 CFRunLoopGetCurrent(),  
  34.   
  35.                 kCFRunLoopCommonModes,  
  36.   
  37.                 0,  
  38.   
  39.                 &queue);  
  40.   
  41.    
  42.   
  43. const int bufferSize = 0xA000;  // 48K - around 1/2 sec of 44kHz 16 bit mono PCM  
  44.   
  45. for (int i = 0; i < kNumberBuffers; ++i)  
  46.   
  47.     AudioQueueAllocateBufferWithPacketDescriptions(queue, bufferSize, 0, &mBuffers[i]);  
  48.   
  49.    
  50.   
  51. AudioQueueSetParameter(queue, kAudioQueueParam_Volume, 1.0);  
  52.   
  53.    
  54.   
  55. UInt32 category = kAudioSessionCategory_MediaPlayback;  
  56.   
  57. AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);  
  58.   
  59.    
  60.   
  61. AudioSessionSetActive(true);  
  62.   
  63.    
  64.   
  65. // prime the queue with some data before starting  
  66.   
  67. for (int i = 0; i < kNumberBuffers; ++i)  
  68.   
  69.     OutputCallback(queue, mBuffers[i]);  
  70.   
  71.    
  72.   
  73. AudioQueueStart(queue, NULL);  
  74.   
  75.    
  76.   
  77. 在CallBack中填出数据:  
  78.   
  79.    
  80.   
  81. void OutputCallback(void* inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inCompleteAQBuffer) {  
  82.   
  83.     // Fill  
  84.   
  85.     //AQPlayer* that = (AQPlayer*) inUserData;  
  86.   
  87.     inCompleteAQBuffer->mAudioDataByteSize = next->mAudioDataBytesCapacity;  
  88.   
  89.     for (int i = 0; i < inCompleteAQBuffer->mAudioDataByteSize; ++i)  
  90.   
  91.         next->mAudioData[i] = rand();  
  92.   
  93.     AudioQueueEnqueueBuffer(queue, inCompleteAQBuffer, 0, NULL);  
  94.   
  95.  }  


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android bytes与KB、MB、GB单位转换
UUID做主键,优点,缺点!
UUIDHexGenerator
RabbitMQ用户指南(RabbitMQ-C)
Winpcap主要数据结构及函数
Android音视频之AudioRecord录音(一)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服