Commit 9419e4f97245b66726eaf119f5d0887c9b270f3b

Authored by Imanol-Mikel Barba Sabariego
1 parent bd6acc35

Release Candidate (intentaré implementar reproducción continua, sino, nos quedam…

…os con esto, TODAS LAS MODIFICACIONS SE HARÁN A PARTIR DE AQUÍ
src/com/upc/pbe/upcnews/BandwidthMeasurer.java
... ... @@ -18,6 +18,7 @@ public class BandwidthMeasurer
18 18 Log.d(TAG, "Diferencia de bytes = " + rxDiff);
19 19 if(rxDiff != 0){
20 20 bps = ((rxDiff*8) / (TimeDifference/1000)); // total de rx en bits per second.
  21 + Log.d(TAG, "Velocitat actual (KB/s): " + (bps / 8e3));
21 22 }
22 23 else{
23 24 bps = -1; //No s'han trasmes dades
... ...
src/com/upc/pbe/upcnews/HLS.java
1 1 package com.upc.pbe.upcnews;
2 2  
3   -import io.vov.vitamio.widget.VideoView;
4   -
5   -import java.io.BufferedInputStream;
6 3 import java.io.File;
7   -import java.io.FileOutputStream;
8 4 import java.io.IOException;
9   -import java.net.MalformedURLException;
10   -import java.net.URL;
11 5 import java.util.ArrayList;
12 6  
13   -import android.app.AlertDialog;
14   -import android.content.Context;
15   -import android.net.TrafficStats;
16   -import android.os.AsyncTask;
17 7 import android.util.Log;
18   -import android.view.LayoutInflater;
19   -import android.widget.Toast;
20 8  
21 9 //Gestor del protocol HTTP Live Streaming
22 10 public class HLS
23 11 {
24   - private static long TRIGGER_PLAY;
  12 +
25 13 private static final String TAG = "HLS";
26 14 private ArrayList<ParentList> videos;
27 15 private ArrayList<Segment> segments;
... ... @@ -30,14 +18,6 @@ public class HLS
30 18 private int currentQuality; // 0 es la mas alta
31 19 private int currentSegment;
32 20 private boolean endReached;
33   - private String localFolder;
34   - private BandwidthMeasurer bm;
35   - private boolean started;
36   - private boolean ended;
37   - private long totalDownloaded;
38   - private VideoView video;
39   - private VideoActivity vActivity;
40   -
41 21  
42 22 public HLS(ArrayList<ParentList> parsed, String localFolder)
43 23 {
... ... @@ -54,47 +34,6 @@ public class HLS
54 34 currentVideo = currentQuality = currentSegment = 0;
55 35 this.videos = parsed;
56 36 endReached = false;
57   - this.localFolder = localFolder;
58   - bm = new BandwidthMeasurer();
59   - started = ended = false;
60   - totalDownloaded = 0;
61   - }
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 37 }
99 38  
100 39 public void loadVideo()
... ... @@ -106,7 +45,6 @@ public class HLS
106 45 {
107 46 endReached = true;
108 47 }
109   - setBufferSize();
110 48 }
111 49  
112 50 public String next() throws IOException
... ... @@ -121,9 +59,13 @@ public class HLS
121 59 loadVideo();
122 60 }
123 61 Segment seg = segments.get(currentSegment++);
124   - String path = localFolder+seg.getURL().substring(seg.getURL().lastIndexOf("/") + 1, seg.getURL().length());
125 62 Log.d(TAG, seg.getName() + " " + seg.getURL());
126   - return path;
  63 + return seg.getURL();
  64 + }
  65 +
  66 + public long getCurrentSegmentDuration()
  67 + {
  68 + return (long) segments.get(currentSegment).getDuration();
127 69 }
128 70  
129 71 public void updateQuality(long bps)
... ... @@ -165,137 +107,5 @@ public class HLS
165 107 }
166 108 }
167 109  
168   - public String previous() throws IOException
169   - {
170   - Segment seg = null;
171   - if (--currentSegment > 0)
172   - {
173   - --currentSegment;
174   - }
175   - seg = segments.get(currentSegment++);
176   - return localFolder + seg.getURL().substring(seg.getURL().lastIndexOf("/") + 1, seg.getURL().length());
177   - }
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)
191   - {
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 110  
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   - }
300   - }
301 111 }
302 112 \ No newline at end of file
... ...
src/com/upc/pbe/upcnews/VideoActivity.java
1 1 package com.upc.pbe.upcnews;
2 2  
3 3 import io.vov.vitamio.MediaPlayer;
  4 +import io.vov.vitamio.R;
4 5 import io.vov.vitamio.widget.MediaController;
5 6 import io.vov.vitamio.widget.VideoView;
6 7  
  8 +import java.io.BufferedInputStream;
  9 +import java.io.FileOutputStream;
7 10 import java.io.IOException;
  11 +import java.net.MalformedURLException;
  12 +import java.net.URL;
  13 +import java.util.ArrayList;
8 14  
9 15 import android.app.Activity;
  16 +import android.app.ProgressDialog;
10 17 import android.content.res.Configuration;
  18 +import android.net.TrafficStats;
  19 +import android.os.AsyncTask;
11 20 import android.os.Bundle;
12 21 import android.util.Log;
13 22 import android.view.View;
... ... @@ -20,6 +29,13 @@ public class VideoActivity extends Activity {
20 29 private VideoView video;
21 30 private HLS h = null;
22 31 private String filePath;
  32 + private BandwidthMeasurer bm;
  33 + private ProgressDialog pd;
  34 + ArrayList<String> queue;
  35 + ArrayList<String> playedQueue;
  36 + int currentPos;
  37 + boolean ended;
  38 + boolean buffering;
23 39  
24 40  
25 41 @Override
... ... @@ -33,49 +49,44 @@ public class VideoActivity extends Activity {
33 49 {
34 50 return;
35 51 }
36   -
37 52 setContentView(R.layout.activity_video);
38   - filePath = ((UpcApp)getApplication()).getLocalPath() + "video.ts";
  53 + currentPos = 0;
  54 + queue = new ArrayList<String>();
  55 + playedQueue = new ArrayList<String>();
  56 + buffering = true;
  57 + ended = false;
  58 + filePath = ((UpcApp)getApplication()).getLocalPath();
39 59 video = (VideoView) findViewById(R.id.VideoView1);
40 60 //Creem un listener associat al fi de l'activitat (el fi de cada ts)
41 61 io.vov.vitamio.widget.MediaController mc = new MediaController(this);
42 62 video.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
43 63 public void onCompletion(MediaPlayer mp) {
44 64 //Al acabar cada ts, reproduit el seguent
45   - if(h.hasEnded())
46   - {
47   - finish();
48   - return;
49   - }
50   - h.buffer();
  65 + playNext();
51 66 }
52 67 });
53 68 mc.setOnFFLeftListener(new View.OnClickListener() {
54 69 public void onClick(View v) {
55 70 Log.d(TAG, "FFLEFT");
56   - video.seekTo(-100);
  71 + playPrevious();
57 72 }
58 73 });
59 74 mc.setOnFFRightListener(new View.OnClickListener() {
60 75 public void onClick(View v) {
61 76 Log.d(TAG, "FFRIGHT");
62   - video.stopPlayback();
63 77 playNext();
64 78 }
65 79 });
66 80 video.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);
67 81 //Creem un gestor HLS, carreguem el video i iniciem la reproduccio
68 82 h = ((UpcApp)getApplication()).getHLS();
69   - h.setVideoViewer(video);
70   - h.setVideoActivity(this);
71 83 h.loadVideo();
72   - video.stopPlayback();
73 84 video.setMediaController(mc);
74   - video.setVideoPath("file://" + filePath);
75   - h.downloadSegment(playNext());
  85 + bm = new BandwidthMeasurer();
  86 + downloadSegment(getNext());
76 87 }
77 88  
78   - public String playNext() {
  89 + public String getNext() {
79 90 try {
80 91 return h.next();
81 92 }
... ... @@ -85,16 +96,95 @@ public class VideoActivity extends Activity {
85 96 return "";
86 97 }
87 98 }
88   - public void playPrevious() {
89   - try {
90   - String prev = h.previous();
91   - //play(prev);
  99 +
  100 + public void toggleBuffering(boolean b)
  101 + {
  102 + if(b)
  103 + {
  104 + pd = new ProgressDialog(VideoActivity.this);
  105 + pd.setCancelable(false);
  106 + pd.setMessage(getString(R.string.buffering_text));
  107 + pd.show();
92 108 }
93   - catch(IOException e) {
94   - Toast.makeText(this, "No s'ha trobat el segment", Toast.LENGTH_LONG).show();
95   - super.finish();
  109 + else if(pd != null)
  110 + {
  111 + pd.dismiss();
  112 + pd = null;
  113 + }
  114 + }
  115 +
  116 + public void quitPlayer()
  117 + {
  118 + video.stopPlayback();
  119 + super.finish();
  120 + return;
  121 + }
  122 +
  123 + public void buffer()
  124 + {
  125 + buffering = true;
  126 + video.suspend();
  127 + }
  128 + public void play(String path)
  129 + {
  130 + toggleBuffering(false);
  131 + video.setVideoPath(path);
  132 + video.start();
  133 + video.requestFocus();
  134 + }
  135 +
  136 + public void playNext()
  137 + {
  138 + if(++currentPos > 0)
  139 + {
  140 + currentPos = 0;
  141 + }
  142 + if(currentPos == 0)
  143 + {
  144 + playedQueue.add(queue.get(0));
  145 + queue.remove(0);
  146 + if(ended && queue.isEmpty())
  147 + {
  148 + VideoActivity.super.finish();
  149 + return;
  150 + }
  151 + if(queue.isEmpty())
  152 + {
  153 + buffer();
  154 + }
  155 + play(queue.get(0));
  156 + }
  157 + else if(currentPos < 0)
  158 + {
  159 + play(playedQueue.get(playedQueue.size() + currentPos));
  160 + }
  161 + }
  162 +
  163 + public void playPrevious()
  164 + {
  165 + if(playedQueue.isEmpty())
  166 + {
  167 + play(queue.get(0));
96 168 return;
97 169 }
  170 + else if(playedQueue.size() + (--currentPos) < 0)
  171 + {
  172 + currentPos++;
  173 + }
  174 + play(playedQueue.get(playedQueue.size() + currentPos));
  175 + }
  176 +
  177 + public void downloadSegment(String url)
  178 + {
  179 + DescarregaSegment ds = new DescarregaSegment();
  180 + try
  181 + {
  182 + ds.execute(new URL(url));
  183 + }
  184 + catch (MalformedURLException e)
  185 + {
  186 + e.printStackTrace();
  187 + }
98 188 }
99 189  
100 190 @Override
... ... @@ -104,4 +194,87 @@ public class VideoActivity extends Activity {
104 194 super.onConfigurationChanged(newConfig);
105 195 }
106 196  
  197 + public class DescarregaSegment extends AsyncTask<URL, Void, Void>
  198 + {
  199 + final static String TAG = "DescarregaSegment";
  200 + private long bps;
  201 +
  202 + public DescarregaSegment()
  203 + {
  204 + bps = 0;
  205 + pd = null;
  206 + }
  207 +
  208 + @Override
  209 + protected void onPreExecute()
  210 + {
  211 + if(queue.isEmpty() && !ended)
  212 + {
  213 + toggleBuffering(true);
  214 + }
  215 + }
  216 +
  217 + @Override
  218 + protected Void doInBackground(URL... urls)
  219 + {
  220 + Long downloaded = Long.valueOf(0);
  221 + long startTime = System.currentTimeMillis();
  222 + long segmentBytes = TrafficStats.getTotalRxBytes();
  223 + String fileName = urls[0].toString().substring(urls[0].toString().lastIndexOf("/"));
  224 + // Iniciem la connexi� i creem els Streams
  225 + try
  226 + {
  227 + FileOutputStream out = new FileOutputStream(filePath + fileName,true);
  228 + BufferedInputStream in = new BufferedInputStream(urls[0].openStream());
  229 + Log.d(TAG, "\nDescarregant: \n");
  230 + Log.d(TAG, ">> URL: " + urls[0]);
  231 + byte data[] = new byte[102400];
  232 + int count;
  233 + while ((count = in.read(data)) != -1)
  234 + {
  235 + downloaded += count;
  236 + out.write(data, 0, count);
  237 + }
  238 + out.flush();
  239 + out.close();
  240 + in.close();
  241 + bps = (long) bm.Measure(segmentBytes, startTime);
  242 + Log.d(TAG, "Descarrega finalitzada");
  243 + queue.add(filePath + fileName);
  244 + }
  245 + catch(IOException e)
  246 + {
  247 + this.cancel(true);
  248 + Toast.makeText(VideoActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
  249 + return null;
  250 + }
  251 + return null;
  252 + }
  253 + protected void onPostExecute(Void v)
  254 + {
  255 + if(ended)
  256 + {
  257 + return;
  258 + }
  259 +
  260 + if(!queue.isEmpty() && buffering)
  261 + {
  262 + buffering = false;
  263 + play(queue.get(0));
  264 + }
  265 + String newSegment = null;
  266 + h.updateQuality((long) bps);
  267 + newSegment = getNext();
  268 + if(newSegment == null)
  269 + {
  270 + ended = true;
  271 + }
  272 + else
  273 + {
  274 + downloadSegment(newSegment);
  275 + }
  276 + return;
  277 + }
  278 + }
  279 +
107 280 }
108 281 \ No newline at end of file
... ...