iOS 7:使用 AVAudioPlayer 的简单音频控件?
Posted
技术标签:
【中文标题】iOS 7:使用 AVAudioPlayer 的简单音频控件?【英文标题】:iOS 7 : simple audio controls with AVAudioPlayer? 【发布时间】:2013-10-28 15:14:27 【问题描述】:我刚开始使用 xCode 编写 ios 应用程序,但要找到事情的工作原理并不容易,也不是很直观。我对此很陌生,我的应用程序运行得很慢^^。无论如何,我现在至少在 iOS7 上进行尝试。
我设法创建了带有海关单元格和动态高度的动态表格,但现在我没有找到任何解决我的问题的方法......也许我没有在正确的地方搜索......无论如何。
感谢以下几行,我正在播放音频:
NSString *path = [[NSBundle mainBundle] pathForResource:@"song" ofType:@"mp3"];
AVAudioPlayer *audio = [[AVAudioPlayer alloc]
initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];
[audio play];
[audio updateMeters];
现在,太好了,我的音频开始播放了。但我没有任何控制。我成功添加了播放/暂停按钮,但如何在音频中导航?我必须对所有接口进行编码吗?没有带有按钮和响应式进度条的简单界面吗?
如果我必须编写代码,嗯,嗯……我从哪里开始?
非常感谢!
【问题讨论】:
如果你想要按钮来控制音乐、滑动滑块、音量控制等,你需要自己创建它们以及它们对应的方法。如果你也想创建一个滑动滑块,你可能想看看NSTimer
。
【参考方案1】:
使用带有 AVAudioPlayer 的 playAtTime: 方法的 UISlider,AVAudioPlayer 没有内置的搜索栏。
查看这个示例代码,它在类 avTouchController 中实现了你想要的
https://developer.apple.com/library/ios/samplecode/avTouch/Introduction/Intro.html
向您的界面添加一个 UISLider 并将 valueChanged: 链接到方法 seekTime:
在.h中
@property (nonatomic, weak) IBOutlet UISlider *seekbar;
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;
@property (nonatomic, strong) NSTimer *updateTimer;
加载 AVAudioPlayer 后在 viewDidLoad 中的 .m 中,
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"There's A Long, Long Trail A-Winding" ofType:@"mp3"]];
AVAudioPlayer *audio = [[AVAudioPlayer alloc]
initWithContentsOfURL:fileURL error:nil];
self.audioPlayer = audio;
self.seekbar.minimumValue = 0;
self.seekbar.maximumValue = self.audioPlayer.duration;
[[self audioPlayer] play];
self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSeekBar) userInfo:nil repeats:YES]
并添加以下方法
- (void)updateSeekBar
float progress = self.audioPlayer.currentTime;
[self.seekbar setValue:progress];
- (IBAction)seekTime:(id)sender
self.audioPlayer.currentTime = self.seekbar.value;
【讨论】:
糟糕,现在添加。它真的很容易实现,但不要被所有额外的代码所困扰(AVAudioSession) 哇,是的,这似乎有点难:P ...但我不需要电平表、循环和这些东西。只有播放/暂停和响应式“时间线”。我将尝试实现这一点。我希望我能尽快带来一些东西!谢谢 如果你是认真的,我可以添加实现“时间线”所需的代码,它需要一个 NSTimer 和 UISlider。 如果上面的代码适合你,请批准它作为答案。 :) 令人印象深刻!这就像一个魅力:)!现在我需要在弹出导航视图时删除音频,但这是另一回事。非常感谢!【参考方案2】:Play audio and update UISlider with it.
-(void)viewWillAppear:(BOOL)animated
NSString *soundFile=[[NSBundle mainBundle] pathForResource:@"name of your audio file." ofType:@".mp3"];
NSURL *soundFileUrl=[NSURL fileURLWithPath:soundFile];
soundPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileUrl error:nil];
[soundPlayer prepareToPlay];
soundPlayer.delegate=self;
slider.maximumValue=[soundPlayer duration];
slider.minimumValue=0.0;
soundPlayer.currentTime=slider.value;
[soundPlayer play];
[self startTimer];
#pragma mark Timer Methods
- (void)startTimer
timerForPlaying= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES];
- (void)stopTimer
[timerForPlaying invalidate];
timerForPlaying = nil;
// This method for updating UISlider when sound start to play.
- (void)updateSlider
[slider setValue:soundPlayer.currentTime animated:NO];
startTime=slider.value;
// When we adjust sound according to slider value connect this method to your slider value change event.
-(void)valueChange:(id)sender
soundPlayer.currentTime=slider.value;
【讨论】:
暂停音频会发生什么?以上是关于iOS 7:使用 AVAudioPlayer 的简单音频控件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 上使用 AVAudioPlayer 播放指定持续时间的声音?
Swift 3 iOS - 与 AVAudioPlayer 同步暂停