0

我想知道是否可以在不使用任何 UI 元素(SurfaceView、TextureView 等)的情况下从 ExoPLaye 解码的视频帧中获取像素数据。

我想在只包含一个顶级 GlSurfaceView 的游戏中显示视频帧。我想通过我的渲染线程而不是主 UI 线程上的常规 OpenGL ES 纹理来渲染视频帧。

目前我正在使用 Xamarin.Android,但任何关于“纯”Android 的想法也很棒!

以下是我努力实现目标的方式:

  1. 创建视频播放器及其媒体源

    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);
    
  2. 创建所需大小和格式的 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);
    
  3. 从中创建 SurfaceTexture 和 Surface
    var st = new SurfaceTexture(_textures[0], true);
    _surface = new Surface(st);
    
  4. 将创建的 Surface 设置为播放器,并在准备好时启动它
    _player.Prepare(mediaSource);  
    _player.SetVideoSurface(_surface);
    _player.PlayWhenReady = true;
    

我的播放器处理视频,我听到声音并且可以通过附加的回调查看进度。我想毕竟我的纹理还应该包含解码的视频帧,但渲染它时我什么也看不到。

任何意见、建议和想法将不胜感激。

4

0 回答 0