首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓: MediaPlayer无缝隙或无缝视频播放

安卓: MediaPlayer无缝隙或无缝视频播放
EN

Stack Overflow用户
提问于 2010-10-06 21:41:48
回答 6查看 10.5K关注 0票数 26

通过实现OnCompletionListener将数据源设置为不同的文件,我可以连续播放这些视频。那里没问题。我调用reset()并准备()很好。

我还没弄明白的是,如何消除数据源更改和新视频启动之间的1-2秒间隔屏幕闪烁。这个缺口显示了一个黑色的屏幕,而我还没有找到任何方法来绕过它。

我尝试将父视图的背景设置为图像,但它成功地绕过了这一点。即使SurfaceView是透明的(默认情况下是透明的)。我还尝试让多个视频文件在同一时间播放,并切换mediaplayer的显示时,其中一个结束,另一个应该开始。

我最后一次尝试的是,在视频“准备”的时候,在我暂时显示的背景中有第二个视图,并在视频准备开始时删除它。这也不是很完美。

有什么办法可以弥补这个缺口吗。在一个循环中运行一个视频非常好,并且做我想做的事情,唯一的例外是它正在查看同一个视频,而不是播放我选择的另一个视频。

main.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/background"
    android:layout_height="fill_parent">
    <SurfaceView
        android:id="@+id/surface"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center">
    </SurfaceView>
</FrameLayout>

Player.java

代码语言:javascript
复制
public class Player extends Activity implements
        OnCompletionListener, MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {
        private MediaPlayer player;
    private SurfaceView surface;
    private SurfaceHolder holder;

    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.main);
        surface = (SurfaceView)findViewById(R.id.surface);
        holder = surface.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    
    }

    public void onCompletion(MediaPlayer arg0) {
        File clip = new File(Environment.getExternalStorageDirectory(),"file2.mp4");
        playVideo(clip.getAbsolutePath());
    }
    public void onPrepared(MediaPlayer mediaplayer) {
        holder.setFixedSize(player.getVideoWidth(), player.getVideoHeight());
        player.start();
    }

    private void playVideo(String url) {
        try {
            File clip = new File(Environment.getExternalStorageDirectory(),"file1.mp4");

            if (player == null) {
                player = new MediaPlayer();
                player.setScreenOnWhilePlaying(true);
            }
            else {
                player.stop();
                player.reset();
            }
            player.setDataSource(url);
            player.setDisplay(holder);
            player.setOnPreparedListener(this);
            player.prepare();
            player.setOnCompletionListener(this);
        }
        catch (Throwable t) {
            Log.e("ERROR", "Exception Error", t);
        }
    }
EN

回答 6

Stack Overflow用户

发布于 2012-03-14 19:03:30

我也有同样的问题,下面的链接概述。

VideoView Disappears for a second when video is changed

但是,如果您尝试使用Android 4.0+ (ICS),则不会出现此问题。我开始将VideoView.java和MediaPlayer.java从4.0移植到我的应用程序,但这似乎很复杂,到目前为止还没有进展。基本上,这似乎是旧版本的本机代码中的一个bug。

票数 5
EN

Stack Overflow用户

发布于 2012-02-27 10:03:25

在浪费了太多的时间试图找出如何在没有“差距”的情况下播放连续的视频,我倾向于不可能。当然,除非您能够深入到本地级别并实现自己的播放器,否则Android的媒体播放器目前根本不支持无缝播放。

票数 3
EN

Stack Overflow用户

发布于 2012-02-28 08:04:49

我没有在MediaPlayer上进行视频播放,但是当一个流被中断时,我对音频文件做了一些类似的操作,因为用户已经从3G切换到Wifi。

我认为您所看到的延迟是当媒体播放器正在缓冲输入文件时。所以也许你可以在一开始就给两位球员下定义?您应该定义数据源,并为两位球员做好准备,但只能启动其中的一位。

然后,在您的onCompletionListener中,您可以翻转它们,而不是重置现有的数据源和设置新的数据源。

代码语言:javascript
复制
  player.release();
  player = flipPlayer;
  flipPlayer = null;
  player.start();

显然,您需要为flipPlayer使用不同的flipPlayer,或者将player.start()从onPrepare中删除。(既然你在同步地称呼它,我就不会认为这是个问题)。

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

https://stackoverflow.com/questions/3877119

复制
相关文章

相似问题

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