반응형
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 |