我想知道是否可以在不使用任何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);
var st = new SurfaceTexture(_textures[0], true); _surface = new Surface(st);
_player.Prepare(mediaSource); _player.SetVideoSurface(_surface); _player.PlayWhenReady = true;
我的播放器处理视频,我听到声音并可以通过附加的回调查看进度。 我想毕竟我的纹理也应该包含解码的视频帧,但渲染它时我什么也看不见。
任何建议,建议和想法将不胜感激。