Android:MediaPlayer 无缝或无缝视频播放

标签 android video media-player

我可以通过实现 OnCompletionListener 将数据源设置为不同的文件来很好地播放视频。那里没有问题。我调用 reset()prepare() 就好了。

我一直想不通的是,如何摆脱数据源更改和新视频启动之间的 1-2 秒间隙屏幕闪烁。间隙显示黑屏,我还没有找到任何绕过它的方法。

我尝试将父 View 的背景设置为图像,但它设法绕过了它。即使 SurfaceView 是透明的(默认情况下是透明的。)我也尝试过同时播放多个视频文件,并在一个结束时切换媒体播放器的显示,另一个应该开始。

我尝试的最后一件事是在视频“准备”时在背景中临时显示第二个 View ,并在视频准备好开始时将其删除。这也不是很无缝。

有什么办法可以消除这种差距。在循环中运行视频效果非常好,并且完全符合我的要求,只是它正在查看相同的视频,而不是播放我选择的其他视频。

ma​​in.xml

<?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

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);
        }
    }

最佳答案

我也有同样的问题,如下链接所述

VideoView Disappears for a second when video is changed

但如果您尝试使用 Android 4.0+ (ICS),则不会出现此问题。我开始将 VideoView.java 和 MediaPlayer.java 从 4.0 移植到我的应用程序,但这似乎很复杂,直到现在还没有运气。基本上它似乎是旧版本的 native 代码中的一个错误。

关于Android:MediaPlayer 无缝或无缝视频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877119/

相关文章:

java - tensorflow float32的转换与java对象不兼容

android - 奇怪的 ClassCastException : ImageView cannot be cast to ListView

android - 从 ColorOS 的任务管理器中删除应用程序时后台服务被杀死

linux - ffmpeg img to video = 找不到带路径的文件

java - 使用默认媒体播放器播放流视频

Android MediaPlayer 错误 : MediaPlayer error(1, -2147483648) 来自互联网的 Stream

android - Firebase 跟踪显示错误的中位时间延迟?

video - ffmpeg转码为直播流

ios - AVPlayer 帧动画

java - MediaPlayer - 切换歌曲之间的时间很长