0

私はビデオをWebサービスに送信し、10MB未満のビデオで問題なく動作します.ビデオが約12MBの場合、メモリ不足エラーが発生します:

これは私のコードです:

 FileInputStream fileInputStream = new FileInputStream(fichero);

                int bytesAvailable = fileInputStream.available();
                int maxBufferSize = 1024 * 1024 * 2;
                int bufferSize = Math.min(bytesAvailable, maxBufferSize);
                byte[] buffer = new byte[bufferSize];

                int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                while (bytesRead > 0) {
                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    // nuevos
                    byte byt[] = new byte[bufferSize];
                    fileInputStream.read(byt);

                    // nuevos
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                    // esto es nuevo
                    dos.write(buffer, 0, bufferSize);
                    // ya no es nuevo
                }

すべてのビデオをバッファリングしているためだと思いますが、バッファに保存せずにこれを送信する方法がわかりません。

これはスタック エラーです。

08-31 08:54:20.925: E/AndroidRuntime(18476): Caused by: java.lang.OutOfMemoryError
08-31 08:54:20.925: E/AndroidRuntime(18476):    at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
08-31 08:54:20.925: E/AndroidRuntime(18476):    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:216)
08-31 08:54:20.925: E/AndroidRuntime(18476):    at org.apache.harmony.luni.internal.net.www.protocol.http.RetryableOutputStream.write(RetryableOutputStream.java:60)
08-31 08:54:20.925: E/AndroidRuntime(18476):    at java.io.DataOutputStream.write(DataOutputStream.java:99)
08-31 08:54:20.925: E/AndroidRuntime(18476):    at com.reparalia.movilidad.AdjuntarFicheros$SubeFichero.doInBackground(AdjuntarFicheros.java:702)
08-31 08:54:20.925: E/AndroidRuntime(18476):    at com.reparalia.movilidad.AdjuntarFicheros$SubeFichero.doInBackground(AdjuntarFicheros.java:1)

702 行目は dos.write(buffer, 0, bufferSize); です。

ビデオを送信する方法はありますか?ありがとう

4

3 に答える 3

3

ByteArrayOutputStreamデフォルトでは、32 バイトまたはコンストラクタで指定された量のメモリを割り当てることから始めます。そのバッファがいっぱいになると、バッファのサイズをByteArrayOutputStream 2 倍にします。大きなオブジェクトの場合、これは実際の問題になる可能性があります。あなたの最善の選択肢は、次のいずれかです

  1. コンストラクターで指定されたバッファー サイズを使用するか、または
  2. 書き込みメソッドを拡張ByteArrayOutputStreamおよびオーバーライドして、再割り当てがストリームにとってより有利になるようにします。
于 2012-11-28T14:24:12.023 に答える
1

自分でストリームをコピーするコードを記述する代わりに、ライブラリ クラスを使用してそれを実行してみてください。

Guava では、ByteStreamsクラスが利用可能です。あなたが Commons IO のような人なら、IOUtilsがあります。

IOUtils では、コードは次のようになります。

FileInputStream fileInputStream = new FileInputStream(fichero);
OutputStream dos = ...
IOUtils.copy(fileInputStream, dos);

必要な例外処理とストリーム クロージングを省いています。

于 2012-08-31T07:34:36.603 に答える