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 参考的简书作者

如何在 iOS 上使用 AVAudioPlayer 播放指定持续时间的声音?

使用 iOS 模拟器的 AVAudioPlayer 错误

Swift 3 iOS - 与 AVAudioPlayer 同步暂停

iOS:当前 AVAudioPlayer 的 AudioUnit

iOS:AVAudioPlayer 只能播放一个文件吗?