【问题标题】:Video recording in Android only record video just ONCEAndroid中的视频录制只录制一次视频
【发布时间】:2012-07-02 13:08:40
【问题描述】:

我找到了这个可以捕获视频的工作代码并进行了一些修改。是的,代码运行良好,但它只允许用户录制一次视频。当用户在我点击“开始录制”的那一刻点击菜单中的“停止录制”时,它将不再录制视频。

我想要发生的是,当我点击“停止录制”时,它会再次准备相机,然后当我点击“开始录制”时,它会录制一个新视频。

如何解决这个问题?

顺便说一下主要代码:

package com.tcs.video; 
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;

public class VideoRecorder extends Activity{

private MediaRecorder recorder;
private Preview mPreview;

boolean flag=false; 
boolean startedRecording=false;


public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    recorder = new MediaRecorder();
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mPreview = new Preview(VideoRecorder.this,recorder);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(mPreview);

}


@Override
public boolean onPrepareOptionsMenu(Menu menu) 
{
    super.onPrepareOptionsMenu(menu);
    menu.clear(); 
    menu.add(0, 0, 0, "Start Recording"); 
    menu.add(1, 1, 0, "Stop Recording");

    menu.setGroupVisible(0, false);
    menu.setGroupVisible(1, false);

    if(startedRecording==false){
        menu.setGroupVisible(0, true);
        menu.setGroupVisible(1, false);
    }else if(startedRecording==true){
        menu.setGroupVisible(1, true);
        menu.setGroupVisible(0, false);
    }

    return true;
}


 /*!
    <p>
    This method receives control when Item in menu option is selected. It contains implementations
    to be performed on selection of menu item. 
    </p>*/

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    switch (item.getItemId()) 
    {
    case 0:
        //start the recorder
        recorder.start();
        startedRecording=true;
        break;

    case 1: 
        //stop the recorder
        recorder.stop();
        recorder.release();
        recorder = null;
        startedRecording=false;
        break;


    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

class Preview extends SurfaceView implements SurfaceHolder.Callback
{
    //Create objects for MediaRecorder and SurfaceHolder.
    SurfaceHolder mHolder;
    MediaRecorder tempRecorder;

    //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(Context context,MediaRecorder recorder) {
        super(context);
        tempRecorder=recorder;
        mHolder=getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        // TODO Auto-generated constructor stub
    }

    public Surface getSurface()
    {
        return mHolder.getSurface();
    }

    // Implement the methods of SurfaceHolder.Callback interface

    // SurfaceCreated : This method gets called when surface is created.
    // In this, initialize all parameters of MediaRecorder object.
    //The output file will be stored in SD Card.

    public void surfaceCreated(SurfaceHolder holder){
        tempRecorder.setOutputFile("/sdcard/recordvideooutput.3gpp");
        tempRecorder.setPreviewDisplay(mHolder.getSurface());
        try{
            tempRecorder.prepare();
        } catch (Exception e) {
            String message = e.getMessage();
            tempRecorder.release();
            tempRecorder = null;
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) 
    {
        if(tempRecorder!=null)
        {
            tempRecorder.release();
            tempRecorder = null;
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
    {

    }
    }   
}

请帮忙!

谢谢

杰森

【问题讨论】:

    标签: android


    【解决方案1】:

    当您按下停止按钮时,它会释放记录器并将其分配给 null。除非有什么我没有在这里看到,否则没有什么可以再次为另一次录音做准备。

    尝试使用recorder.reset() 代替release() 和= null。 official documentation中对生命周期有很好的解释。

    【讨论】:

    • 非常感谢...我会在家里试试这个。 :)
    • 您好 Geobits,我尝试了您的建议,但仍然无法正常工作。 :(
    • 请看Geobits上面的帖子
    • 你不能在stop()之后直接调用prepare()。您必须重置音频源和其他参数。请参阅链接文档中的状态图。它显示了您每次必须经历的步骤。
    • Hello Geobits,我实际上修改了我的代码,而不是再次准备相机,而是使用 Intent 再次调用该类。是的,它有效。但是每次我点击停止按钮时,屏幕都会创建一个新的 Intent。我想要的是当我单击停止按钮时,相机会像回到它的 prepare() 一样刷新。那可能吗?谢谢
    【解决方案2】:

    这个地理比特

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        switch (item.getItemId()) 
        {
        case 0:
           //start the recorder
           recorder.start();
           startedRecording=true;
           break;
    
        case 1: 
           //stop the recorder
           recorder.stop();
           recorder.prepare();
           startedRecording=false;
           break;
    
    
       default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2013-04-14
      相关资源
      最近更新 更多