首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何同时播放视频和音频,在Android中异步播放

如何同时播放视频和音频,在Android中异步播放
EN

Stack Overflow用户
提问于 2022-11-08 16:33:19
回答 1查看 35关注 0票数 0

我正在尝试实现以下功能,用于健身android应用程序:

  1. 一个倒计时定时器被设置并计数下来的时间(比如说从30秒到0秒)。
  2. 从计时器启动的那一刻起,一个可重复的练习静音视频就开始在循环中播放,直到计时器达到0,下一个运动视频出现在那里,计时器被重新设置为30次倒计时。
  3. 当计时器运行时,音频与视频同时播放,以向用户指示各种事情(即。“开始锻炼”、"3-2-1“、”下一个练习“等)

我的问题是,你如何将视频和音频结合起来?对于视频,我使用ExoPlayer。ExoPlayer和SoundPool相结合对音频有好处吗?我是否应该为这两种情况创建多个ExoPlayer实例(如果是的话,我应该将AudioPlayer实例绑定到什么)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-15 14:03:50

根据的说法,我发现最好的解决方案是使用ExoPlayer来播放视频,使用SoundPool来表示短音频。

我使用一个观察者函数来侦听计时器事件(即勾选== 4000),并在每次事件发生时使用soundPool.play()。

对于视频,我收听计时器事件(播放、暂停、停止)并使用videoPlayer.play()。

参见下面的代码作为示例:

代码语言:javascript
复制
    private fun subscribeObservers() {
    viewLifecycleOwner.lifecycleScope.launch {
        viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {

            launch {
                sharedViewModel.timer.tick.collect { tick ->
                    // tick can only be multiple of 1000
                    if (tick == 0L) {
                        binding.startWorkoutTvTimer.text = ""
                    } else {
                        binding.startWorkoutTvTimer.text = (tick / 1000).toString()
                    }

                    if (tick == 4000L) {
                        sharedViewModel.soundPool?.play(sharedViewModel.countdownSoundId, 1F, 1F, 0, 0, 1F)
                    }

                    // SoundPool needs to be preloaded from previous Fragment
                    if (tick == 10000L) {
                        if (sharedViewModel.currentExercise == 0) {
                            sharedViewModel.soundPool?.play(sharedViewModel.beginWorkoutSoundId, 1F, 1F, 1, 0, 1F)

                        } else {
                            sharedViewModel.soundPool?.play(sharedViewModel.goSoundId, 1F, 1F, 1, 0, 1F)
                        }

                    }
                }
            }


            launch {
                sharedViewModel.timer.timerMode.collect { playerMode ->
                    when (playerMode) {
                        TimerMode.PLAYING -> {
                            binding.startWorkoutBtnPause.setBackgroundResource(R.drawable.ic_baseline_pause_24)
                            videoPlayer?.play()
                        }

                        TimerMode.PAUSED -> {
                            binding.startWorkoutBtnPause.setBackgroundResource(R.drawable.ic_baseline_play_arrow_24)
                            videoPlayer?.pause()
                        }

                        TimerMode.STOPPED -> {
                        }
                    }
                }
            }


        }

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74364126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档