2012-05-26 2 views
4

비디오 바이트 배열 형식을 가지고 있는데, 안드로이드 2.2에서 surfaceViewer를 어떻게 그릴 수 있습니까? i 화상 채팅을 시도하고 있습니다. 나는 onPreviewFrame을 사용하고 있고 바이트를 가지고있다 [] 서버에 보내고 서버가 다른 클라이언트에 보내고 다른 클라이언트가 바이트를 가졌을 것이다 [], 내 문제는 : 어떻게 그릴 수있는이 바이트 ([ ]) 클라이언트?어떻게 안드로이드에서 surfaceviewer에 바이트 배열을 그릴 수 있습니까?

답변

4

여기에 귀하의 앱에 대한 모든 코드가 있습니다. 여기에 귀하의 videochat 또는이 부분이 있습니다. :) 안드로이드 2.2에서 내 코드를 시도하지 않았지만 안드로이드 2.3.3에서 작동합니다. 당신의 전면 카메라 여기

의 비디오를 볼 수 있습니다, 당신은 editText 일부 장치 로컬 IP 주소를 설정하는 경우 다음 IP 주소가 설정 한 채팅 비디오 버튼을, 그래서 다른 부분을 푸시해야하는 것은 자바 코드

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.ImageFormat; 
import android.graphics.Rect; 
import android.graphics.YuvImage; 
import android.hardware.Camera; 
import android.hardware.Camera.ErrorCallback; 
import android.hardware.Camera.Size; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 

public class MainActivity extends Activity implements OnClickListener { 

    private ImageView m_VideCaptureBitmap; 
    Camera mCamera; 
    Button m_StartVideoChat; 
    Button m_close_camera; 
    EditText IPAdresse; 
    private SurfaceView m_VideoCaptureView; 
    private static final int TIMEOUT_MS = 10000; 
    private static final int server_port = 13011; 
    byte[] m_buffer ; 

    @SuppressLint({ "NewApi", "NewApi", "NewApi" }) 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

     StrictMode.setThreadPolicy(policy); 
     m_VideoCaptureView = (SurfaceView) findViewById(R.id.imgSentView); 

     m_close_camera = (Button) findViewById(R.id.btnCameraClose); 
     m_close_camera.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       mCamera.release();    
      } 
     }); 


     m_VideCaptureBitmap = (ImageView) findViewById(R.id.videoView); 
     IPAdresse = (EditText) findViewById(R.id.etIPAdresse); 
     IPAdresse.setText("192.168.2.32"); 
     m_StartVideoChat = (Button) findViewById(R.id.btnStartVideo); 
     m_StartVideoChat.setOnClickListener(this); 


     new Thread(new Runnable() { 
      @Override 
      public void run() { 

       byte[] buffer = new byte [2048]; 
       DatagramSocket s; 

       try { 
        s= new DatagramSocket(server_port); 
        s.setSoTimeout(TIMEOUT_MS); 

        while(true){ 
         try { 
          final DatagramPacket p = new DatagramPacket(buffer, buffer.length); 
          s.receive(p); 

          m_buffer= buffer.clone(); 

          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            frameToBuffer(p.getData()); 
           } 
          }); 
         } 
         catch(Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } catch (SocketException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        //rstep.setText("fail socket create"); 
       } 
      } 

     }).start(); 
    } 

public void onClick(View arg0) { 
    switch(arg0.getId()){ 
    case R.id.btnStartVideo: 
      startVideo(); 

    } 
} 

private Camera openFrontFacingCameraGingerbread(Camera cam) 
{ 
    int cameraCount = 0; 
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
    cameraCount = Camera.getNumberOfCameras(); 
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
     Camera.getCameraInfo(camIdx, cameraInfo); 
     if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ) { 
      try { 
       cam = Camera.open(camIdx); 
      } catch (RuntimeException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    return cam; 
} 

private void startVideo() { 
    if(mCamera != null) return; 
    SurfaceHolder videoCaptureViewHolder = null; 
    try { 
     //openFrontFacingCameraGingerbread(mCamera); 
     int camId = Camera.CameraInfo.CAMERA_FACING_BACK; 
     if (Camera.getNumberOfCameras() > 1 && camId < Camera.getNumberOfCameras() - 1) { 
      int i = 1 + camId ; 
      mCamera = Camera.open(i); 
     } 
     //mCamera = Camera.open(); 
    } catch (RuntimeException e) { 
     Log.e("CameraTest", "Camera Open filed"); 
     return; 
    } 
    mCamera.setErrorCallback(new ErrorCallback() { 
     public void onError(int error, Camera camera) { 
     } 
    }); 
    Camera.Parameters parameters = mCamera.getParameters(); 
    parameters.setPictureSize(10, 10); 
    parameters.setPreviewFrameRate(5); 

    List<Size> supportedPreviewSizes=parameters.getSupportedPreviewSizes(); 
    Iterator<Size> supportedPreviewSizesIterator=supportedPreviewSizes.iterator(); 
    while(supportedPreviewSizesIterator.hasNext()){ 
     Size tmpSize=supportedPreviewSizesIterator.next(); 
     Log.v("CameraTest","supportedPreviewSize.width = "+tmpSize.width+"supportedPreviewSize.height = "+tmpSize.height); 
    } 

    mCamera.setParameters(parameters); 
    if (null != m_VideoCaptureView) 
     videoCaptureViewHolder = m_VideoCaptureView.getHolder(); 
    try { 
     mCamera.setPreviewDisplay(videoCaptureViewHolder); 
    } catch (Throwable t) { 
    } 
    Log.v("CameraTest","Camera PreviewFrameRate = "+mCamera.getParameters().getPreviewFrameRate()); 
    Size previewSize=mCamera.getParameters().getPreviewSize(); 
    int dataBufferSize=(int)(previewSize.height*previewSize.width* 
          (ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8.0)); 
    mCamera.addCallbackBuffer(new byte[dataBufferSize]); 
    mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { 

     private long timestamp=0; 
     public synchronized void onPreviewFrame(byte[] data, Camera camera) { 

      int size = data.length; 
      Size previewSize = camera.getParameters().getPreviewSize(); 
      YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      //yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos); 
      yuvimage.compressToJpeg(new Rect(0, 0, 128, 96), 80, baos); 
      byte[] jdata = baos.toByteArray(); 
      int sizeOfData = jdata.length; 

      DatagramSocket s; 
      try { 
       s = new DatagramSocket(); 
       s.setBroadcast(true); 
       s.setSoTimeout(TIMEOUT_MS); 
       InetAddress local = InetAddress.getByName(IPAdresse.getText().toString()); 

       DatagramPacket p = new DatagramPacket(jdata, jdata.length, local,server_port); 
       s.send(p); 

       } catch (SocketException e) { 
         e.printStackTrace(); 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      // Convert to Bitmap 
      //Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); 
      //m_VideCaptureBitmap.setImageBitmap(bmp); 
      //bitmapArray.add(bmp); 


      // set our renderer to be the main renderer with 
      // the current activity context 

      //setContentView(glSurfaceView); 



      Log.v("CameraTest","Frame size = "+ data.length); 
      timestamp=System.currentTimeMillis(); 
      try{ 
       camera.addCallbackBuffer(data); 
      }catch (Exception e) { 
       Log.e("CameraTest", "addCallbackBuffer error"); 
       return; 
      } 
      return; 
     } 
    }); 

    try { 
     mCamera.startPreview(); 
    } catch (Throwable e) { 
     mCamera.release(); 
     mCamera = null; 
     return; 
    } 
} 


    private void frameToBuffer(byte[] data) { 
     Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
     m_VideCaptureBitmap.setImageBitmap(bmp);   
    } 
} 
에게 있습니다 여기에

그것을 시도; :) 찬성 투표하는 것을 잊지 마세요), 또한 manifest.xml

<uses-permission android:name="android.permission.CAMERA" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 
    <uses-feature android:name="android.hardware.camera.front" android:required="false" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 

감사에서 이러한 행을 추가하는 것을 잊지 마세요

관련 문제