본문 바로가기
안드로이드

[Android/ Java] ExoPlayer 로 동영상 재생하기 !

by 개발_블로그 2021. 12. 2.
반응형

오늘은 안드로이드 스튜디오에서 ExoPlayer를 이용해서 핸드폰 속의 동영상을 가져와서 동영상 재생을 시키거나 

동영상을 찍은 후에 영상을 가져와서 재생을 시키는 것을 하겠습니다. 

 

ExoPlayer 공식홈페이지 참조하여서 봐주세요~

https://exoplayer.dev/playlists.html

 

Playlists - ExoPlayer

 

exoplayer.dev

 

 

 

manifests 부터 시작을 하겠습니다 . 추가를 해주세요~ 

 

    
    //// 외부 인터넷 uri를 통해서 받아오는 경우 아래 2개를 추가해주세요 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    
    
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

 

build.gradle 추가하겠습니다 . 

    implementation "com.google.android.exoplayer:exoplayer-core:2.14.1"
    implementation "com.google.android.exoplayer:exoplayer-ui:2.14.1"
    implementation "com.google.android.exoplayer:exoplayer-hls:2.14.1"

 

 

 

xml을 만들겠습니다. 아주 간단하게 버튼 3개를 만들도록 하겠습니다 . 

 

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="159dp"
        android:layout_marginLeft="159dp"
        android:layout_marginEnd="159dp"
        android:layout_marginRight="159dp"
        android:layout_marginBottom="161dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />


    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="159dp"
        android:layout_marginEnd="159dp"
        android:layout_marginBottom="112dp"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

 

 

메인 액티비티 입니다~

 

public class MainActivity extends AppCompatActivity {

    Button button,button2;
    String path;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);



//핸드폰에 저장되어있는 동영상을 가져올 때 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("video/*");
                startActivityForResult(intent, 1); //startActivityForResult를 이용해서 가져온다. 
            }
        });


//카메라로 영상을 찍어서 동영상을 재생하기 
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
                    startActivityForResult(takeVideoIntent, 2);
                }

            }
        });


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
        ////핸드폰 내의 영상을 가져올 때
            case 1:
                if(resultCode==RESULT_OK){
                    //선택한 사진의 경로(Uri)객체 얻어오기
                    Uri uri= data.getData();
                    Log.d("path ", uri.toString());
                     path = getRealPathFromUri(uri); ////가져온 uri의 경로의 절대경로를 가져온다. 

                      if(uri!=null){
                          if (uri.toString().contains("image")) {
                          ////가져온 다음에 Second 액티비티로 이동을한다.
                              Intent intent =new Intent(MainActivity.this, Second.class);
                              intent.putExtra("uri", path);
                              startActivity(intent);


                          }else  if(uri.toString().contains("video")) {
                             ////가져온 다음에 Second 액티비티로 이동을한다.
                            Intent intent =new Intent(MainActivity.this, Second.class);
                            intent.putExtra("uri", path);
                            Log.d("path ", path);
                            startActivity(intent);
                          }

                        }

                    }
 ////카메라로 영상을 찍어서 가져올 때 
            case 2:
                if(resultCode==RESULT_OK){
                      //선택한 사진의 경로(Uri)객체 얻어오기
                      Uri uri= data.getData();
                      Log.d("path ", uri.toString());
                      path = getRealPathFromUri(uri); ////가져온 uri의 경로의 절대경로를 가져온다. 
                      Log.d("path ", path);
                    if(uri!=null){
                        if (uri.toString().contains("image")) {
                           ////가져온 다음에 Second 액티비티로 이동을한다.
                            Intent intent =new Intent(MainActivity.this, Second.class);
                            intent.putExtra("uri", path);
                            startActivity(intent);


                         }else  if (uri.toString().contains("video")) {
                            ////가져온 다음에 Second 액티비티로 이동을한다.
                          Intent intent =new Intent(MainActivity.this, Second.class);
                          intent.putExtra("uri", path);
                          startActivity(intent);
                    }else{

					}

				}
			}
        }
    }

////가져온 영상의 uri의 절대경로를 바꿔주는 메소드 
    String getRealPathFromUri(Uri uri){
        String[] proj= {MediaStore.Images.Media.DATA};
        CursorLoader loader= new CursorLoader(this, uri, proj, null, null, null);
        Cursor cursor= loader.loadInBackground();
        int column_index= cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String result= cursor.getString(column_index);
        cursor.close();
        return  result;
    }
}

 

 

 

Second 액티비티 만들기. 

 

Second 의 xml 입니다 . 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:padding="16dp"
    android:layout_height="match_parent"
    tools:context=".Second">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/pv"
        android:layout_width="match_parent"
        android:layout_height="300dp">
    </com.google.android.exoplayer2.ui.PlayerView>

    <com.google.android.exoplayer2.ui.PlayerControlView
        android:id="@+id/pcv"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>

</RelativeLayout>

 

Second 액티비티 입니다. 


public class Second extends AppCompatActivity {



    PlayerView pv;
    //실제 비디오를 플레이하는 객체의 참조 변수
    SimpleExoPlayer player;

    //컨트롤러 뷰 참조 변수
    PlayerControlView pcv;
    Uri videoUri ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);\
        
        pv=findViewById(R.id.pv);
        pcv=findViewById(R.id.pcv);

        //매인액티비티에서 intent 받아온 uri 값 
        Intent intent =getIntent();
        String uri = intent.getStringExtra("uri");

        //파싱을 해준다. 
        videoUri=Uri.parse(uri);
        Log.d("path ", videoUri.toString());



    }

    //화면에 보이기 시작할때!!
    @Override
    protected void onStart() {
        super.onStart();

        //SimpleExoPlayer객체 생성
        player = new SimpleExoPlayer.Builder(this.getApplicationContext()).build();
        //플레이어뷰에게 플레이어 설정
        pv.setPlayer(player);
        //플레이어 컨트럴뷰와 플레이어 연동
        pcv.setPlayer(player);

        //비디오데이터 소스를 관리하는 DataSource 객체를 만들어주는 팩토리 객체 생성
        DataSource.Factory factory= new DefaultDataSourceFactory(this,"Ex89VideoAndExoPlayer");
        //비디오데이터를 Uri로 부터 추출해서 DataSource객체 (CD or LP판 같은 ) 생성
        ProgressiveMediaSource mediaSource= new ProgressiveMediaSource.Factory(factory).createMediaSource(videoUri);

        //만들어진 비디오데이터 소스객체인 mediaSource를
        //플레이어 객체에게 전당하여 준비하도록!![ 로딩하도록 !!]
        player.prepare(mediaSource);

        //로딩이 완료되어 준비가 되었을 때
        //자동 실행되도록..
        //player.setPlayWhenReady(true);

    }
    //화면에 안보일 때..
    @Override
    protected void onStop() {
        super.onStop();
        //플레이어뷰 및 플레이어 객체 초기화
        pv.setPlayer(null);
        player.release();
        player=null;
    }



}

 

 

이상 exoplayer 간단 구현이었습니다!! 

 

반응형