package my.app.Library; import java.io.IOException; import java.io.InputStream; import my.app.activityclient.ClientListener; import android.hardware.Camera; import android.media.MediaRecorder; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.Button; public class VideoStreaming implements SurfaceHolder.Callback { private boolean isRecording = false; private static final String TAG = "VideoTest"; private Camera camera; private MediaRecorder mMediaRecorder; private SurfaceHolder holder; private Button captureButton; public static String SOCKET_ADDRESS = "myLocalSocket"; LocalSocket ls; ClientListener ctx; Thread th; int channel; byte[] tmp; public VideoStreaming(ClientListener c, int chan, SurfaceView view) { ctx = c; this.channel = chan; th = new Thread(new Runnable() { public void run() { listen(); } }); th.start(); ls = new LocalSocket(); try { ls.connect(new LocalSocketAddress(SOCKET_ADDRESS)); } catch (IOException e) { stop(); } camera = Camera.open(); SurfaceView cameraView = view; holder = cameraView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void listen() { try { LocalServerSocket server = new LocalServerSocket(SOCKET_ADDRESS); LocalSocket receiver = server.accept(); if (receiver != null) { InputStream input = receiver.getInputStream(); byte[] buffer = new byte[4096]; // simply for java.util.ArrayList while(true) { int read = input.read(buffer); if(read == -1) break; tmp = new byte[read]; System.arraycopy(buffer, 0, tmp, 0, read); ctx.handleData(channel, tmp); //out.write(buffer, 0, readed); } } } catch (IOException e) { Log.e(getClass().getName(), e.getMessage()); } } public void start() { if (prepareVideoRecorder()) { mMediaRecorder.start(); captureButton.setText("Stop"); isRecording = true; } else { releaseMediaRecorder(); releaseCamera(); } } public void stop() { mMediaRecorder.stop(); releaseMediaRecorder(); camera.lock(); isRecording = false; releaseMediaRecorder(); // if you are using MediaRecorder, release it first releaseCamera(); // release the camera immediately on pause event } private boolean prepareVideoRecorder(){ mMediaRecorder = new MediaRecorder(); // Step 1: Unlock and set camera to MediaRecorder camera.unlock(); mMediaRecorder.setCamera(camera); // Step 2: Set sources mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) //mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); // Step 3: Set output format and encoding (for versions prior to API Level 8) mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // Step 4: Set output file mMediaRecorder.setOutputFile(ls.getFileDescriptor()); // Step 5: Set the preview output //mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); mMediaRecorder.setPreviewDisplay(holder.getSurface()); Log.i(TAG, "Surface valid: "+holder.getSurface().isValid()); // Step 6: Prepare configured MediaRecorder try { mMediaRecorder.prepare(); } catch (Exception e) { Log.d(TAG, "Exception preparing MediaRecorder: " + e.getMessage()); releaseMediaRecorder(); return false; } return true; } private void releaseMediaRecorder(){ if (mMediaRecorder != null) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; camera.lock(); } } private void releaseCamera(){ if (camera != null){ camera.release(); // release the camera for other applications camera = null; } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder holder) { } public void surfaceDestroyed(SurfaceHolder holder) { } }