天天看點

android實作視訊錄制

一,自定義錄制

1.首先使用到的類

         MediaRecorder 這是實作視訊錄制的類,同時也可以實作音頻錄制

        SurfaceView  ,SurfaceView是視圖(View)的繼承類,這個視圖裡内嵌了一個專門用于繪制的Surface。你可以控制這個Surface的格式和尺寸。Surfaceview控制這個Surface的繪制位置。這個控件用于顯示錄制視訊的控件,相當于錄制的時候的預覽

       SurfaceHolder   surface的控制器,用來操縱surface,處理它的Canvas上畫的效果和動畫,控制表面,大小,像素等。

2. 開始錄制

      1.首先在布局檔案中  添加SurfaceView 控件 再添加一個開始按鈕,一個結束按鈕

<SurfaceView
                                   android:id="@+id/surfaceview"
                                  android:layout_width="match_parent"
                                  android:layout_height="match_parent">
                      </SurfaceView>
           

       2. 查找到SurfaceView 控件 擷取 SurfaceHolder

SurfaceHolder holder = surfaceview.getHolder();// 取得holder
                        holder.addCallback(this); // holder加入回調接口    給SurfaceView目前的持有者一個回調對象。 需要實作其方法,匿名内部類也可以
                        // setType必須設定,要不出錯.
                        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
           

                               //注釋-----解釋----

                       SURFACE_TYPE_NORMAL:用RAM緩存原生資料的普通Surface

                       SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬體加速的Surface

                       SURFACE_TYPE_GPU:适用于GPU加速的Surface

                       SURFACE_TYPE_PUSH_BUFFERS:表明該Surface不包含原生資料,Surface用到的資料由其他對象提供,在Camera圖像預覽中就使用該類型的Surface,有                       Camera 負責提供給預覽Surface資料,這樣圖像預覽會比較流暢。如果設定這種類型則就不能調用lockCanvas來擷取Canvas對象了。

                       雖然setType()方法已經被聲明deprecated,但是必要的時候還是設定下比較好。

       3.給開始按鈕添加監聽事件

mediarecorder = new MediaRecorder();// 建立mediarecorder對象
        mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 錄音源為麥克風
        mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 設定錄制視訊源為Camera(相機)
        mediarecorder .setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 設定錄制完成後視訊的封裝格式THREE_GPP為3gp.MPEG_4為mp4
       mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);  // 設定錄制的視訊編碼h263 h264
        mediarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // 設定視訊錄制的分辨率。必須放在設定編碼和格式的後面,否則報錯
        mediarecorder.setVideoSize(176, 144);     // 設定錄制的視訊幀率。必須放在設定編碼和格式的後面,否則報錯
        mediarecorder.setVideoFrameRate(20);//設定逐幀率
        mediarecorder.setPreviewDisplay(surfaceHolder.getSurface()); // 将視訊 設定預覽 的surface
        mediarecorder   .setAudioEncodingBitRate(   256 * 1024   );// 128K 
        File folder = FileUtils.getMediaRecorderFolder(this);      // 4. 設定錄音要儲存的位置  自定義的檔案儲存類 用于存儲檔案
        File targetFile = new File(folder, "vedio" + System.currentTimeMillis() + ".3gp");
        mediarecorder.setOutputFile(targetFile.getAbsolutePath());
        try {
                 mediarecorder.prepare();// 準備錄制
                  mediarecorder.start();// 開始錄制
        } catch (IllegalStateException e) {
            e.printStackTrace(); // TODO Auto-generated catch block
        } catch (IOException e) {
            e.printStackTrace(); // TODO Auto-generated catch block
        }
           

       3. 實作其回調接口

@Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 将holder,這個holder為開始在oncreat裡面取得的holder,将它賦給surfaceHolder
        surfaceHolder = holder;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // 将holder,這個holder為開始在oncreat裡面取得的holder,将它賦給surfaceHolder
        surfaceHolder = holder;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // surfaceDestroyed的時候同時對象設定為null
        surfaceview = null;
        surfaceHolder = null;
        mediarecorder = null;
    }
           

       3. 停止按鈕的事件

if (mediarecorder != null) {
            // 停止錄制
            mediarecorder.stop();
            // 釋放資源
            mediarecorder.release();
            mediarecorder = null;
        }
           

二,使用意圖錄制

Intent i = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
        File folder = FileUtils.getMediaRecorderFolder(this);
        File targetFile = new File(folder, "a	" + System.currentTimeMillis() + ".3gp");
        Uri imageFileUri = Uri.fromFile(targetFile);
        i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
        i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(i, 102);