web-dev-qa-db-ja.com

バックグラウンドでAvplayerを使用してビデオを再生することは可能ですか?

Avplayerを使用してビデオクリップを表示していますが、戻ると(バックグラウンドでアプリ)ビデオが停止します。ビデオを再生し続けるにはどうすればよいですか?

バックグラウンドタスクとバックグラウンドスレッドについて検索しました。IOSはバックグラウンドの音楽のみをサポートします(ビデオではありません) http://developer.Apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow .html

これは、バックグラウンドでのビデオの再生に関するいくつかの議論です

1) https://discussions.Apple.com/thread/2799090?start=0&tstart=

2) http://www.cocoawithlove.com/2011/04/background-audio-through-ios-movie.html

しかし、AppStoreには、バックグラウンドでビデオを再生するアプリがたくさんあります。

Swift Player: https://iTunes.Apple.com/us/app/Swift-player-speed-up-video/id545216639?mt=8&ign-mpt=uo%3D2

SpeedUpTV: https://iTunes.Apple.com/ua/app/speeduptv/id386986953?mt=8

18
Vishal Khatri

このメソッドは、すべての可能性をサポートします。

  • ユーザーによって画面がロックされています。
  • リストアイテム
  • ホームボタンが押されました。

IOSを実行しているAVPlayerのインスタンスがある限り、デバイスの自動ロックを防ぎます。

まず、UIBackgroundModes配列にオーディオ要素を追加するInfo.plistファイルからオーディオバックグラウンドをサポートするようにアプリケーションを構成する必要があります。

次に、AppDelegate.mをに入れます

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:

これらの方法

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

および#import <AVFoundation/AVFoundation.h>

次に、AVPlayerを制御するViewControllerで

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

そして

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

次に、

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

ユーザーがホームボタンを押した場合に再生を再開するには、別のトリックが必要です(この場合、再生はフェードアウトで中断されます)。

ビデオの再生を制御する場合(再生方法があります)セット

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];

タイマーを起動して再生を再開する、呼び出される対応するメソッド。

- (void)applicationDidEnterBackground:(NSNotification *)notification
{
    [mPlayer performSelector:@selector(play) withObject:nil afterDelay:0.01];
}

それは私がBackgorundでビデオを再生するのに役立ちます。ありがとうございます。

13
Vishal Khatri

バックグラウンドモードを変更しようとした場合:申し訳ありませんが、App Storeはそれを承認しません。 YouTubeのバックグラウンドに移動した後のMPMoviePlayerViewController再生ビデオ

私の研究では、ビデオが一時停止し、フォアグラウンドに入ると再生を再開するための再生時間を取得するため、誰かがサウンドトラックを取り出してバックグラウンドに入るときにバックグラウンドで再生します

3
Horst

受け入れられた答えのための迅速なバージョン。

代理人の場合:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)

AVPlayerを制御するViewController内

override func viewDidAppear(animated: Bool) {
    UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()
}

override func viewWillDisappear(animated: Bool) {
    mPlayer.pause()
    UIApplication.sharedApplication().endReceivingRemoteControlEvents()
    self.resignFirstResponder()
}

「AVFoundationをインポートする」ことを忘れないでください

2
MXV

このスニペットを試してみてください、私はすでにこれを私のアプリと統合しました、そしてそれは私にとって有用です..これがあなたのために働くことを願っています!!

以下の手順に従ってください。

  • APPNAME-Info.plistにUIBackgroundModesを追加し、アプリがオーディオを再生するように選択します
  • 次に、AudioToolBoxフレームワークをフォルダーフレームワークに追加します。
  • APPNAMEAppDelegate.hに以下を追加します。

    --#import < AVFoundation/AVFoundation.h>

    --#import < AudioToolbox/AudioToolbox.h>

  • APPNAMEAppDelegate.mに以下を追加します。

    // AudioSessionを設定します

     NSError *sessionError = nil;
    
        [[AVAudioSession sharedInstance] setDelegate:self];
    
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
    
  • / *それらのいずれかを選択してください* /

  • // 1。出力オーディオルートをオーバーライドする

// UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; // AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute、sizeof(audioRouteOverride)、&audioRouteOverride);

================================================= ======================

// 2。デフォルトの出力オーディオルートを変更する

UInt32 doChangeDefaultRoute = 1;

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute);

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  • しかし、2行の前:

    [self.window addSubview:viewController.view];

    [self.window makeKeyAndVisible];

プログラミングをお楽しみください!

2

Avplayerを使用してバックグラウンドミュージック/ビデオを再生することはできません。しかし、それを使用することは可能です

MPMoviePlayerViewController。私はこのプレーヤーとこのアプリを使用して私のアプリの1つでこれを行いました

appstoreに対して正常に実行されます。

2
Vishal

Fattomhkの応答に加えて、アプリケーションがフォアグラウンドになった後のあるべき時間にビデオ転送を実現するためにできることは次のとおりです。

  • バックグラウンドに移動してビデオを再生するcurrentPlaybackTimeを取得し、lastPlayBackTimeに保存します
  • アプリケーションがバックグラウンドに移行する時間を保存します(おそらくuserDefaultに)
  • もう一度、アプリケーションがフォアグラウンドに来る時間を取得します
  • バックグラウンド時間とフォアグラウンド時間の間のdurationを計算します
  • ビデオの現在の再生時間をlastPlayBackTime + durationに設定します
1
rptwsthi

なんらかの理由で犯人になってしまったものを付け加えたいと思います。私は長い間AVPlayerとバックグラウンドプレイを問題なく使用していましたが、今回はそれを機能させることができませんでした。

バックグラウンドに移動すると、rateAVPlayerプロパティが0.0に低下する(つまり一時停止する)ように見えることがあることがわかりました。そのため、レートプロパティをKVOで確認する必要があります。常に、または少なくともバックグラウンドに行くとき。レートが0.0を下回り、ユーザーが再生したいと考えられる場合(つまり、ユーザーがリモコンで一時停止を意図的にタップしなかった、ムービーが終了したなど)、AVPlayerで.play()を再度呼び出す必要があります。 。

AFAIKには、アプリがバックグラウンドに移行したときにAVPlayerが一時停止しないようにするための他のトグルはありません。

0
Jonny

WebViewを使用してビデオを再生している場合は、JavaScriptを使用してバックグラウンドでビデオを再生できます。

strVideoHTML = @"<html><head><style>body.........</style></head> <body><div id=\"overlay\"><div id=\"youtubelogo1\"></div></div><div id=\"player\"></div> <script> var tag = document.createElement('script'); tag.src = \"http://www.youtube.com/player_api\"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var player; events: { 'onReady': onPlayerReady, } }); } function onPlayerReady(event) { event.target.playVideo(); } function changeBG(url){ document.getElementById('overlay').style.backgroundImage=url;} function manualPlay() {  player.playVideo(); }  function manualPause() {  player.pauseVideo(); }  </script></body> </html>";

NSString *html = [NSString stringWithFormat:strVideoHTML,url, width, height,videoid;
webvideoView.delegate = self;
[webvideoView loadHTMLString:html baseURL:[NSURL URLWithString:@"http://www.your-url.com"]];

ビューで消える呼び出し

strscript = @"manualPlay();
[webvideoView stringByEvaluatingJavaScriptFromString:strscript];
0
Gopal Raju