1

Android アプリケーションでライブ rtsp ストリームを再生するために、 Android vlc ( LibVLC) を a と共に使用しています。TextureViewすべてが正常に機能していますが、関数を使用してオブジェクト検出タスクを実行するたびに、現在の再生フレームを取得する必要がありますgetBitmap()。ここでの問題は、 this 関数が遅すぎて、 でレンダリングされる画像サイズがTextureView大きくなるにつれて時間がかかることです。

それで、それをより速く行う他の方法はありますか?

getDrawingCache()TextureView と SurfaceView の両方でこの関数を試してみましたが、常に透明なビットマップを返していたことに注意してください.

また、fadden が関数の使用について話し、コード サンプルのリファレンスとしてgrafikaを指すことで、この回答に対する多くの同様の解決策を見つけました。ただし (そして残念ながら) OpenGL を扱うときのスキルはほとんどありません。リンクされた回答を検証できる場合は、簡単な直接コード サンプル (私のケースに関して) にリンクしていただけますか?glReadPixels()

public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener,
    org.videolan.libvlc.media.MediaPlayer.OnBufferingUpdateListener,
    org.videolan.libvlc.media.MediaPlayer.OnCompletionListener,
    org.videolan.libvlc.media.MediaPlayer.OnPreparedListener,
    org.videolan.libvlc.media.MediaPlayer.OnVideoSizeChangedListener {

private AppCompatActivity me = this;    
private MediaPlayer mMediaPlayer;    
private TextureView mTextureViewmTextureView;
private String mUrl = "/storage/emulated/0/videos/test.mp4";
private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_main);

    mMediaPlayer = new MediaPlayer(VLCInstance.get());
    mTextureViewmTextureView = (TextureView) findViewById(R.id.player);
    mTextureView.setSurfaceTextureListener(this);
}

private void attachViewSurface() {
        final IVLCVout vlcVout = mMediaPlayer.getVLCVout();
        mMediaPlayer.setScale(0);
        vlcVout.detachViews();
        vlcVout.setVideoView(mTextureView);
        vlcVout.setWindowSize(mTextureView.getWidth(), mTextureView.getHeight());
        vlcVout.attachViews();
        mTextureView.setKeepScreenOn(true);
}


private void play(String path) {
   try {
        Media media;
        if (new File(path).exists()) {
            media = new Media(VLCInstance.get(), path);
        } else {
            media = new Media(VLCInstance.get(), Uri.parse(path));
        }

        mMediaPlayer.setMedia(media);
        mMediaPlayer.play();
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
   attachViewSurface();

   if (mMediaPlayer.hasMedia())
       mMediaPlayer.play();
   else
       play(mUrl);
}

public Bitmap getImage() {
   return mTextureView.getBitmap();
}

}
4

1 に答える 1