首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多个活动的MediaPlayer和SurfaceView

多个活动的MediaPlayer和SurfaceView
EN

Stack Overflow用户
提问于 2016-10-02 18:04:50
回答 1查看 248关注 0票数 0

我有一个媒体播放器在一个活动(称为播放器),我希望能够支持连续视频播放时,播放器是关闭成一个小型视图的父活动。

在只有音频的情况下,我能够很好地做到这一点,问题在于我通过mediaPlayer.setDisplay()附加了一个mediaPlayer.setDisplay;

我可以附加SurfaceView刚开始只是很好,但问题开始时,我关闭播放器活动。如果我不做任何更改,mediaPlayer就会以通常的无用错误(1,-19)被抛入错误状态。

当播放器setDisplay被销毁时,我尝试使用SurfaceView (Null),这似乎是有效的。但出于某种原因,它重置了视频流。为了弄清发生了什么,我尝试过重写seekTo(),但是没有调用seekTo()。我还把日志语句放在我能想到的任何地方,但没有触发任何东西。

为什么setDisplay(null)会导致我的视频流重新启动?

下面是我当前的MediaPlayer代码(一些奇怪的东西来自于我试图解决这个问题(比如isReallyPlaying()):

代码语言:javascript
运行
AI代码解释
复制
  private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private ScheduledFuture beeperhandle;

    private boolean isPaused = false;
    private BaseMedia currentMedia;

    private PlaybackService.RepeatStatus repeatStatus = PlaybackService.RepeatStatus.REPEAT_NONE;

    public void startMedia(BaseMedia model, Integer position) {
        Timber.d("Starting media");
        startBeeper();
        isPaused = false;
        lastBeep = -1;
        currentMedia = model;

        if (position != null) {
            seekTo(position);
        }
        super.start();
    }

    public BaseMedia getCurrentMedia() {
        return currentMedia;
    }



    @Override
    public void start() throws IllegalStateException {
        Timber.e("Invalid start called, should request startSong or startVideo");
    }

    private int lastBeep = -1;

    // Because isPlaying is returning false and canceling the beeper.  Probably has something to do with the surfaceview being destroyed
    private boolean isStillPlaying() {
        if (lastBeep != getCurrentPosition()) {
            lastBeep = getCurrentPosition();
            return true;
        }
        return false;
    }

    private final Runnable seekBarCheck = new Runnable() {
        public void run() {

            if (isStillPlaying() && !beeperhandle.isCancelled()) {
                EventBus.getDefault().post(new MusicStatusTimeEvent(
                        currentMedia, true, GevaldMediaPlayer.this));
            } else {
                Timber.d("Canceling Beeper, !isPlaying");
                beeperhandle.cancel(true);
            }
        }
    };

    private void startBeeper() {
        Timber.d("Starting Beeper");
        beeperhandle = scheduler.scheduleAtFixedRate(seekBarCheck, 100, 100, TimeUnit.MILLISECONDS);
    }

    @Override
    public void seekTo(final int msec) throws IllegalStateException {
        Timber.d("Seeking to " + msec);
        if (beeperhandle != null) {
            Timber.d("Canceling beeper in prep for seek");
            beeperhandle.cancel(true);
        }
        setOnSeekCompleteListener(new OnSeekCompleteListener() {
            @Override
            public void onSeekComplete(MediaPlayer mp) {
                Timber.d("Seek complete to: " + msec);
                startBeeper();
            }
        });
        super.seekTo(msec);
    }


    @Override
    public void stop() throws IllegalStateException {
        super.stop();
        Timber.d("Stopping media");
        doStop();
    }

    private void doStop() {
        if (beeperhandle != null) {
            Timber.d("Canceling beeper, doStop");
            beeperhandle.cancel(true);
        }
        isPaused = false;
    }

    @Override
    public void pause() throws IllegalStateException {
        Timber.d("Pause requested");
        if (beeperhandle != null) {
            Timber.d("Canceling beeper, pause");
            beeperhandle.cancel(true);
        }
        doStop();
        EventBus.getDefault().post(new MusicStatusStoppedEvent(this));
        super.pause();

    }

    public boolean isPaused() {
        return isPaused;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-05 19:17:05

弄明白了。显然,关闭某个活动会导致音频丢失,其值为AudioManager.AUDIOFOCUS_LOSS。

因为我是一个好的安卓公民,这是准备释放媒体播放器。但音频将被恢复,这将导致我的媒体播放器得到重置,因此从一开始。

这恰好发生在setDisplay()方法周围。

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

https://stackoverflow.com/questions/39823674

复制
相关文章
gridview列 数字、货币和日期 显示格式
在设置gridview等数据绑定控件的模版列时,总要设置显示的格式,这里是我查询一些资料后统计出来的。
Java架构师必看
2021/03/22
1.3K0
用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
全栈程序员站长
2022/07/09
1.7K0
日期、时间、PosixTime 和时间戳数据类型
可以定义日期、时间和时间戳数据类型,并通过标准 SQL 日期和时间函数相互转换日期和时间戳。例如,可以使用 CURRENT_DATE 或 CURRENT_TIMESTAMP 作为使用该数据类型定义的字段的输入,或者使用 DATEADD、DATEDIFF、DATENAME 或 DATEPART 来操作使用该数据类型存储的日期值。
用户7741497
2022/08/02
1.8K0
MySQL数据类型--日期时间
  自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是有一定的了解的。在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来认认真真的研究学习。最近在图书馆借了一本关于MysQL的书籍,打算全面的学习研究一遍。
那一叶随风
2018/08/22
3.3K0
MySQL数据类型--日期时间
Oracle sqlldr 如何导入一个日期列
本文介绍了如何使用 Oracle 的 sqlldr 导入工具,将日期列正确地导入到目标表中。首先,作者介绍了如何使用 sqlldr 导入数据,并指出了在遇到日期列时需要采取的特殊处理方式。接下来,作者演示了如何使用 sqlldr 的控制文件来指定日期列的格式。通过使用这种控制文件,可以轻松地将日期列导入到目标表中。
用户1148526
2018/01/03
9480
日期和时间构造
这些构造采用 ODBC 日期、时间或时间戳格式的整数或字符串,并将其转换为相应的 IRIS 日期、时间或时间戳格式。他们执行数据输入以及值和范围检查。
用户7741497
2022/08/02
2.1K0
python日期和时间
python中常用的处理时间的模块有两个:time 模块、datetime 模块,time模块是比较基础的一个模块,可满足对时间类型数据的基本处理;而 datetime模块可以看做是 对time模块的一个高级封装,功能更加强大,例如在时间的加减上(获取指定时间的前(后)一天的时间,获取指定时间的前(后)一小时的时间),使用datetime模块,实现起来更为方便~
py3study
2020/01/03
2.3K0
python日期和时间
[快学Python3]日期和时间处理
概述 在python中, date、time、datetime类提供了一系列处理日期、时间和时间间隔的函数。 在Python里我们大致可以把其实现日期时间类分为5个: date 仅用于日期处理(年、月、日) time 仅用于时间处理(时、分、秒、毫秒) datetime 可以处理日期和时间的组合(年、月、日、时、分、秒、毫秒) timedelta 日期时间处理,可以用于时间运算等 tzinfo 用于时区处理 下面我们一起看几个实例来看看上述几个类的应用,在本文中不会列举所有的应用方法。 基础实例 直接上代码
苦叶子
2018/04/09
2.1K0
linux 时间和日期
date 查看系统时间(默认) date +“%Y-%m-%d %H:%M:%S” 查看系统时间(指定格式) date -s “时间字符串” 设置系统时间
云缓缓知我意
2021/04/15
4.3K0
Python 日期和时间
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。
Python知识大全
2020/02/13
2K0
MySQL数据类型 -- 日期时间型
版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。 https://blog.csdn.net/robinson_0612/article/details/82824107
Leshami
2018/09/28
8940
MySQL数据类型 -- 日期时间型
linux 日期转换时间戳_oracle日期转13位时间戳
4. 指定日期格式转换:date -d @1614592163 +”%Y-%m-%d %H:%M:%S”
全栈程序员站长
2022/11/11
6.3K0
js时间戳转换日期格式和日期计算
一、时间戳转换日期 1 function formatDate(datetime) { 2 // 获取年月日时分秒值 slice(-2)过滤掉大于10日期前面的0 3 var year = datetime.getFullYear(), 4 month = ("0" + (datetime.getMonth() + 1)).slice(-2), 5 date = ("0" + datetime.getDate()).
半指温柔乐
2018/09/11
29.3K0
为Qt程序获取编译日期时间
利用__DATE__与__TIME__编译宏特性为Qt程序添加编译日期时间。 static const QDateTime buildDateTime() { QString dateTime; dateTime += __DATE__; dateTime += __TIME__; return QLocale(QLocale::English).toDateTime(dateTime, "MMM dd yyyyhh:mm:ss"); } 另外,下列代码并不能获取编译日期时
Qt君
2019/08/05
2.7K0
MySQL日期和时间函数
WEEK(DATE):返回所给的日期是一年中的第几周 YEAR(DATE):返回所给的日期是哪一年 HOUR(time):返回所给时间的小时 MINUTE(time):返回所给时间的分钟
秋白
2019/02/21
4K0
MySQL日期和时间函数
Excel 日期和时间函数[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168355.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
1.8K0
Excel 日期和时间函数[通俗易懂]
【mysql】日期和时间函数
GET_FORMAT函数中date_type和format_type参数取值如下:
兮动人
2022/03/15
4.8K0
[C#] 日期和时间库 NodaTime
Github:https://github.com/nodatime/nodatime(opens new window)
科控物联
2023/10/06
1.1K0
[C#] 日期和时间库 NodaTime
如何在PowerBI中同时使用日期表和时间表
首先,由于日期表和时间表不能叠加在一起(原因在前文说过了),所以肯定是两张表单独和事实表进行关联,而事实表中日期和时间是在同一列。
陈学谦
2020/07/01
8.8K0
如何在PowerBI中同时使用日期表和时间表
点击加载更多

相似问题

C# XML将数组字符串序列化/反序列化为数组元素名称

21

将xml序列化为c#类时出错

13

将字典序列化为XML C#

11

将C#表单序列化为XML

33

将c#类序列化为xml

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文