根据其他问题android-video-as-a-live-wallpaper,在动态壁纸中播放视频的唯一方法是自己解码吗?
4 回答
只需使用 MediaPlayer 代替 VideoView 并使用 MediaPlayer.setSurface 代替 MediaPlayer.setDisplay。如果您使用 setDisplay,MediaPlayer 会尝试告诉 SurfaceHolder 保留不允许 LiveWallpapers 使用的屏幕,并会引发错误。
我使用 WebM/vpx8 视频,但这应该适用于 MediaPlayer 支持的任何内容(只需将视频文件放在 res/raw 中)
package com.justinbuser.nativecore;
import android.media.MediaPlayer;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;
import com.justinbuser.android.Log;
public class VideoWallpaperService extends WallpaperService
{
protected static int playheadTime = 0;
@Override
public Engine onCreateEngine()
{
return new VideoEngine();
}
class VideoEngine extends Engine
{
private final String TAG = getClass().getSimpleName();
private final MediaPlayer mediaPlayer;
public VideoEngine()
{
super();
Log.i( TAG, "( VideoEngine )");
mediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.wallpapervideo);
mediaPlayer.setLooping(true);
}
@Override
public void onSurfaceCreated( SurfaceHolder holder )
{
Log.i( TAG, "onSurfaceCreated" );
mediaPlayer.setSurface(holder.getSurface());
mediaPlayer.start();
}
@Override
public void onSurfaceDestroyed( SurfaceHolder holder )
{
Log.i( TAG, "( INativeWallpaperEngine ): onSurfaceDestroyed" );
playheadTime = mediaPlayer.getCurrentPosition();
mediaPlayer.reset();
mediaPlayer.release();
}
}
}
只是跳出框框思考,是否可以在 Android 的 Java 窗口下获取一个正常工作的视频播放器并将其重新设置为父级?我没有在 Linux 或 Android 中这样做,但在 Windows 下,可以获取正在运行的应用程序的窗口句柄并使其成为 Java 框架的子框架,结果其他应用程序的窗口看起来就像它的 Java 的一部分应用。
我已经尝试过 Justin Buser 解决方案,但它不起作用(在 API 16 设备上测试),还在https://github.com/thorikawa/AndroidExample/tree/master/MovieLiveWallpaper/上找到了类似的代码;它也不起作用。唯一的解决方案似乎是将 FFMPEG 与 NDK 一起使用。例如:https ://github.com/frankandrobot