簡體   English   中英

准備失敗:Android中的-1媒體記錄器

[英]prepare failed: -1 media recorder in android

當我嘗試從似乎有錯誤的攝像機錄制視頻時,准備失敗:-1。

我搜尋了很多東西,但從任何地方都找不到任何可接受的答案。 這是我的下面的代碼。

我不知道參數嗎? 並解鎖相機。 任何人都將不勝感激。

package com.camara.activity;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CamcorderView extends SurfaceView implements
        SurfaceHolder.Callback {

    MediaRecorder recorder;
    SurfaceHolder holder;
    String outputFile = "/sdcard/default.mp4";

    public CamcorderView(Context context, AttributeSet attrs) {
        super(context, attrs);

        holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        recorder.setVideoSize(480, 320);
        recorder.setVideoFrameRate(10);
        recorder.setMaxDuration(10000);

    }

    public void surfaceCreated(SurfaceHolder holder) {

        recorder.setOutputFile(outputFile);
        recorder.setPreviewDisplay(holder.getSurface());
        if (recorder != null) {
            try {
                recorder.prepare();

            } catch (IllegalStateException e) {
                Log.e("IllegalStateException", e.toString());
            } catch (IOException e) {
                Log.e("IOException", e.toString());
            }
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    public void setOutputFile(String filename) {
        outputFile = filename;
        recorder.setOutputFile(filename);
    }

    public void startRecording() {
        recorder.start();
    }

    public void stopRecording() {
        recorder.stop();
        recorder.release();



    }

}

以下是logcat的輸出

01-10 17:33:00.450: I/MediaRecorderJNI(14046): prepare: surface=0x243398 (id=1)
01-10 17:33:00.500: E/MediaRecorder(14046): prepare failed: -1
01-10 17:33:00.500: E/IOException(14046): java.io.IOException: prepare failed.

提前致謝。

好吧,我實際上發現了我的錯誤。 因為當然有一個錯誤。 實際上,我想同時進行預覽和錄制,並認為必須為此使用Camera對象。 但是實際上MediaRecorder本身是通過SetDisplayPreview和.... MediaRecord.Prepare :)來完成的

我心情很好,所以全班都來了;)

import java.io.File;
import java.io.IOException;

import android.content.Context;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnInfoListener;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.FrameLayout;

public class ModuleVideo implements SurfaceHolder.Callback, OnInfoListener 
{   
    public static final int STATE_NONE      = -1;
    public static final int STATE_STOPPED   = 0;
    public static final int STATE_PREVIEW   = 1;
    public static final int STATE_CAPTURE   = 2;
    public static final int STATE_RECORDING = 3;

    private SurfaceHolder   mHolder;
    private MediaRecorder   mRecorder;
    private SurfaceView     mCameraView;
    private Context         mContext;
    private FrameLayout     mParent;
    private int             mState;
    private boolean         mRecording;


    public ModuleVideo(Context context, FrameLayout parent)
    {
        //Initiate the Surface Holder properly

        mParent     = parent;
        mContext    = context; 
        mRecorder   = null;
        mState      = STATE_NONE;
        mRecording  = false;
    }


    private void Init()
    {
        mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        mRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        CamcorderProfile camcorderProfile_HQ = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
        mRecorder.setProfile(camcorderProfile_HQ);
        mRecorder.setOutputFile("/sdcard/MY_VIDEO.mp4");
    }

    private void Prepare()
    {
        try
        {
            mRecorder.setPreviewDisplay(mHolder.getSurface());
            mRecorder.prepare();
        }
        catch (IllegalStateException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }


    public void UI_StartPreview()
    {
        if(mState == STATE_STOPPED || mState == STATE_NONE)
        {
            mRecorder= new MediaRecorder();

            Init();

            mCameraView= new SurfaceView(mContext);
            mParent.addView(mCameraView);

            this.mHolder = mCameraView.getHolder();
            this.mHolder.addCallback(this);
            this.mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }
    }


    public void UI_StopPreview()
    {
        if(mState == STATE_PREVIEW)
        {
            if(mRecording)
            {
                UI_StopRecord();
            }

            if(mRecorder != null)
            {
                mRecorder.release();
                mRecorder= null;
            }

            mParent.removeView(mCameraView);
            //mCameraView= null;
        }
    }

    public boolean UI_StartRecord()
    {
        if(mState != STATE_PREVIEW )
        {
            return false;
        }

        String path= "/sdcard/PLUS_VIDEO.mp4";

        String state = android.os.Environment.getExternalStorageState();

        if(!state.equals(Environment.MEDIA_MOUNTED))
        {
                return false;
        }
        File directory = new File(path).getParentFile();
        if(!directory.exists() && !directory.mkdirs())
        {
                return false;
        }

        mRecorder.start();
        mRecording= true;

        mState= STATE_RECORDING;

        return true;
    }


    public void UI_StopRecord()
    {
        if(mRecorder != null)
        {
            mRecorder.stop();
            mRecorder.reset();

            Init();
            Prepare();

            mRecording= false;

            mState= STATE_PREVIEW;
        }
    }

    public boolean UI_IsRecording()
    {
        return mRecording;
    }



    @Override 
    public void onInfo(MediaRecorder mr, int what, int extra)
    { 
        // TODO Auto-generated method stub 
         Log.i(null, "onInfo"); 
    } 


    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {   
        Prepare();
    }


    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    {
        mState= STATE_PREVIEW;
    }


    @Override
    public void surfaceDestroyed(SurfaceHolder holder) 
    {

        mState= STATE_STOPPED;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM