1

iOSでアプリを操作しているときに、AVPlayerを使用してビデオを再生し、以下を使用してスライダーをplayerItemの現在の継続時間と同期しています。

//synchronizing the current time label and slider with the player.
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 100) queue:dispatch_get_main_queue() usingBlock:^(CMTime time)

{
    CMTime endTime = CMTimeConvertScale (self.player.currentItem.asset.duration, self.player.currentTime.timescale, kCMTimeRoundingMethod_RoundHalfAwayFromZero);
    if (CMTimeCompare(endTime, kCMTimeZero) != 0) {
        double normalizedTime = (double) self.player.currentTime.value / (double) endTime.value;
        self.slider.value = normalizedTime;
    }
    Float64 currentSeconds = CMTimeGetSeconds(self.player.currentTime);
    int mins = currentSeconds/60.0;
    int secs = fmodf(currentSeconds, 60.0);
    NSString *minsString = mins < 10 ? [NSString stringWithFormat:@"0%d", mins] : [NSString stringWithFormat:@"%d", mins];
    NSString *secsString = secs < 10 ? [NSString stringWithFormat:@"0%d", secs] : [NSString stringWithFormat:@"%d", secs];
    self.currentTimeLabel.text = [NSString stringWithFormat:@"%@:%@", minsString, secsString];
}];

問題は、モーダルビューでビデオを再生していることです。ボタンを押してビューコントローラーを閉じると、ビューコントローラーは閉じますが、ビデオはバックグラウンドで再生され続けます(アセットのオーディオが聞こえる場合)。どうすればそれを解決できますか?使用しているキューと関係があると思いますが、メインキューと並行キューの両方を試しましたが、毎回同じ結果になります。

4

1 に答える 1

0

AVAssetReaderメソッドを呼び出して停止する必要があると思いますcancelReading

Doc:

cancelReading

バックグラウンド作業をキャンセルし、レシーバーの出力がそれ以上のサンプルを読み取れないようにします。

  • (void)cancelReadingディスカッション時間範囲の終わりに達する前にレシーバーからのサンプルの読み取りを停止する場合は、このメソッドを呼び出して、進行中の可能性があるバックグラウンドの先読み操作を停止する必要があります。

また、モーダルビューを閉じるときremoveTimeObserverの方法を使用する必要があります。AVPlayer

pause持っていない場合はAVPlayerの方法もありますAVAssetReader

于 2012-11-06T15:06:41.640 に答える