2015-04-07 11 views
5

Seit Android 5.0 bieten sie Mediaprojektion Bibliothek, um Bildschirminhalt zu erfassen. aber die von ihnen zur Verfügung gestellte Demo-Beispielanwendung ist nicht klar. U kann Beispielanwendung here finden. Bei dieser Anwendung werden sie Projizieren erfasst Bildschirm Methode virtualdisplayWie Mediaprojection-Bibliothek in Android verwenden, um Bildschirm zu erfassen und in MP4-Datei zu konvertieren?

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); 
} 

ich für meine Screen-Recording-Anwendung erfasst Bildschirm in MP4-Datei konvertieren möchten. Bitte helfen Sie mir, das zu schaffen.

Antwort

0

Betrachten Sie diese POST. Es gibt eine gute Erklärung, wie man MediaProjection API verwendet, um den Bildschirm tatsächlich zu einer mp4-Datei auf dem externen Speicher aufzuzeichnen. Diese Lösung verwendet den MediaRecorder, um das Video zu speichern. Auf der Seite Matt Snider können Sie eine andere Lösung finden. Dort wird der MediaMuxer verwendet, um das Video auf dem externen Speicher zu speichern. Beachten Sie jedoch, dass die Ausgabe des MediaMuxer nicht streambar ist.

1

hier ist Beispielcode 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

Dank S. L. Barth. Ich habe den vollständigen Code für das Speichern von mp4-Datei direkt in SD-Karte hinzugefügt. –

+1

funktioniert nicht auf Marshmallow, 'stop failed: -1007' Videodatei - 0 Bytes – user25