【问题标题】:How to capture a video in android?如何在android中捕获视频?
【发布时间】:2013-04-05 10:53:34
【问题描述】:

我正在尝试在 android 中捕获视频,但我无法捕获它。虽然我的代码正在创建 3gp 文件,但我无法播放它。我的编码有问题吗?

MediaRecorder videoRecorder;
sFilePath = sSDPath + "/" + System.currentTimeMillis() + ".3gp";
String sSDPath = Environment.getExternalStorageDirectory().getPath();
String sFilePath="";

if (videoRecorder == null) {
   videoRecorder = new MediaRecorder();
}

videoRecorder.setVideoSource(
MediaRecorder.VideoSource.CAMERA);
videoRecorder.setOutputFormat(
MediaRecorder.OutputFormat.THREE_GPP);
videoRecorder.setVideoSize(640, 480);
videoRecorder.setVideoFrameRate(30);
videoRecorder.setVideoEncoder(
MediaRecorder.VideoEncoder.H264);
videoRecorder.setOutputFile(sFilePath);
try {
 videoRecorder.prepare();
} catch (IllegalStateException e) {
  e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}
videoRecorder.start();

【问题讨论】:

  • 你是在安卓媒体播放器上播放吗?
  • 3gp 应该可以工作。你试过 mp4 吗?

标签: android android-mediaplayer video-capture


【解决方案1】:

您可以找到名为 SpyDroid 的开源项目,或查看sipdroid。很好的例子。

【讨论】:

    【解决方案2】:

    您是否使用自定义记录器..?如果没有,则写在下面两行以捕获视频..

    Intent record_videoIntent=new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
        startActivityForResult(record_videoIntent, 1);  
    

    然后在您的活动中覆盖 onActivityResult 并获得类似...的结果

    Uri videoUri=data.getData();

    【讨论】:

      【解决方案3】:

      创建扩展SurfaceViewRecorderPreview类并实现 SurfaceHolder.Callback接口。

      class RecorderPreview extends SurfaceView implements SurfaceHolder.Callback
      {
        //Create objects for MediaRecorder and SurfaceHolder.
        MediaRecorder recorder;
        SurfaceHolder holder;
      
        //Create constructor of Preview Class. In this, get an object of
        //surfaceHolder class by calling getHolder() method. After that add
        //callback to the surfaceHolder. The callback will inform when surface is
        //created/changed/destroyed. Also set surface not to have its own buffers.
      
        public Preview(Contect context,MediaRecorder temprecorder) {
       super(context);
            recorder=temprecorder;
       holder=getHolder();
       holder.addCallback(this);
       holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
         }
      
        // Implement the methods of SurfaceHolder.Callback interface
      
        // SurfaceCreated : This method gets called when surface is created.
        // In this, initialize all parameters of MediaRecorder object as explained
        // above.
      
        public void surfaceCreated(SurfaceHolder holder){
        try{
              recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
          recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
          recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
              recorder.setOutputFile("/sdcard/recordvideooutput.3gpp");
              recorder.setPreviewDisplay(mHolder.getSurface());
          recorder.prepare();
          } catch (Exception e) {
              String message = e.getMessage()
        }
        }
      

      要允许录制视频,请将权限添加到应用程序的清单文件中。

            <uses-permission android:name="android.permission.RECORD_VIDEO"/>
      
      
      public void surfaceDestroyed(SurfaceHolder holder)
      {
      if(recorder!=null)
      {
      recorder.release();
      recorder = null;
      }
      }
      
      //surfaceChanged : This method is called after the surface is created.
          public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
          {
      }
      }
      

      实现视频录制应用的onCreate方法。

      //Create objects of MediaRecorder and Preview class
      private MediaRecorder recorder;
      private Preview preview;
          // In this method, create an object of MediaRecorder class. Create an object of
          // RecorderPreview class(Customized View). Add RecorderPreview class object
          // as content of UI.
      
      public void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          recorder = new MediaRecorder();
          preview = new RecorderPreview(this,recorder);
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
          setContentView(preview);
      }
      
      //Create option menu which can be used for starting and stopping video recording.
      // Also implement the onOptionsItemSelected to handle the events for option menu.
      
      public boolean onCreateOptionsMenu(Menu menu)
      {
          menu.add(0, 0, 0, "StartRecording");
          menu.add(0, 1, 0, "StopRecording");
          return super.onCreateOptionsMenu(menu);
      }
      
      public boolean onOptionsItemSelected(MenuItem item)
      {
          switch (item.getItemId())
          {
              case 0:
                  recorder.start();
                  break;
              case 1:
             recorder.stop();
             break;
          }
          return super.onOptionsItemSelected(item);
      }
      

      你可以在这里找到原始代码:

      http://www.codeproject.com/Articles/107270/Recording-and-Playing-Video-on-Android

      【讨论】:

        猜你喜欢
        • 2010-11-05
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2018-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多