17

Swift の iOS アプリで MPMoviePlayerController を使用してビデオを再生しようとしています。

私の目標は、Apple Music などでシステム ミュージックを再生し、アプリを開いてオーディオをミックスできるようにすることですが、アプリでMPNowPlayingInfoCenter.

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers)MPNowPlayingInfoCenter を設定したまま使用するにはどうすればよいですか?

MPNowPlayingInfoCenter の設定中に、Google マップが音声をミックスします。以下は、MPNowPlayingInfoCenter を設定しようとしている方法です。

func setMeta(){
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()
    if let player = PlayWorkoutViewController.player{
        let coverArt = MPMediaItemArtwork(image: UIImage(named: "AlbumArt")!)
        let dict: [String: AnyObject] = [
            MPMediaItemPropertyArtwork: coverArt,
            MPMediaItemPropertyTitle:workout.title,
            MPMediaItemPropertyArtist:"Alex",
            MPMediaItemPropertyAlbumTitle:workout.program.title,
            MPNowPlayingInfoPropertyPlaybackRate: player.currentPlaybackRate,
            MPNowPlayingInfoPropertyElapsedPlaybackTime: player.currentPlaybackTime,
            MPMediaItemPropertyPlaybackDuration: player.playableDuration
        ]
        MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = dict
    }
}

上記の機能は、オプション ( ) を使用して同時に外部音楽を再生しようとしていないときに機能しますが、オプション ( ) を使用して外部音楽を再生しようとしている間は、情報センターが更新されません。.MixWithOthers.MixWithOthers

編集1:非常に明確にするために、私はすでにビデオを適切に再生しています.MPNowPlayingInfoCenterを設定しながら、他のバックグラウンドオーディオでビデオを再生しようとしています.

4

3 に答える 3

10

これは現在 iOS では不可能です。カテゴリ オプションを に変更しただけでも、無視されます.MixWithOthersnowPlayingInfo

MPNowPlayingInfoCenter私の推測では、複数のミキシング アプリが同時に再生されている場合、(たとえば) コントロール センターにどのアプリが表示されるかについて不確実性があるため、iOS は非ミキシング アプリのみを に含めることを検討しています。

iOS が次のような「現在再生中のアプリ」を選択するためのベストエフォート型アプローチを使用した場合、私は非常に気に入っています。

  1. ミキシング以外のアプリが再生されている場合は、それを選択します。そうしないと..
  2. 再生中のミキシング アプリが 1 つしかない場合は、それを選択します。そうしないと..
  3. 複数のミキシング アプリが再生されている場合は、1 つを選択してください :) または何も選択しないでください。どちらでも構いません。

この動作もご希望の場合は、Apple にバグを報告することをお勧めします。

于 2016-01-12T15:12:10.177 に答える
0

を更新するために独自のカスタム関数を実装しようとしましたMPNowPlayingInfoCenterか? 最近、AVAudioPlayer音楽を再生するために を使用していて、手動で更新する必要がありました。

これは基本的に、新しい曲をロードするときに呼び出した関数です。

func updateNowPlayingCenter() {
    let center = MPNowPlayingInfoCenter.defaultCenter()
    if nowPlayingItem == nil {
        center.nowPlayingInfo = nil
    } else {
        var songInfo = [String: AnyObject]()

        // Add item to dictionary if it exists
        if let artist = nowPlayingItem?.artist {
            songInfo[MPMediaItemPropertyArtist] = artist
        }
        if let title = nowPlayingItem?.title {
            songInfo[MPMediaItemPropertyTitle] = title
        }
        if let albumTitle = nowPlayingItem?.albumTitle {
            songInfo[MPMediaItemPropertyAlbumTitle] = albumTitle
        }
        if let playbackDuration = nowPlayingItem?.playbackDuration {
            songInfo[MPMediaItemPropertyPlaybackDuration] = playbackDuration
        }
        if let artwork = nowPlayingItem?.artwork {
            songInfo[MPMediaItemPropertyArtwork] = artwork
        }
        center.nowPlayingInfo = songInfo
    }
}

ロードされているムービーでこれを行うことが MPMoviePlayerController をオーバーライドするかどうかはわかりませんが、試してみる価値があるようです。

さらに、彼らは減価償却してAVPlayerViewControllerMPMoviePlayerControllerに置き換えたので、これも検討する価値があります。

編集: また、情報センターによって表示されるデータに影響を与えるため、リモート コントロール イベントを適切に受信していることを確認します。

于 2016-01-06T01:11:41.113 に答える
-1

ビデオをすばやく再生するには、これを使用します:-

func playVideoEffect() {
    let path = NSBundle.mainBundle().pathForResource("egg_grabberAnmi", ofType:"mp4")
    let url = NSURL.fileURLWithPath(path!)
    self.moviePlayer = MPMoviePlayerController(contentURL: url)
    if let player = moviePlayer {
        let screenSize: CGRect = UIScreen.mainScreen().bounds
        player.view.frame = CGRect(x: frame.size.width*0.10,y: frame.size.width/2, width:screenSize.width * 0.80, height: screenSize.width * 0.80)
        player.view.sizeToFit()
        player.scalingMode = MPMovieScalingMode.Fill
        player.fullscreen = true
        player.controlStyle = MPMovieControlStyle.None
        player.movieSourceType = MPMovieSourceType.File
        player.play()
        self.view?.addSubview(player.view)
        var timer = NSTimer.scheduledTimerWithTimeInterval(6.0, target: self, selector: Selector("update"), userInfo: nil, repeats: false)     
    }
}


// And Use the function to play Video
playVideoEffect()
于 2016-01-11T10:04:06.553 に答える