3

割り当てのために音楽プレーヤーをコーディングしようとしていますが、曲の再生中にスライダーを更新しようとして立ち往生しています。ユーザーがスライダーをスライドさせると、曲がその部分まで巻き戻し/早送りされるようにすることができました。曲の再生中にスライダーが継続的に更新されない理由を知っている人はいますか?

ここに.hファイルがあります

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

@interface AS3MPViewController : UIViewController <MPMediaPickerControllerDelegate>{
    IBOutlet UIButton *playButton;
    IBOutlet UIButton *stopButton;
    IBOutlet UIButton *pauseButton;
    IBOutlet UISlider *volumeSlider;
    AVAudioPlayer *musicPlayer;
    IBOutlet UIButton *pickSongButton;
    IBOutlet UISlider *timeSlider;
    NSTimer *timer;
}

@property (nonatomic, retain) UIButton *playButton;
@property (nonatomic, retain) UIButton *stopButton;
@property (nonatomic, retain) UIButton *pauseButton;
@property (nonatomic, retain) UISlider *volumeSlider;
@property (nonatomic, retain) AVAudioPlayer *musicPlayer;
@property (nonatomic, retain) UIButton *pickSongButton;
@property (nonatomic, retain) UISlider *timeSlider;
@property (nonatomic, retain) NSTimer *timer;

- (IBAction) play;
- (IBAction) stop;
- (IBAction) pause;
- (IBAction) changeVolume: (UISlider *)sender;
- (IBAction) chooseSong: (UIButton *)sender;
- (IBAction) changeTime: (UISlider *)sender;
- (void)setTimeSliderOptions;

@end

ここに.mファイルがあります

#import "AS3MPViewController.h"

@interface AS3MPViewController ()

@end

@implementation AS3MPViewController

@synthesize playButton = _playButton;
@synthesize stopButton = _stopButton;
@synthesize pauseButton = _pauseButton;
@synthesize musicPlayer = _musicPlayer;
@synthesize volumeSlider = _volumeSlider;
@synthesize pickSongButton = _pickSongButton;
@synthesize timeSlider = _timeSlider;
@synthesize timer;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"animals001"     ofType:@"mp3"];

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];

    self.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

    [self.musicPlayer prepareToPlay];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (IBAction) play {
    [self.musicPlayer play];

}

- (IBAction) stop {
    [self.musicPlayer stop];
    self.musicPlayer.currentTime = 0;
}

- (IBAction) pause {
    [self.musicPlayer pause];
}

- (IBAction) changeVolume: (UISlider *)sender {
    self.musicPlayer.volume = [sender value];
}

- (IBAction)chooseSong:(UIButton *)sender {
    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAnyAudio];

    [mediaPicker setDelegate:self];
    [mediaPicker setAllowsPickingMultipleItems:NO];

    mediaPicker.prompt = NSLocalizedString(@"Add Some Songs To Play", "Prompt In Media Item Picker");

    [self presentModalViewController: mediaPicker animated:YES];
}

- (void) mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {
[self dismissModalViewControllerAnimated:YES];
}

- (void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:    (MPMediaItemCollection *)mediaItemCollection {

    MPMediaItem *item = [[mediaItemCollection items] objectAtIndex:0];
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];

    //AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
    //AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playerItem];

    self.timeSlider.maximumValue = [self.musicPlayer duration];

    self.musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

    [self.musicPlayer play];

    timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(songCurrentTime) userInfo:nil repeats:YES];

    [self dismissModalViewControllerAnimated:YES];
}

- (IBAction)changeTime: (UISlider *)sender {
    self.musicPlayer.currentTime = self.musicPlayer.duration * sender.value;
}

- (void)songCurrentTime {
    timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration);
}
@end
4

7 に答える 7

1

あなたの問題は、メインスレッド以外のスレッドからスライダーの値を更新していることだと思います。スライダーの値を更新するメイン スレッドで別のメソッドを呼び出すように、songCurrentTime メソッドを変更してみてください。

- (void)songCurrentTime {
[self performSelectorOnMainThread:@selector(songCurrentTimeMain) withObject:nil waitUntilDone:YES];
}

- (void)songCurrentTimeMain {
timeSlider.value = (self.musicPlayer.currentTime / self.musicPlayer.duration);
}

もちろん、正しい結果を得るには、スライダーの最小値が 0 で最大値が 1 であることを確認してください。

よろしくお願いします

于 2013-01-03T22:35:20.343 に答える
0

このチュートリアルで似たようなことをしましたが、スライダーを追加した方法は、使用したという事実を除いて、あなたと同じでした

musicPlayer.currentPlaybackTime

スライダーに割り当てる値として。

(self.musicPlayer.currentTime / self.musicPlayer.duration) の結果が、スライダー値への不正確な割り当てである可能性があります。

于 2012-11-23T15:23:57.763 に答える
0

スライダーの値を設定すると、 は常に より小さいか等しいため、値は常に 1self.musicPlayer.currentTime以下になりself.musicPlayer.durationます。代わりに、これを試してください

timeSlider.value = self.musicPlayer.currentTime;
于 2012-11-23T15:16:54.370 に答える
0

timeSliderself.timeSlider同じではありません。プロパティ名のアンダースコア形式を使用してプロパティを合成するため、宣言した iVar のほとんどは不要です (誤解を招きます)。たとえば、 iVartimeSliderによってサポートされるプロパティと、まったく別のものである iVar があるとします。_timeSlidertimeSlider

を使用しself.timeSlider.value = ...ます。

于 2012-11-23T15:51:15.660 に答える
0

私の場合、UISlider に透明なビューがあり、見落としていました。

于 2019-11-12T21:12:41.147 に答える