2016년 3월 13일 일요일

Gear VR 로 TV 보기 - 7편 (side-by-side TV)

libhdhomerun 을 사용해서 이제 안드로이드 폰에서 채널 설정하고 TV도 볼 수 있게 되었다.

최종 목적지에 거의 다 와가는데 마지막으로 일반 TV 영상을 side-by-side 영상으로 split 하는 것만 남았다. 물론 split 하고 나서 fisheye 라던가 gear vr 렌즈에 최적화 될 수 있게 원형 비스 무리 하게 shader 시켜 주는 작업도 할 수 있겠지만... 그건 opengl 을 공부해야 하므로 지금은 패스 ㅠㅜ

이정도 만으로도 충분히 개인적으로 사용하기에는 부족함이 없어 보인다.
그럼.. 추가된 부분을 살펴 보면,

우선 layout 에 full screen video 하나 있는 것에 하나 더 추가 해 주고 화면을 반으로 나눠 left / right 로 배치 해 준다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="2">
    <com.gst_sdk_tutorials.tutorial_5.GStreamerSurfaceView
        android:id="@+id/surface_video1"
        android:layout_margin="30dip"
        android:padding="200dip"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    <com.gst_sdk_tutorials.tutorial_5.GStreamerSurfaceView
        android:id="@+id/surface_video2"
        android:layout_margin="30dip"
        android:padding="200dip"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>
이렇게 video2 SurfaceView 가 추가 되었다.
SurfaceView 가 추가 되었으니 src/com/gst_sdk_tutorials/tutorial_5/Tutorial5.java 에 기존 코드를 copy & paste 해서 video2 를 처리해 준다.

다음으로는 jni/tutorial-5.c 파일에서 gstreamer overlay 처리를 video2 를 위해 하나 더 해준다. gst_video_overlay_set_window_handle 함수를 찾아서 마찬가지로 copy & paste.

여기까지 했다면 video 두개를 side-by-side 로 그리기 위한 준비는 모두 마쳤다.

[padding 을 주지 않고 반반 나눠서 출력 할 때]


layout 에 padding 이 없으면 이런 모양이 나오는데 이렇게만 하면 VR 을 썼을 때 화면이 잘려 나오기 때문에 적당히 padding 을 줘야 한다.

마지막으로 제일 중요한 부분인데, gstreamer pipeline 을 바꿔준다.
중요하지만 간단하다. tee 를 하나 달아서 video 를 두개로 쪼갠 뒤 각각의 SurfaceView 에 overlay 하면 끝. 아래는 pipeline 이다.

[기존 fullscreen TV]
udpsrc ! tsdemux name=d d. ! avdec_mpeg2video ! queue ! glimagesink d. ! queue ! avdec_ac3_fixed ! audioconvert ! audioresample ! openslessink

[수정된 side-by-side TV]
udpsrc ! tsdemux name=d d. ! avdec_mpeg2video ! tee name=t t. ! queue ! glimagesink t. ! queue ! glimagesink d. ! queue ! avdec_ac3_fixed ! audioconvert ! audioresample ! openslessink


자.. 모든 것이 마무리 되었으니 최종 시연만이 남았다. 영상으로 감상~


시연 동영상이 화질이 별로라서 초반에 실행하는 앱이 잘 보이지 않는데, 이것을 해 주는 이유는 기어 VR 에 휴대폰을 연결하면 자동으로 뜨는 VR 앱 때문에 내가 만든 app 을 띄울 방법이 없다. 구글 카드보드용 앱을 실행해 보고 싶을때도 마찬가지.

이럴때 app package disabler 라는 앱을 설치하고 VR Service 를 Disable 시키면 노트5를 연결해도  VR 앱이 자동으로 뜨지 않는다. 만약 앱을 설치하지 않고 잠깐 테스트만 해 보고 싶다고 한다면 아래 사진처럼 usb 연결 부분을 젖히고 휴대폰을 장착하면 같은 효과를 누릴 수 있다. 하지만 아무래도 들뜨기 때문에 초점도 잘 맞지 않아서 앱을 설치하는 것이 편하다.

[기어 VR 앱이 자동으로 실행되는 것을 방지]
이로써 Gear VR 로 TV 보는 취미는 마무리 됐다.
다음은 또 무슨 재미 있는 것을 해 볼까나...

댓글 없음: