最近在某个技术交流群中,有人问怎么实现视频截图。本文简单介绍下如何使用Media3
实现视频截图功能。
添加依赖
在app module下的build.gradle中添加代码,如下:
scss
dependencies {
implementation("androidx.media3:media3-ui:1.1.0")
implementation("androidx.media3:media3-session:1.1.0")
implementation("androidx.media3:media3-exoplayer:1.1.0")
}
实现视频截图功能
TextureView
提供了获取视频截图的方法getBitmap()
,可以获取Bitmap.Config.ARGB_8888
像素格式的图片,图片的宽高与TextureView
的宽高一致。
- 设置
PlayerView
的surface_type
在布局文件中将PlayerView
的surface_type
设置为texture_view
。
ini
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
......
<androidx.media3.ui.AspectRatioFrameLayout
android:id="@+id/arfl_player_container"
android:layout_width="match_parent"
android:layout_height="320dp"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/btn_screenshot">
<androidx.media3.ui.PlayerView
android:id="@+id/play_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:resize_mode="fill"
app:show_buffering="always"
app:surface_type="texture_view"
app:use_controller="false" />
</androidx.media3.ui.AspectRatioFrameLayout>
......
</androidx.constraintlayout.widget.ConstraintLayout>
- 生成截图
通过PlayView
的getVideoSurfaceView()
获取TextureView
,并生成截图,代码如下:
kotlin
class Media3ExampleActivity : AppCompatActivity() {
private lateinit var binding: LayoutMedia3ExampleActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = LayoutMedia3ExampleActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.includeTitle.tvTitle.text = "Media3 Example"
binding.playView.player = ExoPlayer.Builder(this)
.build()
binding.playView.player?.run {
addListener(object : Player.Listener {
......
})
repeatMode = Player.REPEAT_MODE_ALL
playWhenReady = true
}
binding.btnPlaySingleVideo.setOnClickListener {
binding.playView.player?.run {
stop()
setMediaItem(MediaItem.fromUri("https://minigame.vip/Uploads/images/2021/09/18/1631951892_page_img.mp4"))
prepare()
}
}
binding.btnScreenshot.setOnClickListener {
// 获取TextureView并生成截图
(binding.playView.videoSurfaceView as? TextureView)?.bitmap?.let {
binding.ivScreenshotContainer.setImageBitmap(it)
}
}
}
override fun onResume() {
super.onResume()
binding.playView.onResume()
}
override fun onPause() {
super.onPause()
binding.playView.onPause()
}
override fun onDestroy() {
super.onDestroy()
binding.playView.player?.release()
binding.playView.player = null
}
}
效果如图:
示例
演示代码已在示例Demo中添加。