处于暂停状态时,Android的MediaPlayer setSurface

woo

编辑

因此,显然这与多个活动无关,并且与视频文件的编码有关。

我将尝试简化问题:我有一个处于暂停状态的MediaPlayer对象,当我打电话时mediaPlayer.getCurrentPosition()我得到的结果是准确的。当我在该对象上调用mediaPlayer.setSurface()(使用不同的表面)时mediaPlayer.play(),视频的播放位置与getCurrentPosition()返回的位置不同。我正在API> = ICE_CREAM_SANDWICH上进行测试。

  • 使用项目中的本地资源和通过网络流进行了测试,结果:无差异。

链接到视频文件:http : //wpc.4ba9.edgecastcdn.net/804BA9/testenvmedia/m_8705_LuS3w7ctSZjB.mov.bs.mp4


我有两个活动,活动A和活动B。

活动-A播放视频从远程流的TextureView使用MediaPlayer,它也拥有一个按钮,谁的目的是:

  1. 调用mediaPlayer.pause();

  2. 打开活动B。

Activity-B还持有一个TextureView应该使用相同MediaPlayer对象在其当前位置播放相同视频的

活动-一个onCreate方法:

    textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {        
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int w, int h) {
            try {
                final MediaPlayer mediaPlayer = MyApplication.getMediaPlayer();
                mediaPlayer.setDataSource(context, videoURI);
                mediaPlayer.setSurface(new Surface(surfaceTexture));
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mediaPlayer.setLooping(shouldLoop);
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });

                mediaPlayer.prepareAsync();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
    });

    btnFullScreen.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {     
        Log.e("WHATEVER", ">>> pause video at " + MyApplication.getMediaPlayer().getCurrentPosition());
        MyApplication.getMediaPlayer().pause();
        Intent intent = new Intent(getActivity(), ActivityB.class);
        startActivity(intent);
    }});

Activity-B的onCreate方法:

        textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int w, int h) {
            MediaPlayer mediaPlayer = MyApplication.getMediaPlayer();
            mediaPlayer.setSurface(new Surface(surface));

            Log.e("WHATEVER", ">>> resume video at " + mediaPlayer.getCurrentPosition());
            mediaPlayer.start();
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        }
    });

LogCat输出:

10-10 17:33:15.966  13886-13886/com.whatever.android.debug E/WHATEVER﹕ >>> pause video at 1958
10-10 17:33:16.817  13886-13886/com.whatever.android.debug E/WHATEVER﹕ >>> resume video at 1958

因此,即使看起来MediaPlayer将从该确切位置恢复播放,我对不同的视频也会有不同的行为,每当我尝试在Activity-B中播放这些视频时,它们大多数都从完全相同的帧开始,而一个视频从在最开始的时候,其他人每次都在其他时间开始。

从Android的MediaPlayer.SetSurface()方法文档中

This method can be called in any state and calling it does not change the object state.

任何帮助将不胜感激。谢谢!

Eluzix

看来您的问题出在此特定视频上,更多关键帧将帮助播放器更准确地恢复播放。

尝试使用ffmpeg和libx264再次重新编码,尝试添加以下参数:

-g=25 -keyint_min=25

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的请求处于循环状态而被暂停?

来自分类Dev

可以检测MediaPlayer的暂停状态吗?

来自分类Dev

Mediaplayer:在状态1中调用暂停-Android Eclipse

来自分类Dev

应用程序处于后台状态时暂停计时器Swift

来自分类Dev

iOS-如何在应用程序处于活动状态和非活动状态时通过自定义声音发出警报并暂停

来自分类Dev

进程处于阻塞/暂停状态时是否将其保留在主内存中?

来自分类Dev

屏幕关闭并再次打开时,Android处于丢失状态

来自分类Dev

C#如何在Form2处于活动状态时暂停Form1?

来自分类Dev

如何了解Android的setDisplay / setSurface / setPrewviewDisplay / setPreviewTexture的底层

来自分类Dev

Android SwitchCompat处于关闭状态时不呈现轨迹

来自分类Dev

应用处于后台状态时无法暂停游戏

来自分类Dev

当配置更改时处于暂停模式时,如何显示android媒体播放器的前一帧

来自分类Dev

NavHost未处于活动状态时,Android导航findNavController

来自分类Dev

处于暂停状态时,Android的MediaPlayer setSurface

来自分类Dev

CLBeacon处于应用暂停状态

来自分类Dev

Mediaplayer:在状态1中调用暂停-Android Eclipse

来自分类Dev

UBI在启动前处于“暂停”状态

来自分类Dev

回到活动状态时,Mediaplayer

来自分类Dev

笔记本电脑突然暂停时处于关闭状态

来自分类Dev

在“顶层”窗口处于活动状态时(直到其销毁),暂停动画循环吗?

来自分类Dev

当iOS应用处于暂停状态时,如何处理SignificantLocation更改?

来自分类Dev

Android MediaPlayer不会暂停

来自分类Dev

当手机处于静音状态时,mediaPlayer.setVolume无法正常工作

来自分类Dev

蓝牙处于活动状态时如何暂停/睡眠?

来自分类Dev

Android AIDL:当服务处于另一个进程中时,如何使服务实例处于活动状态?

来自分类Dev

Chromecast自定义接收器:视频元素处于暂停状态时,当前显示的视频元素帧未更新为新位置的帧

来自分类Dev

在状态8中调用MediaPlayer暂停

来自分类Dev

有没有什么解决方案可以在 iPhone 进入睡眠状态时暂停 NSURLSessionTask 并在 iPhone 处于活动状态时恢复

来自分类Dev

处于暂停状态时活动会发生什么?

Related 相关文章

  1. 1

    为什么我的请求处于循环状态而被暂停?

  2. 2

    可以检测MediaPlayer的暂停状态吗?

  3. 3

    Mediaplayer:在状态1中调用暂停-Android Eclipse

  4. 4

    应用程序处于后台状态时暂停计时器Swift

  5. 5

    iOS-如何在应用程序处于活动状态和非活动状态时通过自定义声音发出警报并暂停

  6. 6

    进程处于阻塞/暂停状态时是否将其保留在主内存中?

  7. 7

    屏幕关闭并再次打开时,Android处于丢失状态

  8. 8

    C#如何在Form2处于活动状态时暂停Form1?

  9. 9

    如何了解Android的setDisplay / setSurface / setPrewviewDisplay / setPreviewTexture的底层

  10. 10

    Android SwitchCompat处于关闭状态时不呈现轨迹

  11. 11

    应用处于后台状态时无法暂停游戏

  12. 12

    当配置更改时处于暂停模式时,如何显示android媒体播放器的前一帧

  13. 13

    NavHost未处于活动状态时,Android导航findNavController

  14. 14

    处于暂停状态时,Android的MediaPlayer setSurface

  15. 15

    CLBeacon处于应用暂停状态

  16. 16

    Mediaplayer:在状态1中调用暂停-Android Eclipse

  17. 17

    UBI在启动前处于“暂停”状态

  18. 18

    回到活动状态时,Mediaplayer

  19. 19

    笔记本电脑突然暂停时处于关闭状态

  20. 20

    在“顶层”窗口处于活动状态时(直到其销毁),暂停动画循环吗?

  21. 21

    当iOS应用处于暂停状态时,如何处理SignificantLocation更改?

  22. 22

    Android MediaPlayer不会暂停

  23. 23

    当手机处于静音状态时,mediaPlayer.setVolume无法正常工作

  24. 24

    蓝牙处于活动状态时如何暂停/睡眠?

  25. 25

    Android AIDL:当服务处于另一个进程中时,如何使服务实例处于活动状态?

  26. 26

    Chromecast自定义接收器:视频元素处于暂停状态时,当前显示的视频元素帧未更新为新位置的帧

  27. 27

    在状态8中调用MediaPlayer暂停

  28. 28

    有没有什么解决方案可以在 iPhone 进入睡眠状态时暂停 NSURLSessionTask 并在 iPhone 处于活动状态时恢复

  29. 29

    处于暂停状态时活动会发生什么?

热门标签

归档