1

PHPサーバーへのAndroidの大きなビデオのアップロード、スタックオーバーフローで多くの回答を読みました。

50MBまでの動画をサーバーにアップロード

Android: ビデオのアップロード中に OutOfMemoryError - どのようにチャンクするのが最適ですか?

HTTP POST リクエストを送信して応答を受信する方法は?

試してみましたが、使用しても機能しませんsetChunkedStreamingMode()..ビデオをアップロードすると、OutOfMemoryError

ビデオを5秒間録画すると、うまく機能しますが、8秒または10秒を超えると、ビデオアプリが強制的に閉じられますOutOfMemoryError

私のコード::

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(getString(R.string.login_url)
                        + "uploadvideo");
                HttpResponse response = null;
                InputStream inputStream = getContentResolver().openInputStream(
                        Uri.fromFile(myFile));
                byte[] data = IOUtils.toByteArray(inputStream);
                String type = getFileExtension(myFile.getName().toString());

                String encodeurl = Base64.encodeBytes(data);

                try {

                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                            6);
                    nameValuePairs.add(new BasicNameValuePair("returnformat",
                            "json"));
                    nameValuePairs.add(new BasicNameValuePair("userid",
                            strUserid));

                    nameValuePairs.add(new BasicNameValuePair("video",
                            data.toString()));

                    nameValuePairs.add(new BasicNameValuePair("type", type));
                    nameValuePairs.add(new BasicNameValuePair("title",
                            strVideoName));
                    nameValuePairs.add(new BasicNameValuePair("description",
                            strVideoComments));
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    // Execute HTTP Post Request
                    response = httpclient.execute(httppost);

                    System.out.println(">>>>>>>>>>" + response.toString());

                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

そして、ビデオをアップロードする必要がありBase64 Encoded Stringます。ヒープサイズよりも多くのメモリが原因でメモリエラーが発生することはわかっていますが、ビデオのアップロードに失敗しました。

ログキャット

05-31 23:16:12.114: E/AndroidRuntime(17255): java.lang.RuntimeException: An error occured while executing doInBackground()
05-31 23:16:12.114: E/AndroidRuntime(17255):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.lang.Thread.run(Thread.java:1027)
05-31 23:16:12.114: E/AndroidRuntime(17255): Caused by: java.lang.OutOfMemoryError: (Heap Size=20103KB, Allocated=15700KB, Bitmap Size=0KB)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.CharArrayBuffer.<init>(CharArrayBuffer.java:43)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.ReadWriteCharArrayBuffer.<init>(ReadWriteCharArrayBuffer.java:47)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.BufferFactory.newCharBuffer(BufferFactory.java:82)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.CharBuffer.allocate(CharBuffer.java:53)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.charset.CharsetDecoder.allocateMore(CharsetDecoder.java:261)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:218)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.nio.charset.Charset.decode(Charset.java:488)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.lang.String.<init>(String.java:181)
05-31 23:16:12.114: E/AndroidRuntime(17255):    at java.lang.String.<init>(String.java:141)
4

2 に答える 2

2

エンティティに大きな byte[] を設定しないでください。メモリが不足することは間違いありません。ここで FileEntity を使用できます。

http://developer.android.com/reference/org/apache/http/entity/FileEntity.html

関連する質問とリンク

Android は HttpPost/HttpGet を使用して写真を送信します

これを試してください: HTTP Post を使用して画像を送信する

于 2012-05-31T17:56:38.453 に答える
-5

サーバーから OutOfMemory エラーが発生している場合、php.ini 変数を更新することで簡単に修正できます。

upload_max_filesize = 100M

(またはあなたが快適に感じるものは何でも)

または、投稿している場合は、変更することもできます

post_max_size = 100M
于 2012-05-31T17:57:21.800 に答える