2016-09-16 17 views
0

私はビデオを記録するアプリを開発しています。ビデオファイルに既に書き込まれたデータを記録プロセスを停止することなく、base64文字列でサーバーに送信する必要があります。誰もが少ないメモリ消費量でそれを作る方法を知っていますか?今、私はこのようファイルへの書き込みファイルの書き込み中にその部分を読む方法は?

private void sendNewVideos(String path) { 
    try { 
     Log.i(TAG, "VIDEO PATH - " + path); 
     FileWriter fileWriter = new FileWriter(new File(pathToFolder + "/temp.txt")); 
     String base64String = new String(); 
     File file = new File(path); 
     Long size = 0L; 
     base64String = Base64.encodeToString(readFile(file, size), Base64.DEFAULT); 

     fileWriter.append(base64String); 
     fileWriter.flush(); 
     boolean flag = true; 
     while (flag) { 
      if (size < file.length()) { 
       base64String = Base64.encodeToString(readFile(file, size), Base64.DEFAULT); 
       fileWriter.append(base64String); 
       fileWriter.flush(); 
       size = file.length(); 
      } 

     } 
     fileWriter.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private byte[] readFile(File file, Long size) { 
    try { 
     RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); 

     randomAccessFile.seek(size); 
     FileChannel fileChannel = randomAccessFile.getChannel(); 
     ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 2); 
     while (fileChannel.read(buffer) > 0) { 
      buffer.flip(); 
      byte[] temp = new byte[buffer.limit()]; 
      for (int i = 0; i < buffer.limit(); i++) { 
       temp[i] = buffer.get(i); 
      } 
      buffer.clear(); 
      return temp; 
     } 
     fileChannel.close(); 
     randomAccessFile.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

それをやっているために

はちょうどそれがどのように動作するかを確認することです。しかし、しばらくしてから録音が止まる。時々LogCatは次のようなものを表示します

I/art: Thread[3,tid=23425,WaitingInMainSignalCatcherLoop,Thread*=0x7fe42c410800,peer=0x22c08080,"Signal Catcher"]: reacting to signal 3 
I/art: Wrote stack traces to '/data/anr/traces.txt' 

メモリリークまたはメモリ不足のいずれかの問題が考えられます。

+1

あなたのアプローチを共有できますか? –

+0

まだアプローチはありません。私が上に示したもの。 – Arthur

+0

データの記録速度はどれくらいですか?あなたのサーバーにどれくらいの帯域幅がありますか?ベース64エンコーディングにはどれくらいの余分な帯域幅が必要ですか?あなたの録画レートがあなたの帯域幅よりも大きい場合、データはバックアップになるでしょう。そして、データをコード化するbase64は、おそらくそれをより悪化させるでしょう。可能であれば、サーバー*でそれを行うでしょう。それまで積極的に書かれているファイルを読む限り、Javaはそれに絶対に恐ろしいものになるでしょう。 'open()'や 'read()'のような低レベルのC IOを使ってうまくいくのは難しいです。 Javaは、あなたが制御できないあらゆる種類のバッファリングとキャッシングを追加します。 –

答えて

0

何らかの解決策です。

  1. 、それはバッテリーのための非常に良いではないですし、プロセス/サービスを殺すか、ハングアップする可能性があり、約10倍のデータ量が増大などのネットワークを介して送信するためのビデオをエンコードするために(でもWi-Fiを提供して)をBase64を使用しないでください。
  2. 書き込み処理中のファイルの読み込みを避け、IOの動作速度を遅くします。
  3. あなたはまだ、次のアルゴリズムのいくつかの種類を使用し、そのようなファイルからデータを送信する必要がある場合:
    1. は(バッファリングされた入力ストリームに例えば)ファイルへのアクセスを取得します。
    2. バッファにファイルの一部を読み込みます。
    3. できるだけ簡単に作業してください。たとえば、HTTPUrlConnectionを使用して別のスレッドでサーバーにバッファを送信します。例hereがあります。
    4. コントロールはメモリを使用します。そうでない場合、システムはプロセスを終了しようとします。
関連する問題