我正在编写一个基本的音乐播放器应用程序但在处理应用程序状态转换时遇到一些问题.
我正在使用Swift 3和MPMusicPlayerController.systemMusicPlayer()
目标是这样的:
1)当用户点击主页按钮并且应用程序进入bg(工作)时保持音乐播放
2)如果用户退出应用程序,则停止播放器(myMP.stop())(有时工作,其他时间抛出错误)
我根据可能的操作使用print语句跟踪了流程并得到了:
流程2是我所期望的,但是当应用程序关闭时,Flow 1会抛出一个错误 - 我希望"会终止".
编辑:主要问题是当使用流程1退出应用程序时,永远不会调用"将终止" - 因此永远不会调用"myMP.stop()"并且应用程序退出后播放器继续播放.
如果您在应用程序处于活动状态时单击Home一次(Flow 1)或double(Flow 2),则行为会有明显的不同.
为什么会采用哪两个不同的反应应该是相同的动作?
编辑:最重要的是,如果它永远不会"终止",如何停止MediaPlayer for Flow 1?
编辑:
以下是一些复制问题的示例代码:
AppDelegate.swift
//
// AppDelegate.swift
// Jumbo Player
//
import UIKit
//import MediaPlayer
//doesn't matter where this is declared - here or in ViewController - same results
//let myMP:MPMusicPlayerController = MPMusicPlayerController.systemMusicPlayer()
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for …Run Code Online (Sandbox Code Playgroud) iOS上的Spotify有一个非常有趣的控制中心集成.注意下面的汉堡包按钮.

锁屏上同样的事情!

他们是如何做到的?MPMediaCenter中有API吗?
正如Apple文件中所述:
enum {
MPMusicRepeatModeDefault,
MPMusicRepeatModeNone,
MPMusicRepeatModeOne,
MPMusicRepeatModeAll
};
typedef NSInteger MPMusicRepeatMode;
Run Code Online (Sandbox Code Playgroud)
然而,MPMusicRepeatModeDefault被描述为用户首选的重复模式.自从我写一个音乐播放器,我需要知道每个什么是当前重复模式的时间,而当这是返回,"实际"模式的内容:
MPMusicRepeatModeNoneMPMusicRepeatModeOneMPMusicRepeatModeAll应该选择?或者没有办法获得这些信息?
尝试播放音频时模拟器崩溃.
13:22:14.211 App [2965:5603] <0xb03e7000> Error '!obj' trying to fetch default input device's sample rate
13:22:14.211 App [2965:5603] <0xb03e7000> Error getting audio input device sample rate: '!obj'
13:22:14.213 App [2965:5603] <0xb03e7000> AQMEIOManager::FindIOUnit: error '!dev'
Run Code Online (Sandbox Code Playgroud) 我已经在反馈助手中提交了关于此的反馈,但我想我也会在这里发布 - 从 iOS 13.4 开始,我注意到 MediaPlayer 框架中的各种错误,特别是 applicationQueuePlayer 和 applicationMusicPlayer。
第一个是在应用程序启动时初始化,它现在抛出此错误:
[SDKPlayback] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong]
当调用 prepareToPlay() 时,该错误紧随其后:
Error Domain=MPMusicPlayerControllerErrorDomain Code=6 "Failed to prepare to play" UserInfo={NSDebugDescription=Failed to prepare to play}
最终,在调用 prepareToPlay 足够多次之后,它会直接开始播放内容,但即便如此,我发现我必须多次调用 play() 或 pause() 才能可靠地执行此操作。
还有其他人在 13.4 之后的应用中看到过这个吗?
我正在使用Xcode 10+,Swift 4,并使用MPMediaPlayer定位iOS 11.4+
我想以编程方式淡出播放器的音量(就像Apple退出音乐播放器时那样).同样,我不想在它运行时看到任何东西(比如VolumeView显示).
看起来所有程序化的音量控件都已被弃用.
我已经阅读了很多相关帖子并创建了这个函数,它有几个问题:
@objc func fadeVolume(){
var sliderView = UISlider()
//let volumeView = MPVolumeView(frame: CGRect.init(x: self.view.frame.maxX, y: self.view.frame.maxY, width: 0, height: 0))
let volumeView = MPVolumeView(frame: .zero)
volumeView.clipsToBounds = true
volumeView.showsRouteButton = false
//volumeView.isHidden = true
volumeView.alpha = 0.001
for subview in volumeView.subviews {
if let slider = subview as? UISlider {
sliderView = slider
break
}
}
self.view.addSubview(volumeView)
volumeView.didMoveToSuperview()
let current:Float = AVAudioSession.sharedInstance().outputVolume
print("slider value: \(current)")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
UIView.animate(withDuration: 0.4, animations: { …Run Code Online (Sandbox Code Playgroud) 我刚刚看到Apple发布的iOS 5.1到iOS 6.0 API差异.他们说一些重要的方法MPMusicPlayerController.h被移除到MPMediaPlayback协议(播放,暂停,停止......).
有人知道如何更新使用以下代码的应用程序来使用iOS 6吗?
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer play;
Run Code Online (Sandbox Code Playgroud) 注意:请参阅底部的更新.
我有一个应用程序从列表中逐个播放视频.因此,为了测试此功能,我创建了一个只有一个视图控制器的简单应用程序.在实现此视图控制器之前,我引用了此博客.视图控制器已命名TNViewController,其实现如下:
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
@interface TNViewController : UIViewController {
@private
NSMutableArray *_videoArray;
int _currentVideo;
MPMoviePlayerController *_moviePlayer;
NSURL *_movieUrl;
}
@end
Run Code Online (Sandbox Code Playgroud)
它的实施是:
#import "TNViewController.h"
@implementation TNViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
[self.view setFrame:CGRectMake(0, 0, 480, 320)];
[self initVideos];
[self initPlayer];
}
- (void) initVideos {
_videoArray = [[NSMutableArray alloc] init];
NSString *path = [[NSBundle mainBundle] pathForResource:@"sintel_trailer" ofType:@"mp4" inDirectory:nil]; …Run Code Online (Sandbox Code Playgroud) 从iOS 8.4播放Apple Music时,我无法检索MPMediaItemPropertyArtwork
我试着读一下图像 nowPlayingItem
(lldb) po [[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] valueForProperty:MPMediaItemPropertyArtwork]
<MPConcreteMediaItemArtwork: 0x174478940>
但返回的对象是空的:
(lldb) p (CGRect)[[[[MPMusicPlayerController systemMusicPlayer] nowPlayingItem] valueForProperty:MPMediaItemPropertyArtwork] bounds]
(CGRect) $2 = (origin = (x = 0, y = 0), size = (width = 0, height = 0))
显然返回的图像总是为零
还有另一种获取nowPlayingItem MPMediaItemPropertyArtwork图像的方法吗?
我尝试用 Swift 制作我自己的音乐播放器。我需要跳转到我的 MPMediaItemCollection 的特定歌曲/索引并开始播放它,但我只能找到像 skipToNextItem() 和 skipToPreviousItem() 这样的方法。除了循环,还有其他方法可以做到这一点吗?
let player = MPMusicPlayerController.systemMusicPlayer()
player.setQueueWithItemCollection(mediaCollection)
player.play()
Run Code Online (Sandbox Code Playgroud) 使用a MPMusicPlayerController是否有办法查询曲目长度?
使用.currentPlaybackTime我可以弄清楚我进入赛道的距离,但我无法知道赛道有多长.
我[MPMediaItem valueForProperty:MPMediaItemPropertyAssetURL]为某些曲目返回null,因此使用AVAsset对我不起作用.
我的MPMusicPlayerController存在一些问题.这是一个iPodMusicPlayer,而不是appmusicplayer.我的问题是我无法让队列以正确的顺序播放.让我进一步解释一下:
我使用iPod选择器来选择媒体集合,然后将其添加到音乐播放器的队列中.一旦我这样做,我在表格视图中显示集合中的项目.然后,用户可以"播放"此队列.但是,出于某种原因,当我尝试使用ipod控件导航到播放列表时,队列看起来像是错误的顺序.这是一些代码:
媒体选择器调用此方法:
-(void)updatePlayerQueueWithMediaCollection:(MPMediaItemCollection *)collection {
if (collection) {
// If there's no playback queue yet...
if (self.userMediaItemCollection == nil) {
[self setUserMediaItemCollection: collection];
[self.musicPlayer setQueueWithItemCollection:self.userMediaItemCollection];
} else {
BOOL wasPlaying = NO;
if (self.musicPlayer.playbackState == MPMusicPlaybackStatePlaying) {
wasPlaying = YES;
}
// Save the now-playing item and its current playback time.
MPMediaItem *nowPlayingItem = self.musicPlayer.nowPlayingItem;
NSTimeInterval currentPlaybackTime = self.musicPlayer.currentPlaybackTime;
// Combine the previously-existing media item collection with the new one
NSMutableArray *combinedMediaItems =
[[self.userMediaItemCollection items] mutableCopy];
NSArray *newMediaItems = …Run Code Online (Sandbox Code Playgroud)