Mik*_*iko 5 video android playback android-mediaplayer textureview
使用TextureView 内的MediaPlayer 来播放视频,它可以工作。
当一个视频结束并且应该播放另一个视频时,我会调整 TextureView 的大小以适应即将播放的视频的宽高比(例如 - 从 3:4 到 9:16 等等......)。
问题是,第一个视频结束后,它的最后一帧仍然显示,然后调整了TextureView的大小,第一个视频的最后一帧仍然保留了一瞬间,但现在宽高比很差,第二个视频播放得很好。
显示(尺寸 X 尺寸)矩形的视频图像:
图片1:视频1,(3:4):

Image2:视频 1,这里我们位于 2 个视频之间,视频 1 的最后一帧,调整大小后现在位于 (9:16),但矩形看起来很糟糕。下图瞬间显示:

图片 3:视频 2,(9:16),播放良好,但在显示图片 2 片刻后:

所使用的代码没有什么特别的,以下是其中的一些部分:
// To init the TextureView and MediaPlayer:
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
m_MediaPlayer = new MediaPlayer();
m_Surface = new Surface(surfaceTexture);
m_MediaPlayer.setSurface(m_Surface);
}
m_TextureView.setSurfaceTextureListener(this);
// To Resize:
LayoutParams layoutParams = new FrameLayout.LayoutParams(newTVWidth, newTVHeight);
layoutParams.gravity = Gravity.CENTER;
m_TextureView.setLayoutParams(layoutParams);
// To play:
m_MediaPlayer.reset();
m_MediaPlayer.setDataSource(videoFilePath);
m_MediaPlayer.prepare();
// <--- Here comes a call to "To Resize" which is shown right above this code
m_MediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
也许你有几个选择。
理论上,您可以通过断开媒体播放器的连接、使用 GLES 清除 Surface,然后再次连接媒体播放器来清除 Surface。请参阅Grafika 的PlayMovieSurfaceActivityclickPlayStop()中的和。这使用 MediaCodec,而不是 MediaPlayer,所以我不确定它将如何翻译。clearSurface()
另一种选择是使用TextureView 变换而不是自定义框架布局来设置宽高比。因为您的布局没有改变,所以不会出现扭曲的帧。请参阅PlayMovieActivityadjustAspectRatio()中的示例。