如何通过 libvlcjni 从视频创建快照?

How can I create a snapshot from the video via libvlcjni?

之前,我使用TextureView作为视频容器。我可以通过 getBitmap().
拍摄快照 但是我更新了 VLCMobileKit,现在我使用这个代码:

        <org.videolan.libvlc.util.VLCVideoLayout
        android:id="@+id/vlc_surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" />

我尝试通过 buildDrawingCache() 拍摄快照,但总是 return 一张空图像。

                    videoLayout.setDrawingCacheEnabled(true);
                    videoLayout.buildDrawingCache();
                    Bitmap bitmap = videoLayout.getDrawingCache();

我试着从完整的activity中截图了。我看到视频布局在图像上是透明的。

您无法直接获取快照。您必须使用 SurfaceView 而不是 VLCVideoLayout 来获取当前帧。

PixelCopy class 可以将SurfaceView frame转为Bitmap。所以你必须用 SurfaceView 替换你的 VLCVideoLayout。在播放媒体之前将此表面视图附加到您的 MediaPlayer。

mMediaPlayer.vlcVout.setVideoView(surfaceView)
mMediaPlayer.vlcVout.attachViews()

现在使用调用以下函数获取当前视频快照位图。

fun usePixelCopy(videoView: SurfaceView, callback: (Bitmap?) -> Unit) {
    val bitmap: Bitmap = Bitmap.createBitmap(
            videoView.width,
            videoView.height,
            Bitmap.Config.ARGB_8888
    )
    try {
        val handlerThread = HandlerThread("PixelCopier")
        handlerThread.start()
        PixelCopy.request(
                videoView, bitmap,
                { copyResult ->
                    if (copyResult == PixelCopy.SUCCESS) {
                        callback(bitmap)
                    }
                    handlerThread.quitSafely()
                },
                Handler(handlerThread.looper)
        )
    } catch (e: IllegalArgumentException) {
        callback(null)
        e.printStackTrace()
        showMessage(R.string.error)
    }
}

注意:代码在 Kotlin 中,仅适用于 AndroidN 及更高版本。我在我的 VideoPlayer 应用程序中使用它。