2

4x デバイスからビデオをアップロードする際に問題に直面しています。15 秒の vedio 録画で samsung S2 で 30 MB のファイルが作成されることはわかっていますが、最初に php サーバーにビデオをアップロードしようとすると、D のようなメッセージが表示されます。 /dalvikvm(7638): GC_FOR_ALLOC が 263K 解放され、12838K/14087K が 9% 解放され、13 ミリ秒が一時停止され、合計 13 ミリ秒 I/dalvikvm-heap(7638): 1048592 バイトの割り当てでヒープ (フラグ ケース) が 14.481MB に成長します D/dalvikvm(7638) ): GC_FOR_ALLOC 解放 <1K、9% 解放 13861K/15175K、一時停止 22ms、合計 22ms D/dalvikvm(7638): GC_CONCURRENT 解放 <1K、9% 解放 13862K/15175K、一時停止 12ms+2ms、合計 27ms

I know it is the memory managment concept and device memory dependent but I want a real solution for it as I am stuck here from quite a few days.
Below is my code to call and upload the video to server.

public void newmethod( String Imageurl ) throws ClientProtocolException, IOException
{
    byte[] data ; 
    int bytenumber,bufferSize,bytesRead;
    int maxBufferSize = 1*1024*1024;
      DataOutputStream dos = null;
     //File sourceFile =  searchForFileInExternalStorage("video.3gp");

     Log.e("in the method the path", ""+Imageurl);

      FileInputStream fileInputStream = new FileInputStream(Imageurl);
      bytenumber = fileInputStream.available();
      Log.e("in the method the the size of the file is", ""+bytenumber);
     // dos = new DataOutputStream(conn.getOutputStream());
      bufferSize = Math.min(bytenumber, maxBufferSize);
      data = new byte[bufferSize];
     //ProgressDialog pr = new ProgressDialog(getApplicationContext());
    // pr.addContentView(getCurrentFocus(), null);
       // read file and write it into form...
       bytesRead = fileInputStream.read(data, 0, bufferSize);

       while (bytesRead > 0) {
       // dos.write(data, 0, bufferSize);
        bytenumber = fileInputStream.available();
         bufferSize = Math.min(bytenumber, maxBufferSize);
        bytesRead = fileInputStream.read(data, 0, bufferSize);
        }

     // pr.show();


    HttpClient httpClient = new DefaultHttpClient();
    HttpPost postRequest = new HttpPost("http://67.52.165.116/Kakz/mobiles/uploadvideo");
    ByteArrayBody bab = new ByteArrayBody( data, Imageurl);
    MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("user_video", bab);

    FormBodyPart bodyPart=new FormBodyPart("title", new StringBody(title));
    reqEntity.addPart(bodyPart);
    bodyPart=new FormBodyPart("desc", new StringBody(description));
    reqEntity.addPart(bodyPart);
    bodyPart=new FormBodyPart("source", new StringBody("android"));
    reqEntity.addPart(bodyPart); 
    postRequest.setEntity(reqEntity);
    final HttpResponse response = httpClient.execute(postRequest);
    // FileInputStream fileInputStream = new FileInputStream(response.getEntity().getContent());


    runOnUiThread(new Runnable() {
         public void run() {

    //stuff that updates ui

             BufferedReader in = null;
            try {
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            } catch (IllegalStateException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
                String line = null;

    try {
        while((line = in.readLine()) != null) {
            System.out.println(line);

            titleText.setText("");
            descriptionText.setText("");
          //  Toast.makeText(getApplicationContext(), "Video Uploaded successfully", Toast.LENGTH_LONG).show();

            if (line.equalsIgnoreCase("Its too Heavy")) {
            //  pr.dismiss();
                // titleText.setText("");
                //descriptionText.setText("");
                Toast.makeText(getApplicationContext(), "Video size is too heavy", Toast.LENGTH_LONG).show();

            }

            else if (line.equalsIgnoreCase("Error")) {
            //  pr.dismiss();
                // titleText.setText("");
                //descriptionText.setText("");
                Toast.makeText(getApplicationContext(), "Error uploading video", Toast.LENGTH_LONG).show();


            }

            else  if (line.equalsIgnoreCase("Uploaded")) {
                //pr.dismiss();
                 //titleText.setText("");
                //descriptionText.setText("");
                Toast.makeText(getApplicationContext(), "Video uploaded successfully", Toast.LENGTH_LONG).show();

            }

        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
         }
});

Please let me know that how I should manage the code to get it right.
Any help would be appreciated ASAP`enter code here`
4

2 に答える 2

1

4x デバイスからビデオをアップロードする際に問題に直面しています。

それは問題ではない。非常に高コストの操作を行っている場合、これは通常の動作です。あなたのヒープのサイズ(暗黙的に決定された)は一瞬では十分ではないので、大きくする必要があります。マニフェストにどのように書き込むべきかは同等の動作です

android:largeHeap="true"

このプロパティは機能しません。ヒープがより多くのサイズを必要とするとき、必要なときにそれ自体が成長します。このメッセージは通常、メモリがあまりない場合に表示されます。

GC_FOR_ALLOC 解放 263K、9% 解放 12838K/14087K、一時停止 13ms、合計 13ms I/dalvikvm-heap(7638)

ここでは、メモリが 9% しかなく、ヒープを増やす必要があります。通常、これは がALLOC10% 未満の場合に発生し、Thread を使用するかどうかに関係なく、一度は高コストの操作になります。また、ヒープ サイズが 1 つの「臨界点」に達すると、VM だけでなくセキュリティ上の理由から、アプリケーションが自動的に停止されます。

考えられる解決策の 1 つは、ファイルを小さなチャンクに分割し、1 つずつアップロードすることです。

于 2013-03-28T07:53:40.610 に答える
0

私自身の質問に答えるのが良い考えだとは思いません。しかし、多くのものを検索した後、この問題はデバイスに依存し、大量のメモリを消費するプロセスであるため、この問題に対する特定の解決策がないことがわかったので、私のような同じ問題に直面している人のために私の経験を提供したいと思います. 次に、アップロードする前にビデオを圧縮するなどの他のオプションを探しましたが、これにもオープンソース ライブラリはありませんでした。だから今のところ、ビデオのアップロードは最初に思ったほど簡単ではありません。:)

于 2013-04-01T06:41:20.040 に答える