2016-07-30 4 views
0

Я хочу начать запись видео с камеры, когда я нажимаю на lyt и останавливаю запись, когда вы нажмете ее снова. этот код делает файл «myVideo.mp4», но он не воспроизводится. также я не хочу показывать предварительный просмотр. любой может мне помочь?Запись видео без предварительного просмотра

активность Main:

public class ActivityMain extends Activity { 

MediaRecorder rec; 
static Camera camera; 
boolean  isRecording = false; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    LinearLayout lyt = (LinearLayout) findViewById(R.id.lyt); 

    rec = new MediaRecorder(); 

    lyt.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      if (isRecording) { 
       // stop recording and release camera 
       Log.e("TEST", "befor stop"); 
       rec.stop(); // stop the recording 
       Log.e("TEST", "stop"); 
       releaseMediaRecorder(); // release the MediaRecorder object 
       camera.lock(); // take camera access back from MediaRecorder 

       // inform the user that recording has stopped 
       isRecording = false; 
      } else { 
       // initialize video camera 
       if (prepareVideoRecorder()) { 
        // Camera is available and unlocked, MediaRecorder is prepared, 
        // now you can start recording 
        Log.e("TEST", "befor start"); 
        rec.start(); 
        Log.e("TEST", "start"); 

        // inform the user that recording has started 
        isRecording = true; 
       } else { 
        // prepare didn't work, release the camera 
        releaseMediaRecorder(); 
        // inform user 
       } 
      } 

     } 
    }); 

    // Intent intent = new Intent(ActivityMain.this, VideoCapture.class); 
    // startActivity(intent); 
} 


private void releaseMediaRecorder() { 

    if (rec != null) { 
     // rec.reset(); // clear recorder configuration 
     rec.release(); // release the recorder object 
     rec = null; 
     camera.lock(); // lock camera for later use 
     Log.e("TEST", "released"); 
    } 
} 


/** A safe way to get an instance of the Camera object. */ 
public static Camera getCameraInstance() { 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
    } 
    catch (Exception e) { 
     Log.e("TEST", "Camera is not avalable : " + e); 
    } 
    return c; // returns null if camera is unavailable 
} 


private boolean prepareVideoRecorder() { 

    camera = getCameraInstance(); 
    rec = new MediaRecorder(); 

    // Step 1: Unlock and set camera to MediaRecorder 
    camera.unlock(); 
    rec.setCamera(camera); 

    // Step 2: Set sources 
    rec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    rec.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
    rec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

    // Step 4: Set output file 
    rec.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath().toString() + "/" + "myVideo.mp4"); 

    // Step 6: Prepare configured MediaRecorder 
    try { 
     rec.prepare(); 
    } 
    catch (IllegalStateException e) { 
     Log.e("TEST", "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 
     releaseMediaRecorder(); 
     return false; 
    } 
    catch (IOException e) { 
     Log.e("TEST", "IOException preparing MediaRecorder: " + e.getMessage()); 
     releaseMediaRecorder(); 
     return false; 
    } 
    return true; 
} 

}

+0

связаны: http://stackoverflow.com/questions/1252172/android -как на инициализацию-mediarecorder-без-а-уважительной-поверхностно-для-видео-previ – muratgu

ответ

1

Попробуйте этот код. Он работает нормально. Предварительный просмотр показывается, но вы не видите его. Если вы найдете руководство по записи видео без активности, пожалуйста, напишите здесь. Я пытаюсь это сделать.

Manifest.xml

<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    <activity 
     android:name=".CameraActivity" 
     android:screenOrientation="landscape"> 
     <intent-filter> 
      <category android:name="android.intent.category.LAUNCHER"/> 
      <action android:name="android.intent.action.MAIN"/> 
     </intent-filter> 
    </activity> 

CameraActivity.java

public class CameraActivity extends Activity { 

    public static final int MEDIA_TYPE_VIDEO = 2; 
    private boolean isRecording = false; 
    private Camera mCamera; 
    private SurfaceView mPreview; 
    private MediaRecorder mMediaRecorder; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 

     // Create an instance of Camera 
     mCamera = getCameraInstance(); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mPreview); 
    } 

    public void onLinearClick(View v) { 
     if (isRecording) { 
      // stop recording and release camera 
      mMediaRecorder.stop(); // stop the recording 
      releaseMediaRecorder(); // release the MediaRecorder object 
      mCamera.lock();   // take camera access back from MediaRecorder 

      // inform the user that recording has stopped 
      //       setCaptureButtonText("Capture"); 
      isRecording = false; 
     } else { 
      // initialize video camera 
      if (prepareVideoRecorder()) { 
       // Camera is available and unlocked, MediaRecorder is prepared, 
       // now you can start recording 

       try { 
        mMediaRecorder.start(); 

        // inform the user that recording has started 
        //        setCaptureButtonText("Stop"); 
        isRecording = true; 

       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } 

      } else { 
       // prepare didn't work, release the camera 
       releaseMediaRecorder(); 
       // inform user 
      } 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     releaseMediaRecorder();  // if you are using MediaRecorder, release it first 
     releaseCamera();    // release the camera immediately on pause event 
    } 

    private void releaseMediaRecorder(){ 
     if (mMediaRecorder != null) { 
      mMediaRecorder.reset(); // clear recorder configuration 
      mMediaRecorder.release(); // release the recorder object 
      mMediaRecorder = null; 
      mCamera.lock();   // lock camera for later use 
     } 
    } 

    private void releaseCamera(){ 
     if (mCamera != null){ 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
    } 

    /** Create a File for saving an image or video */ 
    private static File getOutputMediaFile(int type){ 
      File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp"); 

     // Create the storage directory if it does not exist 
     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       Log.d("MyCameraApp", "failed to create directory"); 
       return null; 
      } 
     } 

     // Create a media file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     File mediaFile; 
     if(type == MEDIA_TYPE_VIDEO) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
        "VID_"+ timeStamp + ".mp4"); 
     } else { 
      return null; 
     } 

     return mediaFile; 
    } 


    private boolean prepareVideoRecorder(){ 
mMediaRecorder = new MediaRecorder(); 

     // Step 1: Unlock and set camera to MediaRecorder 
     mCamera.unlock(); 
     mMediaRecorder.setCamera(mCamera); 

     // Step 2: Set sources 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

     // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) 
     mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

     // Step 4: Set output file 
     mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 

     // Step 5: Set the preview output 
     mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 

     // Step 6: Prepare configured MediaRecorder 
     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      Log.d("", "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 
      releaseMediaRecorder(); 
      return false; 
     } catch (IOException e) { 
      Log.d("", "IOException preparing MediaRecorder: " + e.getMessage()); 
      releaseMediaRecorder(); 
      return false; 
     } 
     return true; 
    } 

    private static Camera getCameraInstance(){ 
     Camera c = null; 
     try { 
      c = Camera.open(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
      // Camera is not available (in use or does not exist) 
     }return c; // returns null if camera is unavailable 
    } 

    /** A basic Camera preview class */ 
    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
     private SurfaceHolder mHolder; 
     private Camera mCamera; 

     public CameraPreview(Context context, Camera camera) { 
      super(context); 
      mCamera = camera; 

      // Install a SurfaceHolder.Callback so we get notified when the 
      // underlying surface is created and destroyed. 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      // deprecated setting, but required on Android versions prior to 3.0 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     public void surfaceCreated(SurfaceHolder holder) { 
      // The Surface has been created, now tell the camera where to draw the preview. 
      try { 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 
      } catch (IOException e) { 
       Log.d("", "Error setting camera preview: " + e.getMessage()); 
      } 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      // empty. Take care of releasing the Camera preview in your activity. 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      // If your preview can change or rotate, take care of those events here. 
      // Make sure to stop the preview before resizing or reformatting it. 

      if (mHolder.getSurface() == null){ 
       // preview surface does not exist 
       return; 
      } 

      // stop preview before making changes 
      try { 
       mCamera.stopPreview(); 
      } catch (Exception e){ 
       // ignore: tried to stop a non-existent preview 
      } 

      // set preview size and make any resize, rotate or 
      // reformatting changes here 

      // start preview with new settings 
      try { 
       mCamera.setPreviewDisplay(mHolder); 
       mCamera.startPreview(); 

      } catch (Exception e){ 
       Log.d("", "Error starting camera preview: " + e.getMessage()); 
      } 
     } 
    } 
} 

activity_camera.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:onClick="onLinearClick"> 
    <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="1dp" 
     android:layout_height="1dp"/> 
</LinearLayout> 
Смежные вопросы