MediaRecorde实现录像自动录像功能

原创 2016年08月30日 13:25:00

//实现了自动录像,但仍有部分需要更改

代码如下:

在AndroidManifest.xml添加下面的权限:

[html] view plain copy
  1. <uses-permission android:name="android.permission.CAMERA" />  
  2. <uses-permission android:name="android.permission.RECORD_AUDIO" />  
  3. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
  4. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  6. <!-- 硬件支持 -->  
  7. <uses-feature android:name="android.hardware.camera"/>  
  8. <uses-feature android:name="android.hardware.camera.autofocus"/>  
activity_main.xml
[html] view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <SurfaceView  
  7.         android:id="@+id/camera_preview"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent" />  
  10.   
  11.     <LinearLayout  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"  
  14.         android:layout_alignParentTop="true"  
  15.         android:layout_centerHorizontal="true"  
  16.         android:orientation="horizontal">  
  17.   
  18.         <TextView  
  19.             android:id="@+id/timestamp_minute_prefix"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"  
  22.             android:textColor="#7F00FF"  
  23.             android:textSize="30sp"  
  24.             android:text="0"/>  
  25.   
  26.         <TextView  
  27.             android:id="@+id/timestamp_minute_text"  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="wrap_content"  
  30.             android:textColor="#7F00FF"  
  31.             android:textSize="30sp"  
  32.             android:text="0"/>  
  33.   
  34.         <TextView  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content"  
  37.             android:textColor="#7F00FF"  
  38.             android:textSize="30sp"  
  39.             android:text=":"/>  
  40.   
  41.         <TextView  
  42.             android:id="@+id/timestamp_second_prefix"  
  43.             android:layout_width="wrap_content"  
  44.             android:layout_height="wrap_content"  
  45.             android:textColor="#7F00FF"  
  46.             android:textSize="30sp"  
  47.             android:text="0"/>  
  48.   
  49.         <TextView  
  50.             android:id="@+id/timestamp_second_text"  
  51.             android:layout_width="wrap_content"  
  52.             android:layout_height="wrap_content"  
  53.             android:textColor="#7F00FF"  
  54.             android:textSize="30sp"  
  55.             android:text="0"/>  
  56.     </LinearLayout>  
  57.   
  58.     <ImageButton  
  59.         android:id="@+id/record_shutter"  
  60.         android:layout_width="64dp"  
  61.         android:layout_height="64dp"  
  62.         android:layout_alignParentBottom="true"  
  63.         android:layout_centerHorizontal="true"  
  64.         android:layout_marginBottom="15dp"  
  65.         android:background="@android:color/transparent"  
  66.         android:scaleType="centerCrop"  
  67.         android:src="@drawable/recording_shutter" />  
  68.   

  1. </RelativeLayout>  


package com.example.mediacamera;
//实现了定时拍摄视频
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


import java.io.File;  


import android.app.Activity;  
import android.hardware.Camera;  
import android.hardware.Camera.Parameters;  
import android.hardware.Camera.Size;  
import android.media.MediaRecorder;  
import android.os.Bundle;  
import android.os.Environment;  
import android.os.Handler;  
import android.util.DisplayMetrics;
import android.util.Log;  
import android.view.Display;
import android.view.SurfaceHolder;  
import android.view.SurfaceView;  
import android.view.View;  
import android.view.WindowManager;
import android.view.View.OnClickListener;  
import android.widget.ImageButton;  
import android.widget.TextView;  
  
import org.w3c.dom.Text;  
  
public class MainActivity extends Activity implements OnClickListener {  
    private SurfaceView mCameraPreview;  
    private SurfaceHolder mSurfaceHolder;  
    private ImageButton mShutter;  
    private TextView mMinutePrefix;  
    private TextView mMinuteText;  
    private TextView mSecondPrefix;  
    private TextView mSecondText;  
  
    private Camera mCamera;  
    private MediaRecorder mRecorder;  
  
    private final static int CAMERA_ID = 0;  
  
    private boolean mIsRecording = false;  
    private boolean mIsSufaceCreated = false;  
  
    private static final String TAG = "Jackie";  
  
    private Handler mHandler = new Handler();  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        mCameraPreview = (SurfaceView) findViewById(R.id.camera_preview);  
        mMinutePrefix = (TextView) findViewById(R.id.timestamp_minute_prefix);  
        mMinuteText = (TextView) findViewById(R.id.timestamp_minute_text);  
        mSecondPrefix = (TextView) findViewById(R.id.timestamp_second_prefix);  
        mSecondText = (TextView) findViewById(R.id.timestamp_second_text);  
  
        mSurfaceHolder = mCameraPreview.getHolder();  
        mSurfaceHolder.addCallback(mSurfaceCallback);  
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  
        mShutter = (ImageButton) findViewById(R.id.record_shutter);  
        mShutter.setOnClickListener(this);  
        
        
        


       
        




        //开始录像后,每隔1s去更新录像的时间戳  
        mHandler.postDelayed(mTimestampRunnable, 5000);  
    }  
  
    @Override  
    protected void onPause() {  
        super.onPause();  
        if (mIsRecording) {  
            stopRecording();  
        }  
        stopPreview();  
    }  
  
    private  SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() {  
  
        @Override  
        public void surfaceDestroyed(SurfaceHolder holder) {  
            mIsSufaceCreated = false;  
        }  
  
        @Override  
        public void surfaceCreated(SurfaceHolder holder) {  
            mIsSufaceCreated = true;  
        }  
  
        @Override  
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
            startPreview();  
        }  
    };  
  
    //启动预览  
    private void startPreview() {  
        //保证只有一个Camera对象  
        if (mCamera != null || !mIsSufaceCreated) {  
            Log.d(TAG, "startPreview will return");  
            return;  
        }  
  
        mCamera = Camera.open(CAMERA_ID);  
  
        Parameters parameters = mCamera.getParameters();  
       
    // 获取窗口管理器
WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
// 获取屏幕的宽和高
display.getMetrics(metrics);
int screenWidth1 = metrics.widthPixels;
int screenHeight1 = metrics.heightPixels; 
        
        
        
        
        
        Size size = getBestPreviewSize(screenWidth1, screenHeight1, parameters);  
        if (size != null) {  
            parameters.setPreviewSize(size.width, size.height);  
        }  
  
        parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);  
        parameters.setPreviewFrameRate(20);  
  
        //设置相机预览方向  
        mCamera.setDisplayOrientation(90);  
  
        mCamera.setParameters(parameters);  
  
        try {  
            mCamera.setPreviewDisplay(mSurfaceHolder);  
//          mCamera.setPreviewCallback(mPreviewCallback);  
        } catch (Exception e) {  
            Log.d(TAG, e.getMessage());  
        }  
  
        mCamera.startPreview();  
    }  
  
    private void stopPreview() {  
        //释放Camera对象  
        if (mCamera != null) {  
            try {  
                mCamera.setPreviewDisplay(null);  
            } catch (Exception e) {  
                Log.e(TAG, e.getMessage());  
            }  
  
            mCamera.stopPreview();  
            mCamera.release();  
            mCamera = null;  
        }  
    }  
  
    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {  
        Camera.Size result = null;  
  
        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {  
            if (size.width <= width && size.height <= height) {  
                if (result == null) {  
                    result = size;  
                } else {  
                    int resultArea = result.width * result.height;  
                    int newArea = size.width * size.height;  
  
                    if (newArea > resultArea) {  
                        result = size;  
                    }  
                }  
            }  
        }  
  
        return result;  
    }  
  
    @Override  
    public void onClick(View v) {  
        initMediaRecorder();  
        startRecording();  
   
/*        if (mIsRecording) {  
            stopRecording();  
        } else {  
            initMediaRecorder();  
            startRecording();  
  
            //开始录像后,每隔1s去更新录像的时间戳  
            mHandler.postDelayed(mTimestampRunnable, 1000);  
        }  */
    }  
  
    private void initMediaRecorder() {  
        mRecorder = new MediaRecorder();//实例化  
        mCamera.unlock();  
        //给Recorder设置Camera对象,保证录像跟预览的方向保持一致  
        mRecorder.setCamera(mCamera);  
        mRecorder.setOrientationHint(90);  //改变保存后的视频文件播放时是否横屏(不加这句,视频文件播放的时候角度是反的)  
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置从麦克风采集声音  
        mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置从摄像头采集图像  
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);  // 设置视频的输出格式 为MP4  
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 设置音频的编码格式  
        mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 设置视频的编码格式  
        mRecorder.setVideoSize(176, 144);  // 设置视频大小  
        mRecorder.setVideoFrameRate(20); // 设置帧率  
//        mRecorder.setMaxDuration(10000); //设置最大录像时间为10s  
        mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());  
  
        //设置视频存储路径  
        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + File.separator + "VideoRecorder");  
        if (!file.exists()) {  
            //多级文件夹的创建  
            file.mkdirs();  
        }  
        mRecorder.setOutputFile(file.getPath() + File.separator + "VID_" + System.currentTimeMillis() + ".mp4");  
    }  
  
    private void startRecording() {  
        if (mRecorder != null) {  
            try {  
                mRecorder.prepare();  
                mRecorder.start();  
            } catch (Exception e) {  
                mIsRecording = false;  
                Log.e(TAG, e.getMessage());  
            }  
        }  
  
        mShutter.setImageDrawable(getResources().getDrawable(R.drawable.recording_shutter_hl));  
        mIsRecording = true;  
    }  
  
    private void stopRecording() {  
        if (mCamera != null) {  
            mCamera.lock();  
        }  
  
        if (mRecorder != null) {  
            mRecorder.stop();  
            mRecorder.release();  
            mRecorder = null;  
        }  
  
        mShutter.setImageDrawable(getResources().getDrawable(R.drawable.recording_shutter));  
        mIsRecording = false;  
  
       // mHandler.removeCallbacks(mTimestampRunnable);  
  
        //将录像时间还原  
        mMinutePrefix.setVisibility(View.VISIBLE);  
        mMinuteText.setText("0");  
        mSecondPrefix.setVisibility(View.VISIBLE);  
        mSecondText.setText("0");  
  
        //重启预览  
        startPreview();  
    }  
  
    private Runnable mTimestampRunnable = new Runnable() {  
        @Override  
        public void run() {  
        //stopRecording();  
            startPreview();   
            // mIsSufaceCreated = true;  
             initMediaRecorder();  
             startRecording();  
/*            updateTimestamp();  
            mHandler.postDelayed(this, 1000);  */
        }  
    };  
  
    private void updateTimestamp() {  
        int second = Integer.parseInt(mSecondText.getText().toString());  
        int minute = Integer.parseInt(mMinuteText.getText().toString());  
        second++;  
        Log.d(TAG, "second: " + second);  
  
        if (second < 10) {  
            mSecondText.setText(String.valueOf(second));  
        } else if (second >= 10 && second < 60) {  
            mSecondPrefix.setVisibility(View.GONE);  
            mSecondText.setText(String.valueOf(second));  
        } else if (second >= 60) {  
            mSecondPrefix.setVisibility(View.VISIBLE);  
            mSecondText.setText("0");  
  
            minute++;  
            mMinuteText.setText(String.valueOf(minute));  
        } else if (minute >= 60) {  
            mMinutePrefix.setVisibility(View.GONE);  
        }  
    }  




相关文章推荐

EasyPusher实现安卓Android手机直播推送同步录像功能(源码解析)

EasyPusher是一款非常棒的推送客户端。稳定、高效、低延迟,音视频同步等都特别好。装在安卓上可作为一款单兵设备来用。说到单兵,在项目中通常都需要边传边录的功能,因此后来EasyPusher也加入...
  • jyt0551
  • jyt0551
  • 2017年02月28日 23:23
  • 702

Android音视频处理之MediaMuxer(MP4)

http://www.jianshu.com/p/aeadf260258a 在Android中,可以使用MediaMuxer来封装编码后的视频流和音频流到mp4容器中: ...
  • STN_LCD
  • STN_LCD
  • 2017年05月22日 13:56
  • 1019

[置顶] 更改VLC源码 实现使用libVLC录像功能

VLC的强大功能我就不赘述了,相信看到这篇文章的朋友都已经有所了解了,如果还不太清楚,可以访问http://www.videolan.org/vlc/features.html.         首先...

vlc-android截屏以及录像功能的实现

这里讲的是vlc-android截屏以及录像功能的实现,如果单纯想编译vlc-android的源码请移步至:http://blog.csdn.net/a358763471/article/detail...

实现使用libVLC录像功能

分类:            vlc2012-03-14 21:36235人阅读评论(0)收藏举报 VLC的强大功能我就不赘述了,相信看到这篇文章的朋友都已经有所了解了,如果还不太清楚,可以...

[转]EasyPusher实现安卓Android手机直播推送同步录像功能(源码解析)

EasyPusher是一款非常棒的推送客户端。稳定、高效、低延迟,音视频同步等都特别好。装在安卓上可作为一款单兵设备来用。说到单兵,在项目中通常都需要边传边录的功能,因此后来EasyPusher也加入...

Android调用MideaRecord实现简单录像功能

MideaRecord

EasyPlayerPro基于FFMPEG实现播放同时进行录像的功能

之前有博客专门介绍了EasyPlayer的本地录像的功能,简单来说,EasyPlayer是一款RTSP播放器,它将RTSP流里的音视频媒体帧解析出来,并用安卓系统提供的MediaMuxer类进行录像....
  • jyt0551
  • jyt0551
  • 2017年07月09日 15:56
  • 427

Android学习笔记——简单实现照相、录音和录像功能

Android菜鸟第一次写原创博客,

vlc-android截屏以及录像功能的实现

这里讲的是vlc-android截屏以及录像功能的实现,如果单纯想编译vlc-android的源码请移步至:http://blog.csdn.net/a358763471/article/detail...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MediaRecorde实现录像自动录像功能
举报原因:
原因补充:

(最多只允许输入30个字)