Autore Topic: errore visualizzazione yuv frame  (Letto 468 volte)

Offline loribl85

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    GT-I8190
  • Sistema operativo:
    android 4.1.2
errore visualizzazione yuv frame
« il: 14 Maggio 2014, 12:03:10 CEST »
0
Buongiorno , ho creato un client android per visualizzare lo streaming proveniente da un server in formato yuv.
Quando avvio il client e lo connetto al server il funzionamento va avanti per alcuni secondi fino ad arrivare al seguente errore:dalvikvm-heap Out of memory.

Ho controllato e il problema sembrava essere in onProgressUpdate , e più precisamente quando vado a mostrare il frame a video.

Codice: [Seleziona]
package com.example.clientandroid;

import android.graphics.*;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.net.ParseException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity {

 TextView textResponse;
 EditText editTextAddress, editTextPort;
 Button buttonConnect, buttonClear;
 ImageView vistaimmagine;
 ImageFormat image;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  editTextAddress = (EditText)findViewById(R.id.address);
  editTextPort = (EditText)findViewById(R.id.port);
  buttonConnect = (Button)findViewById(R.id.connect);
  buttonClear = (Button)findViewById(R.id.clear);
  textResponse = (TextView)findViewById(R.id.response);
  vistaimmagine=(ImageView)findViewById(R.id.imageView1);
  buttonConnect.setOnClickListener(buttonConnectOnClickListener);

  buttonClear.setOnClickListener(new OnClickListener(){

   @Override
   public void onClick(View v) {
    textResponse.setText("");
   }});
 }

 OnClickListener buttonConnectOnClickListener =
   new OnClickListener(){

    @Override
    public void onClick(View arg0) {
     /*
      * You have to verify editTextAddress and
      * editTextPort are input as correct format.
      */
       MyClientTask myClientTask = new MyClientTask();


       myClientTask.execute(editTextAddress.getText().toString(),editTextPort.getText().toString());
    }};

 public class MyClientTask extends AsyncTask<String, String, String> {

  String dstAddress;
  int dstPort;
  String response;

  @Override
  protected String doInBackground(String... params) {
   dstPort=Integer.parseInt(params[1]);
   dstAddress=params[0];
   try {
    Socket socket = new Socket(dstAddress, dstPort);
    InputStream inputStream = socket.getInputStream();
    ByteArrayOutputStream byteArrayOutputStream =
                  new ByteArrayOutputStream(614400);
    byte[] buffer = new byte[614400];

    int bytesRead;
             while ((bytesRead = inputStream.read(buffer)) != -1){
                 byteArrayOutputStream.write(buffer, 0, bytesRead);
                 publishProgress(byteArrayOutputStream.toString("UTF-8"));
                 byteArrayOutputStream.flush();

             }
             socket.close();


   } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;
  }
  @Override
  protected void onProgressUpdate(String... text) {
      byte[] videoYuv=new byte[size];
      videoYuv=text[0].getBytes();
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      YuvImage yuvImage = new YuvImage(videoYuv,image.NV21, 320, 240, null);
      yuvImage.compressToJpeg(new Rect(0, 0, 320, 240), 10, out);
      byte[] imageBytes = out.toByteArray();
      Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
      vistaimmagine.setImageBitmap(image);
  }

 }

}

Successivamente ho provato a modificare (giusto per vedere se il problema fosse li) le operazioni fatte in onProgressUpdate con un semplice append nella textResponse, il risultato non cambia , ottengo sempre lo stesso errore e non riesco a capire perchè , qualcuno sà darmi una mano?
Saluti Grazie

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:errore visualizzazione yuv frame
« Risposta #1 il: 14 Maggio 2014, 12:21:45 CEST »
0
Secondo me è perchè ogni volta che viene invocata la OnProgressUpdate, tu vai a creare ogni volta oggetti di dimensioni considerevoli, e ciò avviene ad una velocità superiore a quanto il garbage collector riesce a liberare.

Prova a rimuovere dalla OnProgressUpdate la creazione di oggetti come yuvImage e image, creali una sola volta all'inizio e poi ogni volta riusali. Dovrebbe già migliorare.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store