我在做运动时制作了一个iPhone应用程序.它发出一个铃声,表明你(用户)应该从你的锻炼的一个步骤切换到下一个.我设计了这个应用程序,以便您可以在使用应用程序的同时聆听iPod上的音乐,而且我想让音色在音乐上充分地听到.我已经得到这个工作…有点…

当音乐响起时,很难听到声调.我的理想解决方案类似于iPod应用程序处理传入短信或电子邮件的方式.音乐音量降低,声音播放,然后音乐音量淡出.

以下是我迄今为止所尝试的方法:

>我已经使用AudioServicesPlaySystemSound播放声音.

我初始化了这样的声音:

CFBundleRef mainBundle = CFBundleGetMainBundle();
soundFileURLRef = CFBundlecopyResourceURL(mainBundle,CFSTR ("bell"),CFSTR ("wav"),NULL);
AudioServicesCreateSystemSoundID (soundFileURLRef,&soundFileID);

我在适当的时候播放声音,使用:

AudioServicesPlaySystemSound (self.soundFileID);

这听起来很好,但听到音乐太难听了.在尝试2 …
>我试图降低iPod音量,播放声音,然后将音量恢复到上一级.

如果当前步骤剩下1秒,开始降低音量:

if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) {
    self.volumeIncrement = originalVolume/5.0f;
    [NSTimer scheduledTimerWithTimeInterval:0.5f 
                                     target:self 
                                   selector:@selector(fadeVolumeOut:) 
                                   userInfo:[NSNumber numberWithInt:1]
                                    repeats:NO];
}

这是fadeVolumeOut:方法:

- (void) fadeVolumeOut:(NSTimer *)timer {
    if (!TARGET_IPHONE_SIMULATOR) {
        NSNumber *volumeStep = (NSNumber *)[timer userInfo];
        int vStep = [(NSNumber *)volumeStep intValue];
        float volume = [[MPMusicPlayerController iPodMusicPlayer] volume];
        volume = volume - self.volumeIncrement;
        if (volume < 0.0f) {
            volume = 0.0f;
        }
        [[MPMusicPlayerController iPodMusicPlayer] setVolume:volume];
        if (vStep < 5) {
            vStep = vStep + 1;
            [NSTimer scheduledTimerWithTimeInterval:0.1f 
                                             target:self 
                                           selector:@selector(fadeVolumeOut:) 
                                           userInfo:[NSNumber numberWithInt:vStep]
                                            repeats:NO];
        }
    }
}

然后,当步骤结束时,播放警报声音并将音量淡出:

[NSTimer scheduledTimerWithTimeInterval:0.1f 
                                  target:self 
                                selector:@selector(alertAndFadeVolumeIn) 
                                userInfo:nil
                                 repeats:NO];

这里是alertAndFadeVolumeIn方法:

- (void) alertAndFadeVolumeIn {
     [self alert];
     [NSTimer scheduledTimerWithTimeInterval:0.25f 
                                      target:self 
                                    selector:@selector(fadeVolumeIn:) 
                                    userInfo:[NSNumber numberWithInt:1]
                                     repeats:NO];
 }

和fadeVolumeIn:基本上是相反的fadeVolumeOut:上面.

这样做,音量消失,音量消失.问题是音量降低了与iPod相同的音量,所以不会让音乐听起来更容易.
>我切换到AVAudioSession播放声音,并设置会话,以便iPod音乐将在应用程序正在使用中继续播放.以下是我初始化会话的方式:

AVAudioSession *session = [AVAudioSession sharedInstance];
 [session setCategory:AVAudioSessionCategoryPlayback error:nil];

 Osstatus propertySetError = 0;
 UInt32 allowMixing = true;
 propertySetError = AudioSessionSetProperty (
     kAudioSessionProperty_OverrideCategoryMixWithOthers,sizeof (allowMixing),&allowMixing
 );

 NSError *activationError = nil;
 [session setActive:YES error:&activationError];

 Nsstring *audioFile = [[NSBundle mainBundle] pathForResource:@"bell"
                                                       ofType:@"wav"];
 player = [[AVAudioPlayer alloc] initWithContentsOfURL:
     [NSURL fileURLWithPath:audioFile] error:NULL];

要播放声音,我在适当的时候打电话给[self.player play].再次,音量随着iPod音量的降低而下降,音调不会更容易听到.
我试过把[[MPMusicPlayerController applicationMusicPlayer] setVolume:1.0f];在警报声音播放之前.这有不同的结果.声音第一次按照我的期望全部播放,但随后的音量要低得多.此外,音乐不会顺利淡出.看来iPodMusicPlayer和applicationMusicPlayer共享相同的音量.这是使用[AVAudioSession sharedInstance]的结果吗?还有另一种初始化AVAudioSession的方法吗?
>接下来,我试过使用AVAudioSession“ducking”:

Osstatus propertySetError = 0;
 UInt32 allowDucking = true;
 propertySetError = AudioSessionSetProperty (
     kAudioSessionProperty_OtherMixableAudioShouldDuck,sizeof (allowDucking),&allowDucking
 );

不幸的是,当音频会话被激活时,iPod音乐“ducks”,一旦viewController加载了我有事情的方式.
>最后,我更改了我的代码,使得音频会话在步骤结束前一秒钟被激活,声音在步骤结束时播放,一秒钟后,会话被禁用.在这一点上,我已经删除了所有的退出代码.以下是相关代码段:

if ([self.intervalSet currentStepTimeRemainingInSeconds] == 1) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
}

if (self.shouldRing) {
    [self.player play]; 
    [NSTimer scheduledTimerWithTimeInterval:1.0f 
                                     target:self 
                                   selector:@selector(stopSound)
                                   userInfo:nil
                                    repeats:NO];
}

- (void) stopSound {
    [self.player stop];
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:NO error:nil];
}

这让我陷入困境.第一步结束后,这样做完美. iPod音量duck duck,loud loud loud loud,the the……….然而,第二次,一声一声的声音播放的声音稍微低一些,第三次几乎听不到声音,第四次无声.然后,第五次,它再次大声响起,周期重复.

最重要的是,激活和停用似乎是相当沉重的操作,并导致计时器稍微点燃.

有人试图做类似的事情吗?是否有首选方法来播放iPod音乐的声音?

解决方法

AVAudioSession是处理“ audio behavior at the application,interapplication,and device levels.”的正确方式,我在iOS 4上使用了稍微修改的#6,没有任何问题.背景音频消失,我的声音播放,背景音频消失.

>初始化音频会话(删除错误处理代码):

AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]
[audioSession setActive:NO error:nil];

播放声音(AVAudioPlayer的播放/ preparetoPlay将为activate the audio session for you):

AVAudioPlayer* audioPlayer = [[[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:nil];
[audioPlayer play];

>停止声音:

[audioPlayer stop];
[[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];

标志kAudioSessionSetActiveFlag_NotifyOthersOnDeactivation(iOS 4的新功能)告诉系统通知背景音频恢复播放.

ios – 降低iPod音量以播放应用程序声音(如本机SMS应用程序)的更多相关文章

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. js中‘!.’是什么意思

  3. InnoDB 和 MyISAM 引擎恢复数据库,使用 .frm、.ibd文件恢复数据库

  4. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  5. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  6. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  7. 宝塔Linux的FTP连接不上的解决方法

    宝塔Linux的FTP连接不上的解决方法常见的几个可能,建议先排查。1.注意内网IP和外网IP2.检查ftp服务是否启动 (面板首页即可看到)3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 (如是腾讯云/阿里云等还需检查安全组)4.是否主动/被动模式都不能连接5.新建一个用户看是否能连接6.修改ftp配置文件 将ForcePassiveIP前面的#去掉 将19

  8. 扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能

  9. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  10. 使用HTML5做的导航条详细步骤

    这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部