应用启动自动播放视频后,如何检测视频结束实现界面跳转?
检测视频播放完成并触发界面跳转的可行方案
以下是当前主流平台下,检测视频播放结束并自动跳转界面的有效实现方式:
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
相关产品推荐
相关产品推荐

