2013-07-17 46 views
2

我有我需要把它作为以视频观看输入流:传递输入流视频查看

但它说的OutOfMemoryError

这里是我的代码:

//to convert input stream to string 
public static String convertStreamToString(InputStream is) throws Exception { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 

     while ((line = reader.readLine()) != null) { 
      sb.append(line); 
     } 

     is.close(); 

     return sb.toString(); 
    } 

//passing that string to video view 
String total = convertStreamToString(inputStream); 
Uri uri = Uri.parse(total); 
videoHolder.setVideoURI(uri); 

如何这是什么成绩?

编辑

这里是堆栈跟踪

07-17 17:46:34.242: E/AndroidRuntime(5384): FATAL EXCEPTION: main 
07-17 17:46:34.242: E/AndroidRuntime(5384): java.lang.OutOfMemoryError 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at java.lang.StringBuilder.append(StringBuilder.java:216) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at com.abc.Utility.Utils.convertStreamToString(Utils.java:196) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at com.abc.xyz.VideoPlayer.onCreate(VideoPlayer.java:257) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.Activity.performCreate(Activity.java:4635) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2031) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2092) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.ActivityThread.access$600(ActivityThread.java:126) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1172) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.os.Looper.loop(Looper.java:137) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at android.app.ActivityThread.main(ActivityThread.java:4586) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-17 17:46:34.242: E/AndroidRuntime(5384):  at dalvik.system.NativeStart.main(Native Method) 
+0

请张贴整个堆栈跟踪。 – CommonsWare

+2

你是否将视频文件转换为String对象? :D或者改为 - 在字符串对象中加载视频文件? – Shark

+0

@CommonsWare我已经发布堆栈跟踪 – Goofy

回答

2

好,我已经解决了自己,但它的视频文件前3到4秒延时启动

希望它可以帮助一些:

public static String getDataSource(String path) throws IOException { 
     if (!URLUtil.isNetworkUrl(path)) { 
      return path; 
     } else { 
      URL url = new URL(path); 
      URLConnection cn = url.openConnection(); 
      cn.connect(); 
      InputStream stream = cn.getInputStream(); 
      if (stream == null) 
       throw new RuntimeException("stream is null"); 
      File temp = File.createTempFile("mediaplayertmp", "dat"); 
      temp.deleteOnExit(); 
      String tempPath = temp.getAbsolutePath(); 
      FileOutputStream out = new FileOutputStream(temp); 
      byte buf[] = new byte[128]; 
      do { 
       int numread = stream.read(buf); 
       if (numread <= 0) 
        break; 
       out.write(buf, 0, numread); 
      } while (true); 
      try { 
       stream.close(); 
       out.close(); 
      } catch (IOException ex) { 
       // Log.e(TAG, "error: " + ex.getMessage(), ex); 
      } 
      return tempPath; 
     } 
    }