在 TextureView 上播放时视频帧率低

Video is in low fps when playing on TextureView

我正在为 Android 应用创建视频过滤器,因此我正在使用 TextureView 播放视频并对其 SurfaceTexture 进行过滤。 但是视频的FPS总是低于原来的(30fps)。

我在 Galaxy S3 上查看过,onSurfaceTextureUpdated() 尽管有或没有过滤器,但每秒只能输入 5~8 次。但在更强大的设备上,如三星 Galaxy J,它可以增加到每秒 10~13 次

请注意,此视频是从 SD 卡加载的。

有人知道原因吗?

mVideoPlayer.reset();
mVideoPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mVideoPlayer.setDataSource(mVideoPath);
mVideoPlayer.setSurface(new Surface(surfaceTexture));
mVideoPlayer.setLooping(true); mVideoPlayer.prepareAsync();
mVideoPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    public void onPrepared(MediaPlayer mp) {mp.start(); }
});

如果从软件访问视频帧,则必须复制数据几次,这会降低 FPS。

如果您将视频直接发送到与 TextureView 关联的 Surface,您不会看到速度变慢,但您也没有机会对其进行过滤。 (Grafika 有基于 SurfaceView 和 TextureView 的视频播放器,在性能上没有明显差异。SurfaceView 的效率稍高,但并不显着。)

要以 30fps 的速度进行实时过滤,您可以使用 GPU,如 this example 中所示,尽管您可以使用它进行的操作有限制。

查看了更多的设备后,我发现导致这个问题的主要原因是内存。 所以我完成了之前的 activity 并在转到这个 activity 之前发布了数据。 然后视频的FPS在S3上增加到10+

谢谢,