如何通过 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 应用程序中使用它。
之前,我使用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 应用程序中使用它。