【问题标题】:how to display selected songs from ipodLibrary played from avplayer in uitableview如何在uitableview中显示从avplayer播放的ipodLibrary中选择的歌曲
【发布时间】:2012-07-25 12:27:45
【问题描述】:

我正在使用 AVPlayer 播放歌曲。我也可以在后台播放它。有一个名为showPlaylistUIButton。当我点击它时,我需要显示我从UITableView 中的ipodLibrary 中选择的歌曲列表,并且我应该能够显示艺术品、歌曲中剩余的分钟数以及艺术家的姓名(如果它在歌曲。

我有播放和暂停按钮:当我单击暂停按钮时,歌曲会暂停,但当我再次点击播放按钮时,它会转到 ipodLibrary。点击播放按钮后如何恢复播放?

UITableView 中有多首歌曲时,我希望它在第一首曲目完成后立即继续下一首曲目。我想知道该怎么做。

-(IBAction)playButtonPressed:(UIButton *)sender {
  // Create picker view
  MPMediaPickerController* picker = [[MPMediaPickerController alloc] init];
  picker.delegate = self;
  if (userMediaItemCollection) {
    MusicTableViewController *controller = [[MusicTableViewController alloc]
     initWithNibName: @"MusicTableView" bundle: nil];
    controller.delegate = self;
    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController: controller animated: YES];
  } else {
    MPMediaPickerController *picker = [[MPMediaPickerController alloc]
      initWithMediaTypes: MPMediaTypeMusic];
    picker.delegate  = self;
    picker.allowsPickingMultipleItems = YES;
    picker.prompt = NSLocalizedString
      (@"Add songs to play", "Prompt in media item picker");
    [[UIApplication sharedApplication] setStatusBarStyle:
      UIStatusBarStyleDefault animated: YES];
    [self presentModalViewController: picker animated: YES];
  }
}

-(IBAction)pauseButtonPressed:(UIButton *)sender {
  [myPlayer pause];
}

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

-(void) mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:
  (MPMediaItemCollection *)mediaItemCollection {
  [self dismissViewControllerAnimated:YES completion:nil];
  NSURL* assetUrl = [mediaItemCollection.representativeItem
    valueForProperty:MPMediaItemPropertyAssetURL];
  AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetUrl options:nil];
  AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
  myPlayer = [AVPlayer playerWithPlayerItem:playerItem];
  [myPlayer play];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  [self becomeFirstResponder];
}

- (BOOL)canBecomeFirstResponder {
  return YES;
}

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
  [self resignFirstResponder];
}

-(void)remoteControlReceivedWithEvent:(UIEvent *)event {
  switch (event.subtype) {
    case UIEventSubtypeRemoteControlTogglePlayPause:
      if (myPlayer.rate == 0.0) {
        [myPlayer play];
      } else {
        [myPlayer pause];
      }
      break;
    case UIEventSubtypeRemoteControlPlay:
      [myPlayer play];
      break;
    case UIEventSubtypeRemoteControlPause:
      [myPlayer pause];
      break;
    default:
      break;
  }
}

【问题讨论】:

标签: objective-c ios xcode avplayer


【解决方案1】:

我会查看 Apple 的示例代码 "Add Music",它清楚地展示了如何执行您所描述的所有操作。

此示例应用程序将让您了解如何使用保存到MPMediaItemCollection 的 iPod 库中选定歌曲的可变副本的内容填充UITableView。它还展示了如何使用 MPMediaItemsMPMediaItemCollections 将轨道特定属性显示为单元格标题标签等。

  1. 为了填充表格视图,您可以这样设置:

    MPMediaItem *mediaItem = (MPMediaItem *)[collectionMutableCopy objectAtIndex:row];

    MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];

    if (mediaItem) {
        cell.textLabel.text = [mediaItem valueForProperty:MPMediaItemPropertyTitle];
        cell.detailTextLabel.text = [mediaItem valueForProperty:MPMediaItemPropertyArtist];
        if (artwork != nil) {
            cell.imageView.image = [artwork imageWithSize:CGSizeMake (40, 40)];
        }else{
            cell.imageView.image = [UIImage imageNamed:@"no_artwork.png"];
        }
    }
    
  2. 将链接到播放按钮的按钮重命名为“选择音乐”,并创建一个名为“播放”的新按钮,并将其操作设置为:

    - (IBAction)playMusic { [myPlayer play]; }

编辑:MPMediaItemCollection的内容创建数组:

NSMutableArray *collectionMutableCopy = [[NSMutableArray alloc] initWithArray:myMediaItemCollection.items];

编辑 2: 取消项目中以下行的注释:

- (void) registerForMediaPlayerNotifications

/*
 // This sample doesn't use libray change notifications; this code is here to show how
 //     it's done if you need it.
 [[NSNotificationCenter defaultCenter] removeObserver: self
 name: MPMediaLibraryDidChangeNotification
 object: musicPlayer];

 [[MPMediaLibrary defaultMediaLibrary] endGeneratingLibraryChangeNotifications];

 */

- (void)dealloc

/*
 // This sample doesn't use libray change notifications; this code is here to show how
 //     it's done if you need it.
 [notificationCenter addObserver: self
 selector: @selector (handle_iPodLibraryChanged:)
 name: MPMediaLibraryDidChangeNotification
 object: musicPlayer];

 [[MPMediaLibrary defaultMediaLibrary] beginGeneratingLibraryChangeNotifications];
 */

替换这一行:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];

有了这个

 [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];

 UInt32 doSetProperty = 0;
 AudioSessionSetProperty (
 kAudioSessionProperty_OverrideCategoryMixWithOthers,
 sizeof (doSetProperty),
 &doSetProperty
 );

然后将以下内容添加到您的项目 info.plist 文件中

【讨论】:

  • ^^ 对于格式错误的响应,我深表歉意...语法突出显示似乎无法正常工作。
  • 我可以使用相同的单元格来显示标题名称、艺术家姓名以及艺术品吗,因为我增加了 tableviewcell 的高度,以便它可以占据所有这些。如果我错了,请纠正我上面的代码将在 cellForRowAtIndexPath 中实现。
  • 我只有一个视图,我在顶部放置了按钮,所以当我单击 showMusic 按钮时,UITableview 将显示在按钮下方,以便它可以占据屏幕的底部
  • @coded 是的,你可以。每个单元格都有一个 textLabel 和一个 detailTextLabel 属性,但为了使用这两个 textLabel,您需要将单元格样式更改为 UITableViewCellStyleValue1、UITableViewCellStyleValue2 或 UITableViewCellStyleSubtitle。是的,这将进入 cellForRowAtIndexPath,我不明白你在第二条评论中的意思。
  • 啊好的。当我运行我的应用程序时,我有播放按钮、暂停按钮、addMusicButton、showPlaylistButton。所有这些按钮都放在顶部,所以当我点击 showPlaylistButton 时,UITableView 将与歌曲的细节一起移位,所以我从 ipodLibary 中选择了多少歌曲,所有这些细节都会正确显示,我想知道艺术品如何将像艺术家一样显示 MPMediaItemPropertyArtist
【解决方案2】:

您的问题是您的播放按钮所做的不仅仅是告诉音乐播放器播放。你需要一个只打电话给[myPlayer play];在播放按钮以外的地方进行所有设置。

让您的播放按钮同时选择歌曲并不是一个很好的编码实践(最好保持一个按钮 -> 一个功能的想法)。所以有一个按钮可以立即执行播放按钮中的操作,然后让播放按钮调用[myPlayer play]

至于你的其他问题,你应该看看这个:Play multiple audio files using AVAudioPlayer

请注意,您不应该在同一篇文章中提出多个问题。这使得提供简洁、有用的答案变得更加困难,并且会使网站更难找到内容。

我不确定您是否在询问如何显示歌曲信息,但我猜它在您的标题中。对于这个,iPhone sdk - accessing current song information through an app

【讨论】:

  • 所以我会添加另一个 UIButton,它允许我选择歌曲和另一个 UIButton 来播放歌曲。
  • 这是个好主意,尽管从技术上讲,您可以使用一些变量来跟踪正在发生的事情并相应地更改按钮的行为。
  • 谢谢,还有一篇关于你提到的多个音频文件的文章,我正在使用 AVPlayer它应该开始播放了。我已经在某处阅读过使用 NSNotification 的内容,您对此有何看法
  • 这不是一个坏方法,如果你以前没有这样做过会有点痛苦。如果您想要最简单的方法,请尝试audioPlayerDidFinishPlaying。您所要做的就是设置AVAudioPlayerDelegate(在.h 文件中添加<AVAudioPlayerDelegate> 并在.m 中设置myPlayer.delegate = self)。
  • 我已经在我的 h.file 中设置了 AVAudioPlayerDelegate 如果我设置 myPlayer.delegate = self ,它将如何播放第二首歌曲,我只是好奇地问问题,因为它很有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多