2015-04-07 14 views
5

Poiché Android 5.0 fornisce una libreria mediaprojection per acquisire il contenuto dello schermo. ma l'applicazione dimostrativa di esempio fornita da loro non è chiara. U può trovare l'app di esempio here. In tale applicazione si proiettano schermata catturata utilizzando virtualdisplay metodoCome utilizzare la libreria Mediaprojection in Android per acquisire lo schermo e convertirlo in file mp4?

private void setUpVirtualDisplay() { 
    Log.i(TAG, "Setting up a VirtualDisplay: " + 
      mSurfaceView.getWidth() + "x" + mSurfaceView.getHeight() + 
      " (" + mScreenDensity + ")"); 
    mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture", 
      mSurfaceView.getWidth(), mSurfaceView.getHeight(), mScreenDensity, 
      DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, 
      mSurface, null, null); 
    mButtonToggle.setText(R.string.stop); 
} 

voglio convertire schermata catturata in un file mp4 per la mia applicazione registrazione dello schermo. Per favore aiutami a superare questo.

risposta

0

Guarda questo POST. C'è una buona spiegazione su come utilizzare l'API MediaProjection per registrare effettivamente lo schermo in un file mp4 nella memoria esterna. Questa soluzione utilizza il MediaRecorder per archiviare il video.

È possibile trovare un'altra soluzione nella pagina di Matt Snider. Qui lo MediaMuxer viene utilizzato per archiviare il video nella memoria esterna. Ma si noti che l'output di MediaMuxer non è trasmissibile.

1

ecco codice di esempio refference from

public class MainActivity extends AppCompatActivity { 

    private static final String TAG = "MainActivity"; 
    private static final int PERMISSION_CODE = 1; 
    private int mScreenDensity; 
    private MediaProjectionManager mProjectionManager; 
    private static final int DISPLAY_WIDTH = 480; 
    private static final int DISPLAY_HEIGHT = 640; 
    private MediaProjection mMediaProjection; 
    private VirtualDisplay mVirtualDisplay; 
    private MediaProjectionCallback mMediaProjectionCallback; 
    private ToggleButton mToggleButton; 
    private MediaRecorder mMediaRecorder; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     mScreenDensity = metrics.densityDpi; 

     mMediaRecorder = new MediaRecorder(); 
     initRecorder(); 
     prepareRecorder(); 

     mProjectionManager = (MediaProjectionManager) getSystemService 
       (Context.MEDIA_PROJECTION_SERVICE); 

     mToggleButton = (ToggleButton) findViewById(R.id.toggle); 
     mToggleButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onToggleScreenShare(v); 
      } 
     }); 

     mMediaProjectionCallback = new MediaProjectionCallback(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mMediaProjection != null) { 
      mMediaProjection.stop(); 
      mMediaProjection = null; 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode != PERMISSION_CODE) { 
      Log.e(TAG, "Unknown request code: " + requestCode); 
      return; 
     } 
     if (resultCode != RESULT_OK) { 
      Toast.makeText(this, 
        "Screen Cast Permission Denied", Toast.LENGTH_SHORT).show(); 
      mToggleButton.setChecked(false); 
      return; 
     } 
     mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data); 
     mMediaProjection.registerCallback(mMediaProjectionCallback, null); 
     mVirtualDisplay = createVirtualDisplay(); 
     mMediaRecorder.start(); 
    } 

    public void onToggleScreenShare(View view) { 
     if (((ToggleButton) view).isChecked()) { 
      shareScreen(); 
     } else { 
      mMediaRecorder.stop(); 
      mMediaRecorder.reset(); 
      Log.v(TAG, "Recording Stopped"); 
      stopScreenSharing(); 
      initRecorder(); 
      prepareRecorder(); 
     } 
    } 

    private void shareScreen() { 
     if (mMediaProjection == null) { 
      startActivityForResult(mProjectionManager.createScreenCaptureIntent(), PERMISSION_CODE); 
      return; 
     } 
     mVirtualDisplay = createVirtualDisplay(); 
     mMediaRecorder.start(); 
    } 

    private void stopScreenSharing() { 
     if (mVirtualDisplay == null) { 
      return; 
     } 
     mVirtualDisplay.release(); 
     //mMediaRecorder.release(); 
    } 

    private VirtualDisplay createVirtualDisplay() { 
     return mMediaProjection.createVirtualDisplay("MainActivity", 
       DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity, 
       DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, 
       mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/); 
    } 

    private class MediaProjectionCallback extends MediaProjection.Callback { 
     @Override 
     public void onStop() { 
      if (mToggleButton.isChecked()) { 
       mToggleButton.setChecked(false); 
       mMediaRecorder.stop(); 
       mMediaRecorder.reset(); 
       Log.v(TAG, "Recording Stopped"); 
       initRecorder(); 
       prepareRecorder(); 
      } 
      mMediaProjection = null; 
      stopScreenSharing(); 
      Log.i(TAG, "MediaProjection Stopped"); 
     } 
    } 

    private void prepareRecorder() { 
     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
      finish(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      finish(); 
     } 
    } 

    private void initRecorder() { 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mMediaRecorder.setVideoEncodingBitRate(512 * 1000); 
     mMediaRecorder.setVideoFrameRate(30); 
     mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT); 
     mMediaRecorder.setOutputFile("/sdcard/capture.mp4"); 
    } 
} 
+0

grazie S.L. Barth. ho aggiunto il codice completo per salvare il file mp4 direttamente in sdcard. –

+1

non funziona su Marshmallow, 'stop fallito: -1007' file video - 0 byte – user25

Problemi correlati