是否可以将视频渲染到内存缓冲区

时间:2018-03-05 10:44:54

标签: android xamarin xamarin.android exoplayer exoplayer2.x

我想知道是否可以在不使用任何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;
    
  5. 我的播放器处理视频,我听到声音并可以通过附加的回调查看进度。  我想毕竟我的纹理也应该包含解码的视频帧,但渲染它时我什么也看不见。

    任何建议,建议和想法将不胜感激。

0 个答案:

没有答案