Commit bd6acc3548ce4666792ec956fdaea3fb59c51f00
1 parent
30f316ce
WIP con streaming... aun no va
Showing
7 changed files
with
236 additions
and
100 deletions
res/layout/main_activity.xml
@@ -11,16 +11,14 @@ | @@ -11,16 +11,14 @@ | ||
11 | 11 | ||
12 | <ImageButton | 12 | <ImageButton |
13 | android:id="@+id/button" | 13 | android:id="@+id/button" |
14 | - android:layout_width="256dp" | ||
15 | - android:layout_height="256dp" | 14 | + android:layout_width="192dip" |
15 | + android:layout_height="192dip" | ||
16 | android:layout_centerHorizontal="true" | 16 | android:layout_centerHorizontal="true" |
17 | android:layout_centerVertical="true" | 17 | android:layout_centerVertical="true" |
18 | android:background="@drawable/startbuttontoggle" | 18 | android:background="@drawable/startbuttontoggle" |
19 | android:contentDescription="@string/startbuttondescription" | 19 | android:contentDescription="@string/startbuttondescription" |
20 | android:focusable="false" | 20 | android:focusable="false" |
21 | android:focusableInTouchMode="false" | 21 | android:focusableInTouchMode="false" |
22 | - android:maxHeight="@dimen/lesize" | ||
23 | - android:maxWidth="@dimen/lesize" | ||
24 | android:scaleType="fitCenter" /> | 22 | android:scaleType="fitCenter" /> |
25 | 23 | ||
26 | <TextView | 24 | <TextView |
res/values/strings.xml
@@ -29,5 +29,6 @@ | @@ -29,5 +29,6 @@ | ||
29 | <string name="alertVitamioNotInstalled">Alerta! Llibreries de Vitamio no instal·lades!</string> | 29 | <string name="alertVitamioNotInstalled">Alerta! Llibreries de Vitamio no instal·lades!</string> |
30 | <string name="alertLogoDescription">Alerta!</string> | 30 | <string name="alertLogoDescription">Alerta!</string> |
31 | <string name="itemType">Item type</string> | 31 | <string name="itemType">Item type</string> |
32 | + <string name="buffering_text">Buffering...</string> | ||
32 | 33 | ||
33 | </resources> | 34 | </resources> |
34 | \ No newline at end of file | 35 | \ No newline at end of file |
src/com/upc/pbe/upcnews/Directoris.java
@@ -6,8 +6,6 @@ import java.util.ArrayList; | @@ -6,8 +6,6 @@ import java.util.ArrayList; | ||
6 | import java.util.concurrent.ExecutionException; | 6 | import java.util.concurrent.ExecutionException; |
7 | 7 | ||
8 | import android.app.Activity; | 8 | import android.app.Activity; |
9 | -import android.app.DownloadManager; | ||
10 | -import android.content.Context; | ||
11 | import android.content.Intent; | 9 | import android.content.Intent; |
12 | import android.os.Bundle; | 10 | import android.os.Bundle; |
13 | import android.util.Log; | 11 | import android.util.Log; |
@@ -61,12 +59,10 @@ public class Directoris extends Activity implements OnItemClickListener | @@ -61,12 +59,10 @@ public class Directoris extends Activity implements OnItemClickListener | ||
61 | } | 59 | } |
62 | catch (InterruptedException e) | 60 | catch (InterruptedException e) |
63 | { | 61 | { |
64 | - // TODO Auto-generated catch block | ||
65 | e.printStackTrace(); | 62 | e.printStackTrace(); |
66 | } | 63 | } |
67 | catch (ExecutionException e) | 64 | catch (ExecutionException e) |
68 | { | 65 | { |
69 | - // TODO Auto-generated catch block | ||
70 | e.printStackTrace(); | 66 | e.printStackTrace(); |
71 | } | 67 | } |
72 | catch (IOException e) | 68 | catch (IOException e) |
@@ -106,8 +102,7 @@ public class Directoris extends Activity implements OnItemClickListener | @@ -106,8 +102,7 @@ public class Directoris extends Activity implements OnItemClickListener | ||
106 | ArrayList<ParentList> m3u8parsed = p.parseFile(playlist); | 102 | ArrayList<ParentList> m3u8parsed = p.parseFile(playlist); |
107 | Log.d(TAG, "Parsing completat"); | 103 | Log.d(TAG, "Parsing completat"); |
108 | //Creem un gestor HLS | 104 | //Creem un gestor HLS |
109 | - DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); | ||
110 | - HLS h = new HLS(m3u8parsed,((UpcApp)getApplication()).getLocalPath(), manager); | 105 | + HLS h = new HLS(m3u8parsed,((UpcApp)getApplication()).getLocalPath()); |
111 | ((UpcApp)getApplication()).setHLS(h); | 106 | ((UpcApp)getApplication()).setHLS(h); |
112 | //Iniciem la reproduccio | 107 | //Iniciem la reproduccio |
113 | Intent mIntent = new Intent(this, VideoActivity.class); | 108 | Intent mIntent = new Intent(this, VideoActivity.class); |
@@ -142,12 +137,10 @@ public class Directoris extends Activity implements OnItemClickListener | @@ -142,12 +137,10 @@ public class Directoris extends Activity implements OnItemClickListener | ||
142 | } | 137 | } |
143 | catch (InterruptedException e1) | 138 | catch (InterruptedException e1) |
144 | { | 139 | { |
145 | - // TODO Auto-generated catch block | ||
146 | e1.printStackTrace(); | 140 | e1.printStackTrace(); |
147 | } | 141 | } |
148 | catch (ExecutionException e1) | 142 | catch (ExecutionException e1) |
149 | { | 143 | { |
150 | - // TODO Auto-generated catch block | ||
151 | e1.printStackTrace(); | 144 | e1.printStackTrace(); |
152 | } | 145 | } |
153 | } | 146 | } |
src/com/upc/pbe/upcnews/HLS.java
1 | package com.upc.pbe.upcnews; | 1 | package com.upc.pbe.upcnews; |
2 | 2 | ||
3 | +import io.vov.vitamio.widget.VideoView; | ||
4 | + | ||
5 | +import java.io.BufferedInputStream; | ||
3 | import java.io.File; | 6 | import java.io.File; |
7 | +import java.io.FileOutputStream; | ||
4 | import java.io.IOException; | 8 | import java.io.IOException; |
9 | +import java.net.MalformedURLException; | ||
10 | +import java.net.URL; | ||
5 | import java.util.ArrayList; | 11 | import java.util.ArrayList; |
6 | 12 | ||
7 | -import android.app.DownloadManager; | ||
8 | -import android.app.DownloadManager.Request; | 13 | +import android.app.AlertDialog; |
9 | import android.content.Context; | 14 | import android.content.Context; |
10 | import android.net.TrafficStats; | 15 | import android.net.TrafficStats; |
11 | -import android.net.Uri; | 16 | +import android.os.AsyncTask; |
12 | import android.util.Log; | 17 | import android.util.Log; |
18 | +import android.view.LayoutInflater; | ||
19 | +import android.widget.Toast; | ||
13 | 20 | ||
14 | //Gestor del protocol HTTP Live Streaming | 21 | //Gestor del protocol HTTP Live Streaming |
15 | public class HLS | 22 | public class HLS |
16 | { | 23 | { |
17 | - | 24 | + private static long TRIGGER_PLAY; |
18 | private static final String TAG = "HLS"; | 25 | private static final String TAG = "HLS"; |
19 | private ArrayList<ParentList> videos; | 26 | private ArrayList<ParentList> videos; |
20 | private ArrayList<Segment> segments; | 27 | private ArrayList<Segment> segments; |
@@ -24,11 +31,15 @@ public class HLS | @@ -24,11 +31,15 @@ public class HLS | ||
24 | private int currentSegment; | 31 | private int currentSegment; |
25 | private boolean endReached; | 32 | private boolean endReached; |
26 | private String localFolder; | 33 | private String localFolder; |
27 | - private DownloadManager dm; | ||
28 | private BandwidthMeasurer bm; | 34 | private BandwidthMeasurer bm; |
35 | + private boolean started; | ||
36 | + private boolean ended; | ||
37 | + private long totalDownloaded; | ||
38 | + private VideoView video; | ||
39 | + private VideoActivity vActivity; | ||
29 | 40 | ||
30 | 41 | ||
31 | - public HLS(ArrayList<ParentList> parsed, String localFolder, DownloadManager manager) | 42 | + public HLS(ArrayList<ParentList> parsed, String localFolder) |
32 | { | 43 | { |
33 | // Neteja el directori i inicialitza les variables | 44 | // Neteja el directori i inicialitza les variables |
34 | File dir = new File(localFolder); | 45 | File dir = new File(localFolder); |
@@ -45,8 +56,47 @@ public class HLS | @@ -45,8 +56,47 @@ public class HLS | ||
45 | endReached = false; | 56 | endReached = false; |
46 | this.localFolder = localFolder; | 57 | this.localFolder = localFolder; |
47 | bm = new BandwidthMeasurer(); | 58 | bm = new BandwidthMeasurer(); |
59 | + started = ended = false; | ||
60 | + totalDownloaded = 0; | ||
48 | } | 61 | } |
49 | 62 | ||
63 | + public void setBufferSize() | ||
64 | + { | ||
65 | + /* | ||
66 | + * Supondremos todos los segmentos de misma duración | ||
67 | + */ | ||
68 | + if(qualities.get(currentQuality).getQuality() == -1) | ||
69 | + { | ||
70 | + /* | ||
71 | + * No nos dicen la calidad, la pondremos al conocer la longitud del primer segmento | ||
72 | + */ | ||
73 | + TRIGGER_PLAY = -1; | ||
74 | + } | ||
75 | + else | ||
76 | + { | ||
77 | + //15 segundos de cancha para empezar | ||
78 | + TRIGGER_PLAY = (long) (15 * qualities.get(currentQuality).getQuality()/8e3); | ||
79 | + } | ||
80 | + | ||
81 | + } | ||
82 | + | ||
83 | + public void quitPlayer(VideoActivity v) | ||
84 | + { | ||
85 | + video.stopPlayback(); | ||
86 | + v.finish(); | ||
87 | + return; | ||
88 | + } | ||
89 | + | ||
90 | + public void setVideoViewer(VideoView v) | ||
91 | + { | ||
92 | + video = v; | ||
93 | + } | ||
94 | + | ||
95 | + public void setVideoActivity(VideoActivity v) | ||
96 | + { | ||
97 | + vActivity = v; | ||
98 | + } | ||
99 | + | ||
50 | public void loadVideo() | 100 | public void loadVideo() |
51 | { | 101 | { |
52 | // Carrega la qualitat i, a partir d'aixo, el seguent segment | 102 | // Carrega la qualitat i, a partir d'aixo, el seguent segment |
@@ -56,6 +106,7 @@ public class HLS | @@ -56,6 +106,7 @@ public class HLS | ||
56 | { | 106 | { |
57 | endReached = true; | 107 | endReached = true; |
58 | } | 108 | } |
109 | + setBufferSize(); | ||
59 | } | 110 | } |
60 | 111 | ||
61 | public String next() throws IOException | 112 | public String next() throws IOException |
@@ -71,59 +122,47 @@ public class HLS | @@ -71,59 +122,47 @@ public class HLS | ||
71 | } | 122 | } |
72 | Segment seg = segments.get(currentSegment++); | 123 | Segment seg = segments.get(currentSegment++); |
73 | String path = localFolder+seg.getURL().substring(seg.getURL().lastIndexOf("/") + 1, seg.getURL().length()); | 124 | String path = localFolder+seg.getURL().substring(seg.getURL().lastIndexOf("/") + 1, seg.getURL().length()); |
74 | - if(!new File(path).exists()) //Para qué bajarlo dos veces? | 125 | + Log.d(TAG, seg.getName() + " " + seg.getURL()); |
126 | + return path; | ||
127 | + } | ||
128 | + | ||
129 | + public void updateQuality(long bps) | ||
130 | + { | ||
131 | + if ((bps <= qualities.get(currentQuality).getQuality()) && (bps != -1)) | ||
75 | { | 132 | { |
76 | - Log.d(TAG, seg.getName() + " " + seg.getURL()); | ||
77 | - long startTime = System.currentTimeMillis(); | ||
78 | - long segmentBytes = TrafficStats.getTotalRxBytes(); | ||
79 | - descarregarguardar(seg.getURL(), localFolder); | ||
80 | - double bps = bm.Measure(segmentBytes, startTime); | ||
81 | - Log.d(TAG, "Velocitat actual (KB/s): " + (bps / 8e3)); | ||
82 | - if ((bps <= qualities.get(currentQuality).getQuality()) && (bps != -1)) | 133 | + int newQuality; |
134 | + for(newQuality = 0; newQuality < qualities.size(); newQuality++) | ||
83 | { | 135 | { |
84 | - int newQuality; | ||
85 | - for(newQuality = 0; newQuality < qualities.size(); newQuality++) | ||
86 | - { | ||
87 | - if(bps >= qualities.get(newQuality).getQuality()) | ||
88 | - { | ||
89 | - break; | ||
90 | - } | ||
91 | - } | ||
92 | - if(currentQuality != newQuality) | 136 | + if(bps >= qualities.get(newQuality).getQuality()) |
93 | { | 137 | { |
94 | - currentQuality = newQuality; | ||
95 | - currentVideo--; //Corregimos el del loadVideo() | ||
96 | - loadVideo(); //Cargamos la nueva calidad | 138 | + break; |
97 | } | 139 | } |
98 | } | 140 | } |
99 | - else if((bps > qualities.get(currentQuality).getQuality()) && (bps != -1)) | 141 | + if(currentQuality != newQuality) |
100 | { | 142 | { |
101 | - int newQuality; | ||
102 | - for(newQuality = qualities.size()-1; newQuality > 0; newQuality--) | ||
103 | - { | ||
104 | - if(bps <= qualities.get(newQuality).getQuality()) | ||
105 | - { | ||
106 | - newQuality--; | ||
107 | - break; | ||
108 | - } | ||
109 | - } | ||
110 | - if(currentQuality != newQuality) | 143 | + currentQuality = newQuality; |
144 | + currentVideo--; //Corregimos el del loadVideo() | ||
145 | + loadVideo(); //Cargamos la nueva calidad | ||
146 | + } | ||
147 | + } | ||
148 | + else if((bps > qualities.get(currentQuality).getQuality()) && (bps != -1)) | ||
149 | + { | ||
150 | + int newQuality; | ||
151 | + for(newQuality = qualities.size()-1; newQuality > 0; newQuality--) | ||
152 | + { | ||
153 | + if(bps <= qualities.get(newQuality).getQuality()) | ||
111 | { | 154 | { |
112 | - currentQuality = newQuality; | ||
113 | - currentVideo--; //Corregimos el del loadVideo() | ||
114 | - loadVideo(); //Cargamos la nueva calidad | 155 | + newQuality--; |
156 | + break; | ||
115 | } | 157 | } |
116 | } | 158 | } |
159 | + if(currentQuality != newQuality) | ||
160 | + { | ||
161 | + currentQuality = newQuality; | ||
162 | + currentVideo--; //Corregimos el del loadVideo() | ||
163 | + loadVideo(); //Cargamos la nueva calidad | ||
164 | + } | ||
117 | } | 165 | } |
118 | - return path; | ||
119 | - } | ||
120 | - | ||
121 | - public void descarregarguardar(String url, String path) | ||
122 | - { | ||
123 | - Request req = new Request(Uri.parse(url)); | ||
124 | - req.setVisibleInDownloadsUi(false); | ||
125 | - req.setDestinationUri(Uri.parse("file://"+path + url.substring(url.lastIndexOf("/")+1, url.length()))); | ||
126 | - dm.enqueue(req); | ||
127 | } | 166 | } |
128 | 167 | ||
129 | public String previous() throws IOException | 168 | public String previous() throws IOException |
@@ -136,9 +175,127 @@ public class HLS | @@ -136,9 +175,127 @@ public class HLS | ||
136 | seg = segments.get(currentSegment++); | 175 | seg = segments.get(currentSegment++); |
137 | return localFolder + seg.getURL().substring(seg.getURL().lastIndexOf("/") + 1, seg.getURL().length()); | 176 | return localFolder + seg.getURL().substring(seg.getURL().lastIndexOf("/") + 1, seg.getURL().length()); |
138 | } | 177 | } |
139 | - | ||
140 | - public void startDownloadManager(Context ctx) | 178 | + |
179 | + public boolean hasEnded() | ||
180 | + { | ||
181 | + return ended; | ||
182 | + } | ||
183 | + | ||
184 | + public void buffer() | ||
185 | + { | ||
186 | + video.stopPlayback(); | ||
187 | + started = false; | ||
188 | + } | ||
189 | + | ||
190 | + public void downloadSegment(String url) | ||
141 | { | 191 | { |
142 | - dm = (DownloadManager) ctx.getSystemService("download"); | 192 | + DescarregaSegment ds = new DescarregaSegment(vActivity); |
193 | + try | ||
194 | + { | ||
195 | + ds.execute(new URL(url)); | ||
196 | + } | ||
197 | + catch (MalformedURLException e) | ||
198 | + { | ||
199 | + e.printStackTrace(); | ||
200 | + } | ||
201 | + } | ||
202 | + | ||
203 | + public class DescarregaSegment extends AsyncTask<URL, Integer, Long> | ||
204 | + { | ||
205 | + final static String TAG = "DescarregaSegment"; | ||
206 | + private Context ctx; | ||
207 | + private long bps; | ||
208 | + AlertDialog alertDialog; | ||
209 | + | ||
210 | + public DescarregaSegment(Context c) | ||
211 | + { | ||
212 | + ctx = c; | ||
213 | + bps = 0; | ||
214 | + AlertDialog.Builder builder = new AlertDialog.Builder(vActivity); | ||
215 | + LayoutInflater inflater = vActivity.getLayoutInflater(); | ||
216 | + builder.setView(inflater.inflate(R.layout.buffering_dialog,null)); | ||
217 | + alertDialog = builder.create(); | ||
218 | + } | ||
219 | + | ||
220 | + | ||
221 | + @Override | ||
222 | + protected Long doInBackground(URL... urls) | ||
223 | + { | ||
224 | + if(!started) | ||
225 | + { | ||
226 | + alertDialog.show(); | ||
227 | + } | ||
228 | + Long downloaded = Long.valueOf(0); | ||
229 | + long startTime = System.currentTimeMillis(); | ||
230 | + long segmentBytes = TrafficStats.getTotalRxBytes(); | ||
231 | + Log.d(TAG, "Velocitat actual (KB/s): " + (bps / 8e3)); | ||
232 | + // Iniciem la connexi� i creem els Streams | ||
233 | + try | ||
234 | + { | ||
235 | + FileOutputStream out = new FileOutputStream(localFolder + "video.ts"); | ||
236 | + BufferedInputStream in = new BufferedInputStream(urls[0].openStream()); | ||
237 | + Log.d(TAG, "\nDescarregant: \n"); | ||
238 | + Log.d(TAG, ">> URL: " + urls[0]); | ||
239 | + byte data[] = new byte[102400]; | ||
240 | + int count; | ||
241 | + while ((count = in.read(data)) != -1) | ||
242 | + { | ||
243 | + downloaded += count; | ||
244 | + out.write(data, 0, count); | ||
245 | + } | ||
246 | + out.flush(); | ||
247 | + out.close(); | ||
248 | + in.close(); | ||
249 | + bps = (long) bm.Measure(segmentBytes, startTime); | ||
250 | + Log.d(TAG, "Descarrega finalitzada"); | ||
251 | + } | ||
252 | + catch(IOException e) | ||
253 | + { | ||
254 | + this.cancel(true); | ||
255 | + Toast.makeText(ctx, e.getMessage(), Toast.LENGTH_LONG).show(); | ||
256 | + return Long.valueOf(-1); | ||
257 | + } | ||
258 | + return downloaded; | ||
259 | + } | ||
260 | + protected void onPostExecute(Long result) | ||
261 | + { | ||
262 | + totalDownloaded += result; | ||
263 | + if(ended = true) | ||
264 | + { | ||
265 | + quitPlayer((VideoActivity) ctx); | ||
266 | + } | ||
267 | + if(TRIGGER_PLAY == -1) | ||
268 | + { | ||
269 | + long Bps = (long) (result/segments.get(currentSegment).getDuration()); | ||
270 | + TRIGGER_PLAY = 15*Bps/1000; | ||
271 | + } | ||
272 | + if(!started && totalDownloaded >= TRIGGER_PLAY) | ||
273 | + { | ||
274 | + alertDialog.dismiss(); | ||
275 | + started = true; | ||
276 | + video.start(); | ||
277 | + video.requestFocus(); | ||
278 | + } | ||
279 | + String newSegment = null; | ||
280 | + try | ||
281 | + { | ||
282 | + updateQuality((long) bps); | ||
283 | + newSegment = next(); | ||
284 | + } | ||
285 | + catch(IOException e) | ||
286 | + { | ||
287 | + Toast.makeText(ctx, "No s'ha trobat el segment", Toast.LENGTH_LONG).show(); | ||
288 | + quitPlayer((VideoActivity) ctx); | ||
289 | + } | ||
290 | + if(newSegment.equals(null)) | ||
291 | + { | ||
292 | + ended = true; | ||
293 | + } | ||
294 | + else | ||
295 | + { | ||
296 | + downloadSegment(newSegment); | ||
297 | + } | ||
298 | + return; | ||
299 | + } | ||
143 | } | 300 | } |
144 | } | 301 | } |
145 | \ No newline at end of file | 302 | \ No newline at end of file |
src/com/upc/pbe/upcnews/MainActivity.java
@@ -21,7 +21,8 @@ import android.widget.TextView; | @@ -21,7 +21,8 @@ import android.widget.TextView; | ||
21 | import android.widget.Toast; | 21 | import android.widget.Toast; |
22 | 22 | ||
23 | //Finestra incial i activity principal del programa | 23 | //Finestra incial i activity principal del programa |
24 | -public class MainActivity extends Activity implements OnClickListener { | 24 | +public class MainActivity extends Activity implements OnClickListener |
25 | +{ | ||
25 | 26 | ||
26 | private final static String TAG = "Main"; | 27 | private final static String TAG = "Main"; |
27 | private static String html; | 28 | private static String html; |
@@ -78,19 +79,18 @@ public class MainActivity extends Activity implements OnClickListener { | @@ -78,19 +79,18 @@ public class MainActivity extends Activity implements OnClickListener { | ||
78 | } | 79 | } |
79 | catch (InterruptedException e) | 80 | catch (InterruptedException e) |
80 | { | 81 | { |
81 | - // TODO Auto-generated catch block | ||
82 | e.printStackTrace(); | 82 | e.printStackTrace(); |
83 | } | 83 | } |
84 | catch (ExecutionException e) | 84 | catch (ExecutionException e) |
85 | { | 85 | { |
86 | - // TODO Auto-generated catch block | ||
87 | e.printStackTrace(); | 86 | e.printStackTrace(); |
88 | } | 87 | } |
89 | catch (MalformedURLException e) | 88 | catch (MalformedURLException e) |
90 | { | 89 | { |
91 | Toast.makeText(this, "URL Malformada", Toast.LENGTH_LONG).show(); | 90 | Toast.makeText(this, "URL Malformada", Toast.LENGTH_LONG).show(); |
92 | } | 91 | } |
93 | - if(!html.equals("")) { | 92 | + if(!html.equals("")) |
93 | + { | ||
94 | ((UpcApp) getApplication()).setDesc(html); | 94 | ((UpcApp) getApplication()).setDesc(html); |
95 | startActivity(new Intent(this, Directoris.class)); | 95 | startActivity(new Intent(this, Directoris.class)); |
96 | } | 96 | } |
src/com/upc/pbe/upcnews/ParentList.java
@@ -5,7 +5,6 @@ import java.util.ArrayList; | @@ -5,7 +5,6 @@ import java.util.ArrayList; | ||
5 | public class ParentList | 5 | public class ParentList |
6 | { | 6 | { |
7 | private String ID; | 7 | private String ID; |
8 | - private int currentQuality; | ||
9 | private String Type, Name; | 8 | private String Type, Name; |
10 | private boolean Default; //Estos 3 ultimos son para los ext-x-media, los ext-x-stream lo IGNORAN | 9 | private boolean Default; //Estos 3 ultimos son para los ext-x-media, los ext-x-stream lo IGNORAN |
11 | private ArrayList<Video> lists; //per cada qualitat | 10 | private ArrayList<Video> lists; //per cada qualitat |
@@ -14,7 +13,6 @@ public class ParentList | @@ -14,7 +13,6 @@ public class ParentList | ||
14 | public ParentList(String ID) | 13 | public ParentList(String ID) |
15 | { | 14 | { |
16 | this.ID = ID; | 15 | this.ID = ID; |
17 | - currentQuality = 0; | ||
18 | Type = ""; | 16 | Type = ""; |
19 | Name = ""; | 17 | Name = ""; |
20 | Default = false; | 18 | Default = false; |
@@ -30,15 +28,7 @@ public class ParentList | @@ -30,15 +28,7 @@ public class ParentList | ||
30 | { | 28 | { |
31 | ID = id; | 29 | ID = id; |
32 | } | 30 | } |
33 | - | ||
34 | - public int getCurrentQuality() | ||
35 | - { | ||
36 | - return currentQuality; | ||
37 | - } | ||
38 | - public void setCurrentQuality(int q) | ||
39 | - { | ||
40 | - currentQuality = q; | ||
41 | - } | 31 | + |
42 | 32 | ||
43 | public boolean getDefault() | 33 | public boolean getDefault() |
44 | { | 34 | { |
src/com/upc/pbe/upcnews/VideoActivity.java
@@ -19,6 +19,7 @@ public class VideoActivity extends Activity { | @@ -19,6 +19,7 @@ public class VideoActivity extends Activity { | ||
19 | private final static String TAG = "VideoActivity"; | 19 | private final static String TAG = "VideoActivity"; |
20 | private VideoView video; | 20 | private VideoView video; |
21 | private HLS h = null; | 21 | private HLS h = null; |
22 | + private String filePath; | ||
22 | 23 | ||
23 | 24 | ||
24 | @Override | 25 | @Override |
@@ -34,20 +35,25 @@ public class VideoActivity extends Activity { | @@ -34,20 +35,25 @@ public class VideoActivity extends Activity { | ||
34 | } | 35 | } |
35 | 36 | ||
36 | setContentView(R.layout.activity_video); | 37 | setContentView(R.layout.activity_video); |
38 | + filePath = ((UpcApp)getApplication()).getLocalPath() + "video.ts"; | ||
37 | video = (VideoView) findViewById(R.id.VideoView1); | 39 | video = (VideoView) findViewById(R.id.VideoView1); |
38 | //Creem un listener associat al fi de l'activitat (el fi de cada ts) | 40 | //Creem un listener associat al fi de l'activitat (el fi de cada ts) |
39 | io.vov.vitamio.widget.MediaController mc = new MediaController(this); | 41 | io.vov.vitamio.widget.MediaController mc = new MediaController(this); |
40 | video.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { | 42 | video.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { |
41 | public void onCompletion(MediaPlayer mp) { | 43 | public void onCompletion(MediaPlayer mp) { |
42 | //Al acabar cada ts, reproduit el seguent | 44 | //Al acabar cada ts, reproduit el seguent |
43 | - playNext(); | 45 | + if(h.hasEnded()) |
46 | + { | ||
47 | + finish(); | ||
48 | + return; | ||
49 | + } | ||
50 | + h.buffer(); | ||
44 | } | 51 | } |
45 | }); | 52 | }); |
46 | mc.setOnFFLeftListener(new View.OnClickListener() { | 53 | mc.setOnFFLeftListener(new View.OnClickListener() { |
47 | public void onClick(View v) { | 54 | public void onClick(View v) { |
48 | Log.d(TAG, "FFLEFT"); | 55 | Log.d(TAG, "FFLEFT"); |
49 | - video.stopPlayback(); | ||
50 | - playPrevious(); | 56 | + video.seekTo(-100); |
51 | } | 57 | } |
52 | }); | 58 | }); |
53 | mc.setOnFFRightListener(new View.OnClickListener() { | 59 | mc.setOnFFRightListener(new View.OnClickListener() { |
@@ -60,39 +66,29 @@ public class VideoActivity extends Activity { | @@ -60,39 +66,29 @@ public class VideoActivity extends Activity { | ||
60 | video.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH); | 66 | video.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH); |
61 | //Creem un gestor HLS, carreguem el video i iniciem la reproduccio | 67 | //Creem un gestor HLS, carreguem el video i iniciem la reproduccio |
62 | h = ((UpcApp)getApplication()).getHLS(); | 68 | h = ((UpcApp)getApplication()).getHLS(); |
63 | - h.startDownloadManager(this); | 69 | + h.setVideoViewer(video); |
70 | + h.setVideoActivity(this); | ||
64 | h.loadVideo(); | 71 | h.loadVideo(); |
65 | video.stopPlayback(); | 72 | video.stopPlayback(); |
66 | video.setMediaController(mc); | 73 | video.setMediaController(mc); |
67 | - playNext(); | ||
68 | - } | ||
69 | - | ||
70 | - public void play(String url) { | ||
71 | - if(url == null) { | ||
72 | - super.finish(); | ||
73 | - return; | ||
74 | - } | ||
75 | - Log.d(TAG,"A reproduir: " + url); | ||
76 | - video.setVideoPath("file://" + url); | ||
77 | - video.start(); | ||
78 | - video.requestFocus(); | 74 | + video.setVideoPath("file://" + filePath); |
75 | + h.downloadSegment(playNext()); | ||
79 | } | 76 | } |
80 | 77 | ||
81 | - public void playNext() { | 78 | + public String playNext() { |
82 | try { | 79 | try { |
83 | - String next = h.next(); | ||
84 | - play(next); | 80 | + return h.next(); |
85 | } | 81 | } |
86 | catch(IOException e) { | 82 | catch(IOException e) { |
87 | Toast.makeText(this, "No s'ha trobat el segment", Toast.LENGTH_LONG).show(); | 83 | Toast.makeText(this, "No s'ha trobat el segment", Toast.LENGTH_LONG).show(); |
88 | super.finish(); | 84 | super.finish(); |
89 | - return; | 85 | + return ""; |
90 | } | 86 | } |
91 | } | 87 | } |
92 | public void playPrevious() { | 88 | public void playPrevious() { |
93 | try { | 89 | try { |
94 | String prev = h.previous(); | 90 | String prev = h.previous(); |
95 | - play(prev); | 91 | + //play(prev); |
96 | } | 92 | } |
97 | catch(IOException e) { | 93 | catch(IOException e) { |
98 | Toast.makeText(this, "No s'ha trobat el segment", Toast.LENGTH_LONG).show(); | 94 | Toast.makeText(this, "No s'ha trobat el segment", Toast.LENGTH_LONG).show(); |
@@ -107,4 +103,5 @@ public class VideoActivity extends Activity { | @@ -107,4 +103,5 @@ public class VideoActivity extends Activity { | ||
107 | video.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0); | 103 | video.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0); |
108 | super.onConfigurationChanged(newConfig); | 104 | super.onConfigurationChanged(newConfig); |
109 | } | 105 | } |
106 | + | ||
110 | } | 107 | } |
111 | \ No newline at end of file | 108 | \ No newline at end of file |