【发布时间】:2012-12-14 04:34:22
【问题描述】:
我需要在歌曲播放列表中添加淡入/淡出功能(播放列表歌曲从 ipod 库中检索)。 当一首歌曲结束时我需要淡出效果并且下一首歌曲开始我需要淡入效果 另一个认为在衰落系统或媒体 VOLUME 不应该改变。
我正在使用 MPMusicPlayerController 播放歌曲。
【问题讨论】:
我需要在歌曲播放列表中添加淡入/淡出功能(播放列表歌曲从 ipod 库中检索)。 当一首歌曲结束时我需要淡出效果并且下一首歌曲开始我需要淡入效果 另一个认为在衰落系统或媒体 VOLUME 不应该改变。
我正在使用 MPMusicPlayerController 播放歌曲。
【问题讨论】:
这是我编写的 AVAudioPlayer 扩展(ARC 之前),它完全符合您的要求。
标头AVAudioPlayer+FadeControl.h:
#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface AVAudioPlayer (FadeControl)
-(void)fadeOutWithDuration:(NSTimeInterval)inFadeOutTime;
@end
还有来源AVAudioPlayer+FadeControl.m:
#import "AVAudioPlayer+FadeControl.h"
#define kFadeSteps 20.0
@implementation AVAudioPlayer (FadeControl)
-(void)fadeOutWithDuration:(NSTimeInterval)inFadeOutTime
{
NSTimeInterval fireInterval = inFadeOutTime/kFadeSteps;
float volumeDecrement = 1.0/kFadeSteps;
float originalVolume = self.volume;
self.volume = originalVolume - volumeDecrement;
[self retain];
[NSTimer scheduledTimerWithTimeInterval:fireInterval target:self selector:@selector(fadeOutTimerMethod:) userInfo:[NSNumber numberWithFloat:originalVolume] repeats:YES];
}
- (void)fadeOutTimerMethod:(NSTimer*)theTimer
{
float volumeDecrement = 1.0/kFadeSteps;
if (self.volume > volumeDecrement)
{
self.volume = self.volume - volumeDecrement;
}
else if ( [theTimer isValid] )
{
[self stop];
NSNumber* originalVolume = [theTimer userInfo];
self.volume = [originalVolume floatValue];
[theTimer invalidate];
}
else
{
[self stop];
[self release];
}
}
@end
添加playWithFadeInDuration: 方法应该很简单。要在 ARC 项目中使用,只需将 -fno-objc-arc 添加到文件的编译标志。
【讨论】:
MPMusicPlayerController。
-(void)doFadeInVolume {
//play
[audioPlayerMain play];
if (audioPlayerMain.volume < 1.0) {
audioPlayerMain.volume = audioPlayerMain.volume + 0.1;
[self performSelector:@selector(doVolumeFadeMainIn) withObject:nil afterDelay:0.2];
}
}
并且可以使用相反的方法来淡出音量。希望这会有所帮助。
【讨论】:
AVAudioPlayer。在头文件(即接口文件)中,您可以将其声明为AVAudioPlayer *audioPlayerMain,就像我在上面的示例中所做的那样。