본문 바로가기

개발자이야기/Android이야기

Android 에서 RTSP 카메라 영상을 출력

반응형

Android에서 RTSP영상 출력하기

 

Android에서 RTSP영상을 출력하기 위해서는 VLC 라이브러리가 필요하다.

 

물론, 다른 방법도 있겠지만 내가 찾아본 방법에서는 RTSP Server로 접속 후 바로 Close 되어 버리는 현상이 발생했다.

 

VLC 플레이어는 OpenSource로 되어 있어 Android 버전을 찾아보다가 해결되었다.

 

1. 우선 build.gradle 에 implement를 Sync한다.

mvnrepository에 vlc android 라이브러리가 몇 개 존재하나 그 중 아래 내용으로 등록

한다.

 


implementation 'de.mrmaffen:libvlc-android:2.1.12@aar'

 

 

2. 비디오 출력을 원하는 구역에 Surface로 Layout을 구성한다.

 

1
2
3
4
5
6
7
8
<SurfaceView
        android:id="@+id/video_player_view"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_gravity="center"
        app:layout_constraintTop_toBottomOf="@id/title_bar"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>
cs

 

3. MediaPlayer 의 이벤트를 받기 위해 리스너 클래스를 생성한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import android.util.Log;
 
import org.videolan.libvlc.MediaPlayer;
 
import java.lang.ref.WeakReference;
 
class MyPlayerListener implements MediaPlayer.EventListener {
    private WeakReference<CameraSettingActivity> mOwner;
 
 
    public MyPlayerListener(CameraSettingActivity owner) {
        mOwner = new WeakReference<CameraSettingActivity>(owner);
    }
 
    @Override
    public void onEvent(MediaPlayer.Event event) {
        CameraSettingActivity player = mOwner.get();
 
        switch(event.type) {
            case MediaPlayer.Event.EndReached:
                Log.e("MyPlayerListener""MediaPlayerEndReached");
                player.releasePlayer();
                break;
            case MediaPlayer.Event.Playing:
            case MediaPlayer.Event.Paused:
            case MediaPlayer.Event.Stopped:
            default:
                break;
        }
    }
}
 
cs

 

4. 비디오 출력 Activity에서 MyPlayerListener 인터페이스를 구성한다.

 

1
public class VideoActivity implements IVLCVout.Callback{
cs

 

 

5. 사용한 클래스변수를 선언한다.

 

1
2
3
4
5
6
    private SurfaceHolder m_holder;
    // media player
    private LibVLC m_libvlc;
    private MediaPlayer m_MediaPlayer = null;
    private MediaPlayer.EventListener mPlayerListener = new MyPlayerListener(this);
 
cs

 

6. OnCreate 함수 안에 아래와 같이 입력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SurfaceView video_player_view = (SurfaceView) findViewById(R.id.video_player_view);
m_holder = video_player_view.getHolder();
ArrayList<String> options = new ArrayList<>();
options.add("--aout=opensles");
options.add("--audio-time-stretch");// time stretching
options.add("-vvv"); // verbosity
options.add("--aout=opensles");
options.add("--avcodec-codec=h264");
options.add("--file-logging");
options.add("--logfile=vlc-log.txt");
 
m_libvlc = new LibVLC(m_context, options);
m_holder.setKeepScreenOn(true);// Create media player
m_MediaPlayer = new MediaPlayer(m_libvlc);
m_MediaPlayer.setEventListener(mPlayerListener);
 
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
//영상 사이즈 조절을 위해 아래와 같이 픽셀로 변환하여 사이즈를 입력
//310은 dp 사이즈로 원하는 세로 사이즈를 픽셀로 변환
int dpi = displayMetrics.densityDpi;
float density = displayMetrics.density; // density에는dip/160 값이들어있음.
ViewGroup.LayoutParams videoParams = video_player_view.getLayoutParams();
videoParams.width = displayMetrics.widthPixels;
videoParams.height = (int) (310 * density + 0.5);// Set up video output
final IVLCVout vout = m_MediaPlayer.getVLCVout();
vout.setVideoView(video_player_view);
vout.setWindowSize(videoParams.width,videoParams.height);
//vout.setSubtitlesView(mSurfaceSubtitles);
vout.addCallback(this);
vout.attachViews();
Media media = new Media(m_libvlc, Uri.parse("rtsp://~~~~"));
m_MediaPlayer.setMedia(media);
m_MediaPlayer.play();
cs

 

7. 인터페이스의 함수를 구현하고 앱이 빠져나올 때 플레이어를 릴리즈한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    @Override
    protected void onPause() {
        super.onPause();
        releasePlayer();
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        releasePlayer();
    }
 
    @Override
    public void onSurfacesCreated(IVLCVout vlcVout) {
 
    }
 
    @Override
    public void onSurfacesDestroyed(IVLCVout vlcVout) {
 
    }
 
    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {
 
    }
 
    public void releasePlayer() {
        if (m_libvlc == null)
            return;
        m_MediaPlayer.stop();
        final IVLCVout vout = m_MediaPlayer.getVLCVout();
        vout.removeCallback(this);
        vout.detachViews();
        m_holder = null;
        m_libvlc.release();
        m_libvlc = null;
    }
cs

 

8. 여기까지 진행 후 테스트해 보면 정상적인 카메라 영상이 출력될 것이다.

 

 

해당 라이브러리의 장점은 RTSP 영상 출력이 빠르고 정확하며 간단하다는 것이다.

 

 

반응형

'개발자이야기 > Android이야기' 카테고리의 다른 글

Android Data Binding 이란?  (0) 2019.04.25
Android WIFI SCAN LIST  (0) 2019.04.25
android 고급 정보들  (0) 2016.08.08
android 구글 마켓 URL 공유하기  (0) 2014.09.16
Android GPS 사용기  (0) 2014.07.29