如何在Android中捕获视频?

时间:2013-04-05 10:53:35

标签: android android-mediaplayer video-capture

我正在尝试在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();

3 个答案:

答案 0 :(得分:0)

你要找到名为SpyDroid的开源项目,或者检查sipdroid。它的好例子。

答案 1 :(得分:0)

你使用自定义录音机吗?如果没有,那么写下面两行来捕捉视频..

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

然后覆盖您活动中的onActivityResult并获得结果,如...

Uri videoUri = data.getData();

答案 2 :(得分:-1)

创建 RecorderPreview 类,该类扩展 SurfaceView 实施 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