Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드 TextureView로 동영상 재생하는 방법 – 단계별 완벽 가이드

안드로이드 TextureView에서 동영상 재생하기

TextureView는 안드로이드에서 동영상이나 카메라 미리보기 같은 콘텐츠 스트림을 화면에 표시할 수 있는 뷰입니다. SurfaceView와 달리 일반 뷰처럼 변형(회전, 확대/축소)과 애니메이션을 적용할 수 있어 유연한 UI 구성에 유리합니다. 이 글에서는 MediaPlayer와 함께 TextureView를 사용해 로컬 동영상을 재생하는 방법을 단계별로 살펴보겠습니다.

1단계: 새 프로젝트 생성

Android Studio를 열고 File → New Project 메뉴로 이동한 뒤, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다. 언어는 Java 기준으로 진행합니다.

2단계: 레이아웃 파일 작성

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단계: 에셋 폴더에 동영상 추가

프로젝트의 app → assets 폴더가 없다면 새로 생성하고, 재생할 동영상 파일(예: videoplayback.mp4)을 해당 폴더에 복사해 넣습니다. 에셋 폴더에 담긴 파일은 APK 내부에 포함되어 오프라인에서도 재생할 수 있습니다.

4단계: MainActivity 코드 작성

src/MainActivity.java에 다음 코드를 추가합니다. 핵심은 TextureView.SurfaceTextureListener를 구현하여 표면(Surface)이 준비되는 시점에 MediaPlayer에 연결하는 것입니다.

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

코드 핵심 정리:

  • onSurfaceTextureAvailable(): TextureView의 표면이 사용 가능해지면 호출되며, 이 시점에 Surface 객체를 만들어 MediaPlayer에 설정합니다.
  • setDataSource(fileDescriptor): 에셋 폴더의 동영상 파일을 재생 소스로 지정합니다.
  • prepareAsync(): 재생 준비를 비동기로 처리해 UI 스레드가 멈추지 않도록 합니다.
  • onPrepared(): 준비가 완료되면 start()를 호출해 재생을 시작합니다.

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 Studio 툴바의 Run 안드로이드 TextureView로 동영상 재생하는 방법 – 단계별 완벽 가이드 버튼을 클릭합니다. 실행 대상으로 연결된 모바일 기기를 선택하면, 앱이 시작되면서 화면에 동영상이 자동으로 재생됩니다.

안드로이드 TextureView로 동영상 재생하는 방법 – 단계별 완벽 가이드

마무리 및 참고 사항

이렇게 하면 TextureView와 MediaPlayer를 조합해 로컬 동영상을 간단히 재생할 수 있습니다. 실제 서비스에 적용할 때는 다음 사항도 함께 고려하면 좋습니다.

  • 수명 주기 관리: onDestroy()onPause()에서 mediaPlayer.release()를 호출해 리소스 누수를 방지하세요.
  • 화면 회전 대응: 기기 회전 시 Activity가 재생성되므로 재생 위치를 저장·복원하면 사용자 경험이 향상됩니다.
  • 인터넷 스트리밍: 에셋 대신 URL을 사용하려면 setDataSource(String url)을 사용하고, 매니페스트에 인터넷 권한(INTERNET)을 추가해야 합니다.