2013-03-30 3 views
4

Я получаю непрерывные данные UDP (изображение RAW) с моего устройства. Расшифруйте его и используйте растровое шоу наЗадержка при показе изображения используется растровое изображение в android

мой Android-телефон, чтобы он выглядел как видео. Проблема в том, что рамка не показывает

непрерывно. Смена рамы ок. за 2 ~ 3 секунды, но я хочу показать кадр за кадром в 1/30.

Ниже часть моего кода

public class ArDroneMain extends Activity { 
    Bitmap image = null; 
    public ImageView myImageView; 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    animationDrawable = new AnimationDrawable(); 
    myImageView = (ImageView)findViewById(R.id.imageView); 
    thread.start(); 
    } 
} 

Thread thread=new Thread (new Runnable() { 
     Message message; 
    String obj="run";  
    @Override 
    public void run() { 

    while(true){  
     try { 
      Log.e("enter_video_thread","enter_video_thread"); 
      receiveVideoRawData(); 
      Log.e("///receiveVideoRawData ","receiveVideoRawData"); 
      message = handler.obtainMessage(1,obj); 
        handler.sendMessage(message); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    } 
    public Handler handler = new Handler(){ 


    @SuppressLint("NewApi") 
    @Override 
    public void handleMessage(Message msg) { 
      super.handleMessage(msg);   
      String MsgString = (String)msg.obj; 
      if (MsgString.equals("run")) 
      {                     
          Drawable ardrone_Frame_Drawable =newBitmapDrawable(getResources(),image); 
         animationDrawable.addFrame(ardrone_Frame_Drawable,100); 
         myImageView.setBackground(animationDrawable);      



      } 


    } 
}; 


    public void sendTriggerCommand() throws IOException{ 
     byte [] ip_bytes = new byte[] {(byte)192,(byte)168,(byte)1,(byte)1};//Drone address 
     byte[] buf_snd = {0x01, 0x00, 0x00, 0x00};//trigger buffer 
     inet_addr = InetAddress.getByAddress(ip_bytes); 
     DatagramPacket packet_snd = new DatagramPacket(buf_snd, buf_snd.length, i net_addr, ardrone_video_port);  
     socket_video.send(packet_snd); 

} 

    public void receiveVideoRawData() throws IOException{ 
    Log.e("enter_receiveVideoRawData()","enter_receiveVideoRawData()"); 
    socket_video = new DatagramSocket(); 
    byte[] buf_rcv = new byte[153600]; 
    DatagramPacket rawData = new DatagramPacket(buf_rcv, buf_rcv.length); 
     sendTriggerCommand(); 
     Log.e("sendTriggerCommand();","sendTriggerCommand();"); 
     socket_video.receive(rawData); 
     Log.e("socket_video.receive(rawData);","socket_video.receive(rawData);"); 
     ReadRawFileImage readMyRawData=new ReadRawFileImage(); 

     image = readMyRawData.readUINT_RGBImage(buf_rcv); 

}

+0

Попробуйте заснуть в цикле while, чтобы отображать кадр за кадром – 13KZ

ответ

1

Я очень сомневаюсь, что вы можете получить данные, как быстро, особенно сырое изображение.

Что вы могли бы сделать, чтобы улучшить вашу программу может быть:

  • отправки и получения сжатых данных
  • удалить то время как истинный цикл, он никогда не будет руки. Вы должны использовать логический флаг для управления потоком.
  • Используйте AsyncTask для получения данных, декодируйте их в фоновом режиме, затем отобразите их в строке ui.
  • используйте 2 потока с синхронизацией потоков: тот, который считывает данные из сети, второй, который использует эти данные и отображает их. Это было бы намного лучшей архитектурой, которая бы конвейерная обработка двух задач.