2015-09-22 3 views
7

मैं नीचे दिए गए लिंक से स्क्रीन रिकॉर्ड के बारे में नमूना कोड का परीक्षण करने का प्रयास करता हूं, मैंने रिकॉर्डिंग ऑडियो को अक्षम करने के लिए कुछ कोड संशोधित किए हैं।क्या मैं एंड्रॉइड स्टूडियो में एमुलेटर में स्क्रीन रिकॉर्ड का परीक्षण कर सकता हूं?

http://www.truiton.com/2015/05/capture-record-android-screen-using-mediaprojection-apis/

मैं एंड्रॉयड स्टूडियो V1.3 में कोड का परीक्षण, लेकिन मैं निम्नलिखित त्रुटि मिलती है, और फ़ाइल capture.mp4 खाली है।

मुझे यकीन नहीं है कि मुझे असली मोबाइल फोन में कोड का परीक्षण करना चाहिए या नहीं? क्या तुम मेरी मदद कर सकते हो ? धन्यवाद!

त्रुटि जानकारी

09-22 06:41:50.250 2167-2167/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: screencapture.truiton.com.myapplication, PID: 2167 
    java.lang.RuntimeException: stop failed. 
      at android.media.MediaRecorder.stop(Native Method) 
      at screencapture.truiton.com.myapplication.MainActivity.onToggleScreenShare(MainActivity.java:93) 
      at screencapture.truiton.com.myapplication.MainActivity$1.onClick(MainActivity.java:55) 
      at android.view.View.performClick(View.java:4780) 
      at android.widget.CompoundButton.performClick(CompoundButton.java:120) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

स्रोत कोड

package screencapture.truiton.com.myapplication; 

public class MainActivity extends Activity { 

    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(Environment.getExternalStorageDirectory() + "/capture.mp4"); 
    } 
} 
+0

देखें: http://stackoverflow.com/questions/26545970/take-a-creenshot-using-mediaprojection –

+0

आप डिवाइस में इसे चलाने का प्रयास क्यों नहीं करते हैं। कम से कम आप कुछ और जानेंगे –

+0

क्षमा करें, मेरे पास एंड्रॉइड 5.0 स्थापित के साथ कोई एंड्रॉइड डिवाइस नहीं है, क्या मैं एमुलेटर में स्क्रीन रिकॉर्ड का परीक्षण कर सकता हूं? धन्यवाद! – HelloCW

उत्तर

1

मेरे अनुभव से, Android emulators सतहों से पढ़ने (जो केवल एक चीज वास्तव में रिकॉर्डिंग के लिए आवश्यक है) की अनुमति है, लेकिन असफल फ्रेमवर्क जावा कोड में बग/सीमाओं के कारण वीडियो एन्कोड करने के लिए (और कभी-कभी स्क्रीनशॉट लेते हैं)।

  • एमुलेटर EGL_ANDROID_recordable विस्तार है, जो MediaRecorder/MediaCodec की मांग कर रहा है के लिए समर्थन की घोषणा नहीं हो सकता है: वहाँ दो प्राथमिक कारण हैं। आप निम्न कमांड को क्रियान्वित विस्तार समर्थन के लिए जाँच कर सकते हैं:

    adb shell dumpsys SurfaceFlinger | grep EGL_ANDROID_recordable 
    
  • केवल रंग प्रारूप, एंड्रॉयड 6 निर्मित सॉफ्टवेयर एनकोडर द्वारा समर्थित है, YUV है। एमुलेटर जीपीयू से आने वाले वीडियो बफर, अलग प्रारूप होने की संभावना है।

नोट, ऊपर सीमाएं एम्यूलेटर के लिए विशिष्ट नहीं हैं और वास्तविक उपकरणों पर असफलताओं का कारण बन सकती हैं। आप this answer में दृष्टिकोण रूपरेखा का उपयोग करके सॉफ़्टवेयर (सीपीयू या जीएलएस के माध्यम से) में प्रारूप रूपांतरण करके उनके आसपास काम कर सकते हैं, लेकिन सॉफ़्टवेयर एन्कोडर का प्रदर्शन किसी भी तरह से कमजोर होने जा रहा है।

संबंधित मुद्दे