Android
 Computer >> コンピューター >  >> プログラミング >> Android

AndroidのTextureViewで動画を再生する方法を徹底解説

本記事では、AndroidアプリでTextureViewを使用して動画を再生する方法を、サンプルコード付きで段階的に解説します。TextureViewはSurfaceViewと異なり、通常のView階層の中で動画を表示でき、回転やスケールなどの変換処理も適用できるのが特徴です。

ステップ1:新規プロジェクトを作成する

まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

次に、res/layout/activity_main.xml に以下のコードを追加します。ここでは、画面いっぱいにTextureViewを配置しています。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="8dp"
    tools:context=".MainActivity">

    <TextureView
        android:id="@+id/textureView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

ステップ3:assetsフォルダに動画ファイルを配置する

プロジェクトにassetsフォルダを作成し、再生したい動画ファイル(例:videoplayback.mp4)をコピー&ペーストで配置します。assetsフォルダは「app」を右クリック→「New」→「Folder」→「Assets Folder」から簡単に作成できます。

ステップ4:MainActivity.javaにコードを追加する

src/MainActivity.java に以下のコードを記述します。TextureView.SurfaceTextureListener を実装し、サーフェスが利用可能になったタイミングでMediaPlayerにSurfaceをセットして再生を開始する流れです。

import androidx.appcompat.app.AppCompatActivity;
import android.content.res.AssetFileDescriptor;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.Surface;
import android.view.TextureView;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, MediaPlayer.OnVideoSizeChangedListener {

    TextureView textureView;
    private MediaPlayer mediaPlayer;
    AssetFileDescriptor fileDescriptor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textureView = findViewById(R.id.textureView);
        textureView.setSurfaceTextureListener(this);

        mediaPlayer = new MediaPlayer();
        try {
            fileDescriptor = getAssets().openFd("videoplayback.mp4");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
        Surface surface = new Surface(surfaceTexture);
        try {
            mediaPlayer.setSurface(surface);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                mediaPlayer.setDataSource(fileDescriptor);
                mediaPlayer.prepareAsync();
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mediaPlayer.start();
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
    }

    @Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    }
}

ステップ5:AndroidManifest.xmlを確認する

最後に、androidManifest.xml が以下のようになっていることを確認します。特別な権限は不要ですが、ランチャーアクティビティとして MainActivity が登録されている必要があります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

アプリを実行して動作を確認する

それでは、実際にアプリを実行してみましょう。ここでは、実機のAndroidスマートフォンをパソコンに接続しているものとして説明します。Android Studioからアプリを起動するには、プロジェクト内のアクティビティファイルを開き、ツールバーにある「Run」アイコンをクリックします。接続したモバイルデバイスを選択すると、端末の画面上で動画が自動再生されることが確認できます。

まとめ

TextureViewとMediaPlayerを組み合わせることで、View階層内で柔軟に動画を表示できます。動画の変形やアニメーションと組み合わせたい場合には、SurfaceViewよりもTextureViewの方が適しています。ぜひ本記事の手順を参考に、自分のアプリに動画再生機能を実装してみてください。

  1. Androidスマホでアプリをサイドロードする方法|APKインストールの手順と注意点を徹底解説

    Androidの最大の魅力は、何といっても選択肢の豊富なアプリです。Playストアだけでも数百万ものアプリが公開されており、どんなタスクでも少なくとも10個以上の候補から選ぶことができます。こうした充実したアプリ群こそが、Androidが「最もカスタマイズ性の高いOS」と呼ばれる理由の一つとなっています。端末にインストールされたアプリの組み合わせによって、あなたのAndroid体験は他の人とは違う、あなただけの特別なものになるのです。 しかし、話はこれで終わりではありません。Playストアには無数のアプリがありますが、すべてのアプリが掲載されているわけではないのです。さまざまな理由(後述しま

  2. Androidスマホで動画を手ブレ補正する方法|Googleフォトと無料アプリで簡単スタビライズ

    スマホで撮影した動画の品質は、FPS(フレームレート/秒間コマ数)で測ることができます。FPSが高いほど、より滑らかで高品質な動画になります。しかし、それ以上に重要なのが撮影中のスマホを安定させておくことです。Androidスマホに高性能なカメラが搭載されていても、撮影時に手ブレや揺れがあれば、仕上がりは期待できません。三脚をいつも持ち歩いている人は少ないものです。移動中の車内や走りながら撮影した動画は、どうしてもブレてしまい、品質が損なわれます。そこで本記事では、Androidスマホで撮影した動画を手ブレ補正(スタビライズ)する方法を、初心者にもわかりやすく解説します。Androidスマホで