我想知道是否可以在不使用任何 UI 元素(SurfaceView、TextureView 等)的情况下从 ExoPLaye 解码的视频帧中获取像素数据。
我想在只包含一个顶级 GlSurfaceView 的游戏中显示视频帧。我想通过我的渲染线程而不是主 UI 线程上的常规 OpenGL ES 纹理来渲染视频帧。
目前我正在使用 Xamarin.Android,但任何关于“纯”Android 的想法也很棒!
以下是我努力实现目标的方式:
创建视频播放器及其媒体源
var videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(_bandwidthMeter); _trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); _player = ExoPlayerFactory.NewSimpleInstance(Application.Context, _trackSelector);DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter(); var dataSrcFacroty = new DefaultDataSourceFactory(Application.Context, "blablabla", bandwidthMeterA); var chunkSrcFactory = new DefaultDashChunkSource.Factory(dataSrcFacroty); var mediaSource = new HlsMediaSource(_uri, dataSrcFacroty, 1, null, null);
创建所需大小和格式的 OpenGL ES Texture2D 并保留其 texName。
GL.Enable(EnableCap.Texture2D); GL.GenTextures(1, _textures); GL.BindTexture(TextureTarget.Texture2D, _textures[0]); GL.TexImage2D( TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Width, Height, 0, OpenTK.Graphics.ES20.PixelFormat.Rgb, PixelType.UnsignedByte, _data); GL.BindTexture(TextureTarget.Texture2D, 0);
- 从中创建 SurfaceTexture 和 Surface
var st = new SurfaceTexture(_textures[0], true); _surface = new Surface(st);
- 将创建的 Surface 设置为播放器,并在准备好时启动它
_player.Prepare(mediaSource); _player.SetVideoSurface(_surface); _player.PlayWhenReady = true;
我的播放器处理视频,我听到声音并且可以通过附加的回调查看进度。我想毕竟我的纹理还应该包含解码的视频帧,但渲染它时我什么也看不到。
任何意见、建议和想法将不胜感激。