안드로이드 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와 MediaPlayer를 조합해 로컬 동영상을 간단히 재생할 수 있습니다. 실제 서비스에 적용할 때는 다음 사항도 함께 고려하면 좋습니다.
- 수명 주기 관리:
onDestroy()나onPause()에서mediaPlayer.release()를 호출해 리소스 누수를 방지하세요. - 화면 회전 대응: 기기 회전 시 Activity가 재생성되므로 재생 위치를 저장·복원하면 사용자 경험이 향상됩니다.
- 인터넷 스트리밍: 에셋 대신 URL을 사용하려면
setDataSource(String url)을 사용하고, 매니페스트에 인터넷 권한(INTERNET)을 추가해야 합니다.