マルチメディア・カメラ

【Androidアプリ開発】サーバーにある動画を再生する

salmoncode
記事内に商品プロモーションを含む場合があります。
スポンサーリンク

① この機能でできること(概要)

本記事では、サーバー上に配置された動画ファイル(例:MP4)を、Androidアプリ内で再生する方法を解説します。
標準の VideoView を使う方法と、より柔軟性の高い ExoPlayer を使う方法の2通りを紹介します。

  • URL で動画を再生したい
  • ストリーミング形式ではない MP4 の再生
  • カスタム UI(再生ボタン・シークバーなど)を使いたい
  • 再生中のイベント(再生開始、終了、エラー)を取得したい

といったケースに役立つ内容です。


② 実装方針(概要)

本記事では以下の2パターンを紹介します。

【パターンA】VideoView を使う(最も簡単)

  • 最小コードで動画を再生可能
  • 簡易 UI(再生ボタン、シークバー)が自動で付く

デメリット:

  • カスタム UI が作りづらい
  • 高度な再生制御が難しい

【パターンB】ExoPlayer を使う(推奨)

  • 安定、柔軟、高機能
  • ストリーミング、キャッシュ、イベント制御などが可能

デメリット:

  • 若干コード量が増える

③ 実装手順(ステップ式解説)


🔹【パターンA】VideoView を使う方法(最も簡単)

1. レイアウトに VideoView を配置

<!-- 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>

2. VideoView に動画 URL をセットして再生

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()
    }
}

3. 再生イベントを取得したい場合

videoView.setOnPreparedListener {
    Log.d("Video", "再生準備が完了")
}

videoView.setOnCompletionListener {
    Log.d("Video", "再生が終了")
}

videoView.setOnErrorListener { _, what, extra ->
    Log.e("Video", "再生エラー: what=$what extra=$extra")
    true
}

🔹【パターンB】ExoPlayer を使う方法(推奨)

1. Gradle に依存関係を追加

dependencies {
    implementation("com.google.android.exoplayer:exoplayer:2.19.1")
}

2. レイアウトに PlayerView を配置

<!-- 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"/>

3. ExoPlayer を初期化し、動画 URL を読み込む

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()
    }
}

4. 再生イベントを取得したい場合

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}")
    }
})

④ 実装上の注意点とよくあるエラー

✦ 1. http:// の URL で再生できない

Android 9 以降は HTTP(非SSL)はブロックされます。

対応策:

  • https を使う
  • または networkSecurityConfig を設定
<application
    android:networkSecurityConfig="@xml/network_security_config">

✦ 2. 再生されない(404 / CORS)

サーバー側の設定が原因で再生できないケースも多いです。

  • ファイルパスの変更
  • 公開フォルダではない
  • CORS(Cross-Origin Resource Sharing)設定

✦ 3. 動画が重い・カクつく

ExoPlayer を使用すれば改善することが多いです。
キャッシュ機能を有効にすることも可能。


⑤ サンプルコード一式(まとめ)

👉 最短で動画再生したい場合は VideoView
👉 本格的なアプリでは ExoPlayer 推奨


⑥ 関連 Tips(内部リンク案)

  • 【Androidアプリ開発】VideoView を使ったローカル動画の再生方法
  • 【Androidアプリ開発】ExoPlayer を使ったストリーミング再生
  • 【Androidアプリ開発】権限(Permissions)完全ガイド
  • 【Androidアプリ開発】MediaPlayer の基本的な使い方
スポンサーリンク
書いた人
サーモン
サーモン
著者(ソフトウェアエンジニア)
こんにちは、ソフトウェアエンジニアのサーモンです。 情報系大学院を卒業後、都内IT企業に従事しています。プログラミング歴は10年以上になります。
記事URLをコピーしました