在iPhone上没有音量滑块的情况下如何调整音量

12

我需要您的帮助。应该如何在我的应用程序中更改声音音量?我不想使用音量滑块。相反,我有一个UIImageView作为音量旋钮,在这里我顺时针旋转来增加,逆时针旋转来减小声音音量。旋转只是一种动画效果,我已经完成了这部分。

我需要您的帮助和建议,关于如何增加/减小音量。谢谢

3个回答

16

我认为这是苹果代码中的一个bug,我已经通过Bug报告和面谈向他们报告了此问题,但由于他们坚称这是一个功能,那么你可能会从中受益。

使用以下代码更改应用程序的音量:

[[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume];

在执行此操作之前,您必须建立音频会话,可以通过播放声音或将其设置为活动状态来完成:

[[AVAudioSession sharedInstance] setActive:YES error:NULL];

请注意,您需要MediaPlayer.framework和AVFoundation.framework,并且音量应该介于0.0和1.0之间。


即使我不使用MPMusicPlayerController(例如使用MPMoviePlayerController),我也可以使用它。这是由于AVAudioSession的存在。:) - alones
"setVolume:" 在 iOS 7.0 中已被弃用。 - Ashton Honnecke

12
我会谨慎地在MPVolumeView上调用setValue,因为它可能只会更新滑块的外观,而不是实际设备音量级别。相反,您需要调用_commitVolumeChange,但这是私有API,很可能会导致您的应用被拒绝。
如何控制音量的简短答案:这取决于您要控制哪个音量。
如果您想要控制“应用内的所有声音”,则可以使用MPVolumeView,但您不能以编程方式更改其值。然后,您只能通过触摸移动滑块或使用设备侧面的音量按钮来更改音量。最好的方法是创建一个全局对象,存储任何对象在播放其声音之前都可以读取的音量级别。
如果是AVAudioPlayer对象,则创建该对象并使用[theAudioPlayerObject setVolume:someFloat];,其中someFloat是0.0到1.0之间的值。
如果是SystemSound对象,则无法控制音量。
如果是AudioQueue,则可以通过AudioQueueSetParameter进行更改。
就像我说的那样...这完全取决于您正在播放声音的方式。

对于这个特定的例子, 您将设置音量如下:

在AudioStreamer.h文件中添加

- (void)setVolume:(float)Level;

添加到 AudioStreamer.m 文件中

- (void)setVolume:(float)Level
{

    OSStatus errorMsg = AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, Level);

    if (errorMsg) {
        NSLog(@"AudioQueueSetParameter returned %d when setting the volume.", errorMsg);
    }

}

将以下代码添加到视图控制器中,用于音量旋钮的位置(这部分代码应该放在.m文件中..我只是快速添加了一些UIButtons,您需要自己完成),并设置一个IBAction以更改给定值的音量(您可以传递0.0到1.0作为浮点数)

- (IBAction)volumeUp:(id)sender
{

    [streamer setVolume:1.0];

}

- (IBAction)volumeDown:(id)sender
{

    [streamer setVolume:0.0];

}

1
没问题,如果你在实现这个过程中遇到了问题,请告诉我,我会发布一个示例项目。首先自己尝试一下,这样你会学到更多。 - iwasrobbed
嗨,Rob,有没有一种简单的方法可以记录使用Matt Gallagher音频类流式传输的内容。我的意思是我想在同时播放时进行录制。 - awlcs
1
抱歉,awics,您需要为此开始一个新的问题。Stack Overflow是一个每个帖子只有一个问题的网站,以便后来寻找答案的读者能够保持组织。 - iwasrobbed
好的,Rob:D 你能帮我一下吗?:s 我创建了一个新的帖子 http://stackoverflow.com/questions/3501227/record-simultaneously-while-streamer-is-playing - awlcs
1
但是如果您正在使用 AudioUnit 呢? - JohnK
显示剩余2条评论

4

好的,取最小旋转值(R1)和最大旋转值(R2)。然后执行 rotation / (R2 - R1) 得到像滑块一样的百分比。

编辑:
要提交音量更改,请添加以下内容:

MPVolumeView *systemVolumeSlider = [[MPVolumeView alloc] initWithFrame: self.view.bounds];
[systemVolumeSlider setHidden:YES];
[systemVolumeSlider setUserInteractionEnabled:NO];
[self.view addSubview:systemVolumeSlider];

确保在dealloc中释放systemVolumeSlider

然后,当音量发生变化时,使用setValue来设置其值。您还需要处理用户按设备上的音量+/-按钮时会发生什么。


1
你可能还想告诉他们如何更改音量,以便完整回答 :) - iwasrobbed
感谢jrtc和iWasRobbed的帮助:D jrtc: 哈哈,我的问题是,在得到%之后,接下来该怎么做,我卡在这里了xD - awlcs
好的,我看了一下你的问题,以为我已经回答了它,但实际上没有!不过答案已经更新了 ;) - jrtc27
1
我会小心使用MPVolumeView...你不能在不调用私有API“_commitVolumeChange”的情况下以编程方式更改音量 - iwasrobbed
自iOS 3.0以来,它显然会自动更新- http://www.fraoula.com/?p=124 - jrtc27
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接