我正在制作一个可以显示视频的动态壁纸.一开始我认为这将非常困难,所以有些人建议使用OpenGL解决方案或其他非常复杂的解决方案(例如这个).
无论如何,为此,我发现了各种各样的地方,并且基于这个github库(它有一些bug),我终于得到了它的工作.
虽然我成功地显示了一个视频,但我无法找到控制它与屏幕分辨率相比如何显示的方法.
目前它总是被拉伸到屏幕尺寸,这意味着这个(从这里拍摄的视频):
得到如下:
原因是不同的宽高比:560x320(视频分辨率)与1080x1920(设备分辨率).
注意:我很清楚缩放视频的解决方案,这些解决方案可以在各种Github存储库中找到(例如这里),但我问的是一个动态壁纸.因此,它没有View,所以它对如何做事更加有限.更具体地说,解决方案不能具有任何类型的布局,TextureView或SurfaceView或任何其他类型的View.
我尝试使用SurfaceHolder的各种领域和功能,但到目前为止没有运气.例子:
setVideoScalingMode - 它要么崩溃要么不做任何事情.
改变surfaceFrame - 相同.
这是我目前的代码(这里有完整的项目):
class MovieLiveWallpaperService : WallpaperService() {
override fun onCreateEngine(): WallpaperService.Engine {
return VideoLiveWallpaperEngine()
}
private enum class PlayerState {
NONE, PREPARING, READY, PLAYING
}
inner class VideoLiveWallpaperEngine : WallpaperService.Engine() {
private var mp: MediaPlayer? = null
private var playerState: PlayerState = PlayerState.NONE
override fun onSurfaceCreated(holder: SurfaceHolder) {
super.onSurfaceCreated(holder)
Log.d("AppLog", "onSurfaceCreated")
mp = …Run Code Online (Sandbox Code Playgroud) 我录制的视频时间有限.现在我想获取所有视频帧.我使用下面的代码,并使用它,我能够得到帧,但我没有得到所有的视频帧.重复3到4帧然后我有一个不同的帧.但是众所周知,我们可以在一秒钟内获得25-30帧来显示流畅的视频.如何获得所有帧.
for (int i = 0; i < 30; i++) {
Bitmap bArray = mediaMetadataRetriever.getFrameAtTime(
1000000 * i,
MediaMetadataRetriever.OPTION_CLOSEST);
savebitmap(bArray, 33333 * i);
}
Run Code Online (Sandbox Code Playgroud)
我不想使用NDK.我得到这个链接不知道应该是什么值"argb8888".我在这里得到错误.任何人都可以解释如何做到这一点. 从Android中的视频图像中获取帧