【Androidアプリ開発】 USBカメラの映像をキャプチャする方法
salmoncode
TechTopic
本記事では、サーバー上に配置された動画ファイル(例:MP4)を、Androidアプリ内で再生する方法を解説します。
標準の VideoView を使う方法と、より柔軟性の高い ExoPlayer を使う方法の2通りを紹介します。
といったケースに役立つ内容です。
本記事では以下の2パターンを紹介します。
デメリット:
デメリット:
<!-- res/layout/activity_main.xml -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val videoView = findViewById<VideoView>(R.id.videoView)
val videoUrl = "https://example.com/sample.mp4"
val uri = Uri.parse(videoUrl)
// 再生コントローラー(再生・一時停止ボタンなど)
videoView.setMediaController(MediaController(this))
videoView.setVideoURI(uri)
videoView.requestFocus()
videoView.start()
}
}
videoView.setOnPreparedListener {
Log.d("Video", "再生準備が完了")
}
videoView.setOnCompletionListener {
Log.d("Video", "再生が終了")
}
videoView.setOnErrorListener { _, what, extra ->
Log.e("Video", "再生エラー: what=$what extra=$extra")
true
}
dependencies {
implementation("com.google.android.exoplayer:exoplayer:2.19.1")
}
<!-- res/layout/activity_main.xml -->
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/playerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
class MainActivity : AppCompatActivity() {
private lateinit var player: ExoPlayer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val playerView = findViewById<PlayerView>(R.id.playerView)
player = ExoPlayer.Builder(this).build()
playerView.player = player
val mediaItem =
MediaItem.fromUri("https://example.com/sample.mp4")
player.setMediaItem(mediaItem)
player.prepare()
player.play()
}
override fun onStop() {
super.onStop()
player.release()
}
}
player.addListener(object : Player.Listener {
override fun onPlaybackStateChanged(state: Int) {
when (state) {
Player.STATE_READY -> Log.d("Exo", "準備完了")
Player.STATE_ENDED -> Log.d("Exo", "再生完了")
}
}
override fun onPlayerError(error: PlaybackException) {
Log.e("Exo", "エラー: ${error.message}")
}
})
Android 9 以降は HTTP(非SSL)はブロックされます。
対応策:
<application
android:networkSecurityConfig="@xml/network_security_config">
サーバー側の設定が原因で再生できないケースも多いです。
ExoPlayer を使用すれば改善することが多いです。
キャッシュ機能を有効にすることも可能。
👉 最短で動画再生したい場合は VideoView
👉 本格的なアプリでは ExoPlayer 推奨