You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用启动自动播放视频后,如何检测视频结束实现界面跳转?

检测视频播放完成并触发界面跳转的可行方案

以下是当前主流平台下,检测视频播放结束并自动跳转界面的有效实现方式:

Android(基于ExoPlayer)

目前Android官方推荐使用ExoPlayer处理视频播放,通过添加Player.Listener监听播放状态,当视频播放结束时触发界面跳转:

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.Player

class SplashVideoActivity : AppCompatActivity() {
    private lateinit var exoPlayer: ExoPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash_video)

        // 初始化ExoPlayer
        exoPlayer = ExoPlayer.Builder(this).build()
        val playerView = findViewById<com.google.android.exoplayer2.ui.PlayerView>(R.id.player_view)
        playerView.player = exoPlayer

        // 设置播放源
        val mediaItem = MediaItem.fromUri(Uri.parse("android.resource://${packageName}/${R.raw.splash_video}"))
        exoPlayer.setMediaItem(mediaItem)
        exoPlayer.prepare()

        // 添加播放状态监听
        exoPlayer.addListener(object : Player.Listener {
            override fun onPlaybackStateChanged(playbackState: Int) {
                super.onPlaybackStateChanged(playbackState)
                // 播放结束状态
                if (playbackState == Player.STATE_ENDED) {
                    // 跳转到主界面
                    startActivity(Intent(this@SplashVideoActivity, MainActivity::class.java))
                    finish()
                }
            }
        })

        // 自动播放
        exoPlayer.play()
    }

    override fun onDestroy() {
        super.onDestroy()
        exoPlayer.release()
    }
}

iOS(基于AVPlayer)

通过监听AVPlayerItemDidPlayToEndTimeNotification通知,捕获视频播放结束事件:

import UIKit
import AVFoundation

class SplashVideoViewController: UIViewController {
    private var player: AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        // 加载本地视频文件
        guard let videoPath = Bundle.main.path(forResource: "splash_video", ofType: "mp4") else { return }
        let videoURL = URL(fileURLWithPath: videoPath)
        let playerItem = AVPlayerItem(url: videoURL)
        player = AVPlayer(playerItem: playerItem)

        // 创建PlayerLayer并添加到视图
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = view.bounds
        playerLayer.videoGravity = .resizeAspectFill
        view.layer.addSublayer(playerLayer)

        // 监听播放结束通知
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(videoDidFinishPlaying),
            name: .AVPlayerItemDidPlayToEndTime,
            object: playerItem
        )

        // 自动播放
        player?.play()
    }

    @objc private func videoDidFinishPlaying() {
        // 跳转到主界面(示例用push方式,可根据需求用present或tabBar切换)
        let mainVC = MainViewController()
        navigationController?.pushViewController(mainVC, animated: true)
        // 移除通知监听
        NotificationCenter.default.removeObserver(self)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

Flutter(基于video_player插件)

利用VideoPlayerController的监听事件,对比播放进度和总时长判断是否播放结束:

import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class SplashVideoPage extends StatefulWidget {
  const SplashVideoPage({super.key});

  @override
  State<SplashVideoPage> createState() => _SplashVideoPageState();
}

class _SplashVideoPageState extends State<SplashVideoPage> {
  late VideoPlayerController _controller;
  bool _isVideoFinished = false;

  @override
  void initState() {
    super.initState();
    // 初始化视频控制器(本地视频示例)
    _controller = VideoPlayerController.asset('assets/splash_video.mp4')
      ..initialize().then((_) {
        setState(() {});
        // 自动播放
        _controller.play();
        // 添加监听
        _controller.addListener(_checkVideoFinish);
      });
  }

  void _checkVideoFinish() {
    if (_controller.value.isInitialized && 
        !_controller.value.isPlaying && 
        _controller.value.position >= _controller.value.duration && 
        !_isVideoFinished) {
      _isVideoFinished = true;
      // 跳转到主界面
      Navigator.pushReplacementNamed(context, '/main');
    }
  }

  @override
  void dispose() {
    _controller.removeListener(_checkVideoFinish);
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _controller.value.isInitialized
          ? Center(
              child: AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoPlayer(_controller),
              ),
            )
          : const Center(child: CircularProgressIndicator()),
    );
  }
}

内容的提问来源于stack exchange,提问作者Pacey Christensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:50:25