1.

AQRecorder

  1. mRecordFormat.mFormatID = inFormatID;
  2. if (inFormatID == kAudioFormatLinearPCM)
  3. {
  4. // if we want pcm, default to signed 16-bit little-endian
  5. mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
  6. mRecordFormat.mBitsPerChannel = ;
  7. mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / ) * mRecordFormat.mChannelsPerFrame;
  8. mRecordFormat.mFramesPerPacket = ;
  9. }
  10.  
  11. // else {
  12. //
  13. // mRecordFormat.mSampleRate = 44100;//8000.0;//44100.0;
  14. //
  15. // mRecordFormat.mFormatID = kAudioFormatMPEG4AAC; // kAudioFormatMPEG4AAC_HE does not work. Can't find `AudioClassDescription`. `mFormatFlags` is set to 0.
  16. // mRecordFormat.mFormatFlags = kMPEG4Object_AAC_LC; // Format-specific flags to specify details of the format. Set to 0 to indicate no format flags. See “Audio Data Format Identifiers” for the flags that apply to each format.
  17. // mRecordFormat.mBytesPerPacket = 0; // The number of bytes in a packet of audio data. To indicate variable packet size, set this field to 0. For a format that uses variable packet size, specify the size of each packet using an AudioStreamPacketDescription structure.
  18. // mRecordFormat.mFramesPerPacket = 0; // The number of frames in a packet of audio data. For uncompressed audio, the value is 1. For variable bit-rate formats, the value is a larger fixed number, such as 1024 for AAC. For formats with a variable number of frames per packet, such as Ogg Vorbis, set this field to 0.
  19. // mRecordFormat.mBytesPerFrame = 0; // The number of bytes from the start of one frame to the start of the next frame in an audio buffer. Set this field to 0 for compressed formats. ...
  20. // mRecordFormat.mChannelsPerFrame = 1; // The number of channels in each frame of audio data. This value must be nonzero.
  21. // mRecordFormat.mBitsPerChannel = 0; // ... Set this field to 0 for compressed formats.
  22. // mRecordFormat.mReserved = 0; // Pads the structure out to force an even 8-byte alignment. Must be set to 0.
  23. // }
  1. url = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)inRecordFile, NULL);
  2.  
  3. // create the audio file
  4. OSStatus status = AudioFileCreateWithURL(url, kAudioFileCAFType, &mRecordFormat, kAudioFileFlags_EraseFile, &mRecordFile);
  5. CFRelease(url);
  1. // ____________________________________________________________________________________
  2. // AudioQueue callback function, called when an input buffers has been filled.
  3. void AQRecorder::MyInputBufferHandler( void * inUserData,
  4. AudioQueueRef inAQ,
  5. AudioQueueBufferRef inBuffer,
  6. const AudioTimeStamp * inStartTime,
  7. UInt32 inNumPackets,
  8. const AudioStreamPacketDescription* inPacketDesc)
  9. {
  10. AQRecorder *aqr = (AQRecorder *)inUserData;
  11. try {
  12. if (inNumPackets > ) {
  13. // write packets to file
  14. XThrowIfError(AudioFileWritePackets(aqr->mRecordFile, FALSE, inBuffer->mAudioDataByteSize,
  15. inPacketDesc, aqr->mRecordPacket, &inNumPackets, inBuffer->mAudioData),
  16. "AudioFileWritePackets failed");
  17. aqr->mRecordPacket += inNumPackets;
  18. }
  19.  
  20. // if we're not stopping, re-enqueue the buffe so that it gets filled again
  21. if (aqr->IsRunning())
  22. XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, , NULL), "AudioQueueEnqueueBuffer failed");
  23. } catch (CAXException e) {
  24. char buf[];
  25. fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
  26. }
  27. }

AQPlayer

  1. void AQPlayer::SetupNewQueue()
  2. {
  3. XThrowIfError(AudioQueueNewOutput(&mDataFormat, AQPlayer::AQBufferCallback, this,
  4. CFRunLoopGetCurrent(), kCFRunLoopCommonModes, , &mQueue), "AudioQueueNew failed");
  5.  
  6. ...
  7.  
  8. void AQPlayer::AQBufferCallback(void * inUserData,
  9. AudioQueueRef inAQ,
  10. AudioQueueBufferRef inCompleteAQBuffer)
  11. {
  12. AQPlayer *THIS = (AQPlayer *)inUserData;
  13.  
  14. if (THIS->mIsDone) return;
  15.  
  16. UInt32 numBytes;
  17. UInt32 nPackets = THIS->GetNumPacketsToRead();
  18. OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), false, &numBytes, inCompleteAQBuffer->mPacketDescriptions, THIS->GetCurrentPacket(), &nPackets,
  19. inCompleteAQBuffer->mAudioData);
  20. if (result)
  21. printf("AudioFileReadPackets failed: %d", (int)result);
  22. if (nPackets > ) {
  23. inCompleteAQBuffer->mAudioDataByteSize = numBytes;
  24. inCompleteAQBuffer->mPacketDescriptionCount = nPackets;
  25. AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, , NULL);
  26. THIS->mCurrentPacket = (THIS->GetCurrentPacket() + nPackets);
  27. }

2.levelmeter

  1. - (void)updateLevelMeter:(id)sender {
  2. /*
  3. if (self.delegate) {
  4. UInt32 dataSize = sizeof(AudioQueueLevelMeterState);
  5. AudioQueueGetProperty([self.decapsulator Queue], kAudioQueueProperty_CurrentLevelMeter, levelMeterStates, &dataSize);
  6. if ([self.delegate respondsToSelector:@selector(levelMeterChanged:)]) {
  7. [self.delegate levelMeterChanged:levelMeterStates[0].mPeakPower];
  8. }
  9.  
  10. }*/
  11. }
  1. //self.timerLevelMeter = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(updateLevelMeter:) userInfo:nil repeats:YES];
  2. __weak __typeof(self)weakSelf = self;
  3. MLAudioMeterObserver *meterObserver = [[MLAudioMeterObserver alloc]init];
  4. meterObserver.actionBlock = ^(NSArray *levelMeterStates,MLAudioMeterObserver *meterObserver){
  5. NSLog(@"volume:%f",[MLAudioMeterObserver volumeForLevelMeterStates:levelMeterStates]);
  6.  
  7. if ([weakSelf.delegate respondsToSelector:@selector(levelMeterChanged:)]) {
  8. [weakSelf.delegate levelMeterChanged:[MLAudioMeterObserver volumeForLevelMeterStates:levelMeterStates]];
  9. }
  10. };
  11. meterObserver.errorBlock = ^(NSError *error,MLAudioMeterObserver *meterObserver){
  12. //[[[UIAlertView alloc]initWithTitle:@"错误" message:error.userInfo[NSLocalizedDescriptionKey] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"知道了", nil]show];
  13. };
  14. self.meterObserver = meterObserver;
  15. self.meterObserver.audioQueue = player->Queue();

3.

linesview

  1. - (void)levelMeterChanged:(float)levelMeter {
  2. dispatch_async(dispatch_get_main_queue(), ^{
  3. //self.levelMeter.progress = levelMeter;
  4. NSLog(@"%.2f",levelMeter*);
  5.  
  6. [self.levelMeterLineView1 addMeter:levelMeter*];
  7. [self.levelMeterLineView2 addMeter:levelMeter*];
  8. });
  9.  
  10. }
  1. -(void)addMeter:(float)meter
  2. {
  3. if (high) {
  4. meter = meter*0.6 + 0.4;
  5. } else {
  6. meter = meter*0.6 + 0.35;
  7. }
  8. high = !high;
  9.  
  10. [_meters addObject:@(meter)];
  11.  
  12. if (_meters.count > ) {
  13. [_meters removeObjectAtIndex:];
  14. }
  15. [self setNeedsDisplay];
  16. }

DXRecordView

  1. - (void)levelMeterChanged:(float)levelMeter {
  2. dispatch_async(dispatch_get_main_queue(), ^{
  3. //self.levelMeter.progress = levelMeter;
  4. NSLog(@"%.2f",levelMeter*);
  5.  
  6. float showMeter = levelMeter*0.6 + 0.35;
  7.  
  8. [_recordView setVoiceImageWithLowPassResults:showMeter];
  9.  
  10. });
  11.  
  12. }
  1. -(void)setVoiceImageWithLowPassResults:(double)lowPassResults
  2. {
  3. CGRect frame = _meterImageView.frame;
  4. frame.size.height = *lowPassResults;
  5. frame.origin.y = +5.5+*(-lowPassResults);
  6. _meterImageView.frame = frame;

4.recordButton 按住说话

  1. //录制
  2. self.recordButton = [[UIButton alloc] initWithFrame:CGRectMake(, kVerticalPadding, CGRectGetWidth(self.bounds)-( * ), kInputTextViewMinHeight)];
  3. self.recordButton.titleLabel.font = [UIFont systemFontOfSize:15.0];
  4. [self.recordButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
  5. [self.recordButton setBackgroundImage:[UIImage imageNamed:@"btn_long_round"] forState:UIControlStateNormal];
  6. [self.recordButton setBackgroundImage:[UIImage imageNamed:@"btn_long_round_hl"] forState:UIControlStateHighlighted];
  7. [self.recordButton setTitle:LOCALIZATION(@"按住说话") forState:UIControlStateNormal];
  8. [self.recordButton setTitle:LOCALIZATION(@"松开结束") forState:UIControlStateHighlighted];
  9. [self.recordButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
  10. //self.recordButton.hidden = YES;
  11. [self.recordButton addTarget:self action:@selector(recordButtonTouchDown) forControlEvents:UIControlEventTouchDown];
  12. [self.recordButton addTarget:self action:@selector(recordButtonTouchUpOutside) forControlEvents:UIControlEventTouchUpOutside];
  13. [self.recordButton addTarget:self action:@selector(recordButtonTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
  14. [self.recordButton addTarget:self action:@selector(recordDragOutside) forControlEvents:UIControlEventTouchDragExit];
  15. [self.recordButton addTarget:self action:@selector(recordDragInside) forControlEvents:UIControlEventTouchDragEnter];

5.EMChatAudioBubbleView

  1. - (void)setModel:(MessageModel *)model
  2. {
  3. [super setModel:model];
  4.  
  5. _timeLabel.text = [NSString stringWithFormat:@"%d'",self.model.time];
  6.  
  7. if (self.model.isSender) {
  8. [_isReadView setHidden:YES];
  9. _animationImageView.image = [UIImage imageNamed:SENDER_ANIMATION_IMAGEVIEW_IMAGE_DEFAULT];
  10. _animationImageView.animationImages = _senderAnimationImages;
  11. }
  12. else{
  13. if (model.isPlayed) {
  14. [_isReadView setHidden:YES];
  15. }else{
  16. [_isReadView setHidden:NO];
  17. }
  18.  
  19. _animationImageView.image = [UIImage imageNamed:RECEIVER_ANIMATION_IMAGEVIEW_IMAGE_DEFAULT];
  20. _animationImageView.animationImages = _recevierAnimationImages;
  21. }
  22.  
  23. if (self.model.isPlaying)
  24. {
  25. [self startAudioAnimation];
  26. }else {
  27. [self stopAudioAnimation];
  28. }
  29. }
  1. @interface MiniCourseViewTableViewCell : UITableViewCell<UITableViewDataSource,UITableViewDelegate,CommentVoiceDelegate>
  2.  
  3. @property(nonatomic, strong) NSString * MiniContent;
  4. @property(nonatomic, strong) UILabel *contentLabel,*numberLabel,* nameLabel,* timeLabel;
  5. @property(nonatomic, strong) NSMutableArray * commentModelArray;
  6. @property(nonatomic, strong) UIImageView * headImageView;
  7. @property(nonatomic, strong) UIButton * laudButton;
  8.  
  9. @property (nonatomic, strong) UITableView * tableView;
  10. @property (nonatomic, strong) PlayVoiceButton *playVoiceButton;
  11. @property (nonatomic, strong)id <ReplyVoiceDelegate> delegate;
  12.  
  13. @property(nonatomic, strong) CourseReplay * replyModel;
  14.  
  15. + (float)getHeightWithString:(NSString *)string fontSize:(int)size contenViewWidth:(CGFloat)width;
  16.  
  17. @end
  1.  
  1. @interface FollowTalkThingCommentTableViewCell : UITableViewCell
  2.  
  3. @property (nonatomic, strong) UIImageView *userImageView;
  4. @property (nonatomic, strong) UILabel *nameLabel;
  5. @property (nonatomic, strong) UILabel *timeLabel;
  6. @property (nonatomic, strong) UIButton *zanButton;
  7.  
  8. @property (strong, nonatomic) UILabel *answerLabel,*replyLabel;
  9. @property (nonatomic, strong) PlayVoiceButton *voiceButton;
  10. @property (strong, nonatomic) UIView *answerView;
  11.  
  12. @property (strong, nonatomic) UILabel *scoreLabel;
  13.  
  14. @property (nonatomic, strong)id <playVoiceButton> delegate;
  15.  
  16. +(CGSize)cellBubbleSizeWithContent:(NSString *)content;
  17.  
  18. @property (strong, nonatomic) id model;
  19.  
  20. @end

第九天 iOS音频技术的更多相关文章

  1. iOS 开发技术体系

    iOS 开发技术体系图: - 层级 | 主要框架 - ---------------------|--------------------------------------------------- ...

  2. iOS音频AAC视频H264编码 推流最佳方案

    iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成 ...

  3. IOS 音频开发文件大小计算

    音频基础知识 音频文件计算大小 音频转码 标签(空格分隔): 调查 IOS音频 https://developer.apple.com/library/ios/documentation/MusicA ...

  4. iOS音频处理

    ios音频处理 1. iOS底层音频处理技术(带源代码) http://www.cocoachina.com/ios/20111122/3563.html 2.ios 音频入门 http://blog ...

  5. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  6. IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE

    本文转载至 http://blog.csdn.net/u014011807/article/details/40187737 在本卷你可以学到什么? 采用四种方法设计应用于各种场合的音频播放器: 基于 ...

  7. 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 3月14日,腾讯旗下知名手游<QQ炫舞>正式上线各大应用商店,并迅速登上App Store免 ...

  8. 转: HTTP Live Streaming直播(iOS直播)技术分析与实现

    http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html HTTP Live Streaming直播(iOS直播)技术分析与实现 ...

  9. iOS 音频开发

      音频基础知识 组成 音频文件的组成:文件格式(或者音频容器) + 数据格式(或者音频编码). 文件格式(或音频容器)是用于形容文件本身的格式. 我们可以通过多种不同的方法为真正的音频数据编码.例如 ...

随机推荐

  1. group by语句

  2. KEGG and Gene Ontology Mapping in Bioinformatic Method

    使用KOBAS进行KEGG pathway和Gene Ontology分析 Article from Blog of Alfred-Feng http://blog.sina.com.cn/u/170 ...

  3. JavaWeb---总结(十七)JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  4. JavaWeb---总结(十八)JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  5. 菜鸟之linux问题之图形界面和dos界面的登录问题

    1.安装完linux系统后,图形化界面的用户名和密码是之前安装的时候设置的. 如果想切换到linux的dos窗口快捷键是:ctrl+alt+F2 由dos窗口切换到linux图形界面快捷键是:ctrl ...

  6. easyUI创建dialog弹框

    1.在当前页面必须有一个DIV <!-- 保证金明细的详情列表显示 --> <div id="dialog-alarm-detail"></div&g ...

  7. C#------DateTime自定义格式

    var text = Convert.ToString(DateTime.Now.ToString("yyyy/MM/dd"));

  8. WinForm------分页控件dll下载地址

    转载: http://files.cnblogs.com/wuhuacong/TestPager_SqlLite.rar

  9. sql编程小结

    对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的 ...

  10. js随笔,css和js禁止网页选择文本,table的class样式使得td的class样式失效,jquery获得元素坐标

    css使用user-select,user-select不是W3C标准,浏览器支持不完整:user-select有两个值,none用户不可以选择文本,text用户可以选择文本 body{-moz-us ...