首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓的MediaPlayer setSurface在暂停状态时

安卓的MediaPlayer setSurface在暂停状态时
EN

Stack Overflow用户
提问于 2013-10-10 15:01:50
回答 2查看 3.1K关注 0票数 6

编辑

很明显,这与多个活动无关,这与视频文件的编码有关。

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

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

链接到视频文件:LuS3w7ctSZjB.mov.bs.mp4

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

Activity使用TextureView播放从远程流到MediaPlayer的视频,它还包含一个按钮,该按钮的目的是:

  1. 调用mediaPlayer.pause();
  2. 开放活动-B。

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

活动--一种onCreate方法:

代码语言:javascript
复制
    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);
    }});

活动-B onCreate方法:

代码语言:javascript
复制
        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输出:

代码语言:javascript
复制
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似乎要从这个位置恢复,但对于不同的视频,我会得到不同的行为,每次我尝试播放活动中的视频时,大多数视频都是从同一帧开始的--B,一段视频是从一开始就开始的,另一段视频则是在另一个时间点开始的。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-17 13:03:19

似乎你的问题是这个特定的视频,更多的关键帧将帮助玩家更准确地恢复播放。

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

代码语言:javascript
复制
-g=25 -keyint_min=25
票数 8
EN

Stack Overflow用户

发布于 2013-10-17 01:50:46

尝试使用MediaPlayer将您的Intent.putExtra()位置从活动A传递到活动B。因此,基本上,在活动A中,您称之为启动活动B的意图,您可以这样做:

代码语言:javascript
复制
 public void onClick(View v) {     
    Log.e("WHATEVER", ">>> pause video at " + MyApplication.getMediaPlayer().getCurrentPosition());
    MyApplication.getMediaPlayer().pause();
    int position = MyApplication.getMediaPlayer().getCurrentPosition(); //new line added
    Intent intent = new Intent(getActivity(), ActivityB.class);
    intent.putExtra("position", position); //another new line of code
    startActivity(intent);
}

现在,在活动B中,在调用start之前,要找到mediaplayer被暂停的位置,如下所示:

代码语言:javascript
复制
@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.seekTo(getIntent().getExtras().getInt("position"));// new line of code
        mediaPlayer.start();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19299412

复制
相关文章

相似问题

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