2016년 3월 10일 목요일

Gear VR 로 TV 보기 - 4편 (UI 바꾸기 - 2D TV 시청)

gst-sdk 를 통해 Video 를 재생할 수 있는 준비가 끝났으니 이 tutorial 를 기반으로 일단 2D 일반 TV 를 볼 수 있게 만든 뒤 VR 에서 보는 side-by-side 로 바꿀 계획이다.

우선 2D TV 는 fullscreen 으로 화면이 꽉차게 나오는 간단한 UI 로 바꾸려 한다.
Android 개발은 처음이라 reference 찾아 가면서 하나씩 해보는 재미도 쏠쏠하다.

그럼 작업을 시작하면,
(아래 코드는 gst-sdk-turorials 중 android-tutorial-5 를 기반으로 한다.)

1. Full Screen mode 지원을 위해 Manifest 를 추가 한다.
 - git diff 를 통해서 설명하려 한다.
index 06c9e5d..af1f408 100755
--- a/gst-sdk/tutorials/android-tutorial-5/AndroidManifest.xml
+++ b/gst-sdk/tutorials/android-tutorial-5/AndroidManifest.xml
@@ -10,6 +10,7 @@

     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-feature android:glEsVersion="0x00020000" />

@@ -18,7 +19,8 @@
         android:label="@string/app_name" >
         <activity
             android:name=".Tutorial5"
-            android:label="@string/app_name" >
+            android:label="@string/app_name"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -91,4 +93,4 @@
         </activity>
     </application>
 - 첫번째 WRITE_EXTERNAL_STORAGE 퍼미션을 추가 해 준 이유는gstreamer debugging 을 위해 dot 파일을 뽑을 때 쓰려고 한것이므로 굳이 안해도 무방.
 - android:theme 추가 한 것이 바로 fullscreen 을 위한 patch 이다.

2. Resource 의 layout.xml 을 수정해 준다.
 - 불필요한 layout 을 모두 삭제하고 SurfaceView 만 남겨둔다.
diff --git a/gst-sdk/tutorials/android-tutorial-5/res/layout/main.xml b/gst-sdk/tutorials/android-tutorial-5/res/layout/main.xml
index df795b2..24ce048 100755
--- a/gst-sdk/tutorials/android-tutorial-5/res/layout/main.xml
+++ b/gst-sdk/tutorials/android-tutorial-5/res/layout/main.xml
@@ -1,77 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:gravity="center_vertical"
-    android:orientation="vertical" >
-
-    <TextView
-        android:id="@+id/textview_message"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="16dip"
-        android:gravity="center_horizontal" />
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="16dip"
-        android:gravity="center_horizontal"
-        android:orientation="horizontal" >
-
-        <ImageButton
-            android:id="@+id/button_play"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:contentDescription="@string/button_play"
-            android:src="@android:drawable/ic_media_play"
-            android:text="@string/button_play" />
-
-        <ImageButton
-            android:id="@+id/button_stop"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:contentDescription="@string/button_stop"
-            android:src="@android:drawable/ic_media_pause"
-            android:text="@string/button_stop" />
-
-        <ImageButton
-            android:id="@+id/button_select"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:contentDescription="@string/button_select"
-            android:src="@android:drawable/ic_media_next"
-            android:text="@string/button_select" />
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="16dip"
-        android:gravity="center_horizontal"
-        android:orientation="horizontal" >
-
-        <TextView
-            android:id="@+id/textview_time"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:layout_marginLeft="5dip"
-            android:layout_marginRight="5dip" />
-
-        <SeekBar
-            android:id="@+id/seek_bar"
-            android:layout_width="0dip"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:layout_weight="1"
-            android:indeterminate="false" />
-    </LinearLayout>
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">


     <com.gst_sdk_tutorials.tutorial_5.GStreamerSurfaceView
-        android:id="@+id/surface_video"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical|center_horizontal" />
+        android:id="@+id/surface_video1"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"/>


 </LinearLayout>
 - 내용이 길지만 별 의미 없고 SurfaceView 만 남기도 다 지운 것이다.

3. gstreamer pipeline 을 http 스트리밍이 아닌 udp streaming 으로 바꿔준다.
 - playbin 에서 ts 스트림을 재생하는 manual pipeline 으로 변경한다.
diff --git a/gst-sdk/tutorials/android-tutorial-5/jni/tutorial-5.c b/gst-sdk/tutorials/android-tutorial-5/jni/tutorial-5.c
index 81e9524..9ba8dae 100755
--- a/gst-sdk/tutorials/android-tutorial-5/jni/tutorial-5.c
+++ b/gst-sdk/tutorials/android-tutorial-5/jni/tutorial-5.c
   /* Build pipeline */
-  data->pipeline = gst_parse_launch("playbin", &error);
+  data->pipeline = gst_parse_launch("udpsrc ! tsdemux name=d d. ! avdec_mpeg2video ! queue ! glimagesink d. ! queue ! avdec_ac3_fixed ! audioconvert ! audioresample ! openslessink" , &error);
 - playbin 을 사용하고 uri, video-sink property 만 변경해도 가능하지만
  성능 문제가 걱정되서 불필요한 element 는 모두 제거하고 manual pipeline 을 구성했다.

4. 채널을 선택해 주고 방송 시청
 - 아직까지 libhdhomerun 을 integration 하지 않았기 때문에 채널 설정은 ubuntu 에서
  원격으로 해주고 Note5 에서는 재생한 하는 방식으로 테스트 했다.
[fullscren layout 으로 변경하고 gstreamer 로 SBS 방송 시청]
 짜잔! TV 가 나온다. 걱정했던 성능문제나 gstreamer 미작동 같은 문제는 발생하지 않았다.

 코드 수정 전/후 는 아래와같다. http streaming 에서 live tv 시청으로 변경.

다음에는 libhdhomerun 을 통합해서 채널 설정까지 자동으로 하는 것을 정리 하려 한다.

음.. 성능이 괜찮다는 것을 증명하기 위해 동영상을 하나 남겨둔다.

댓글 없음: