`
iaiai
  • 浏览: 2205179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 中使用MediaRecorder进行录像详解(视频录制)

 
阅读更多
package com.iaiai.video.test;

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

import android.app.Activity;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.media.MediaRecorder.AudioEncoder;
import android.media.MediaRecorder.AudioSource;
import android.media.MediaRecorder.OnErrorListener;
import android.media.MediaRecorder.OutputFormat;
import android.media.MediaRecorder.VideoEncoder;
import android.media.MediaRecorder.VideoSource;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

/**  
 * qq 176291935
 * @author iaiai
 * @version 
 */
public class MainActivity extends Activity {

	private SurfaceView surfaceView;
	private SurfaceHolder mSurfaceHolder;

	private MediaRecorder mMediaRecorder;

	private int mWidth = 320;// 视频分辨率宽度
	private int mHeight = 240;// 视频分辨率高度
	
	private Camera mCamera;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		surfaceView = (SurfaceView) findViewById(R.id.sView);
		mSurfaceHolder = surfaceView.getHolder();// 取得holder
		mSurfaceHolder.addCallback(new Callback() {
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				closeVideo();
				freeCameraResource();
			}

			@Override
			public void surfaceCreated(SurfaceHolder holder) {
				mSurfaceHolder = holder;
				
				try {
					initCamera();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			@Override
			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {
				mSurfaceHolder = holder;
			}
		});
		
		mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}
	
	/**
     * 初始化摄像头
     *
     * @author liuyinjun
     * @date 2015-2-5
     * @throws IOException
     */
    private void initCamera() throws IOException {
        if (mCamera != null) {
            freeCameraResource();
        }
        try {
            mCamera = Camera.open();
        } catch (Exception e) {
            e.printStackTrace();
            freeCameraResource();
        }
        if (mCamera == null)
            return;

        // setCameraParams();
        mCamera.setDisplayOrientation(90);
        mCamera.setPreviewDisplay(mSurfaceHolder);
        mCamera.startPreview();
        mCamera.unlock();
        
        initRecord();
    }

	/**
	 * 初始化
	 * 
	 * @author liuyinjun
	 * @date 2015-2-5
	 * @throws IOException
	 */
	private void initRecord() throws IOException {
		mMediaRecorder = new MediaRecorder();
		mMediaRecorder.reset();
		if (mCamera != null)
            mMediaRecorder.setCamera(mCamera);
		mMediaRecorder.setOnErrorListener(new OnErrorListener() {
			@Override
			public void onError(MediaRecorder mr, int what, int extra) {
				try {
					if (mr != null)
						mr.reset();
				} catch (IllegalStateException e) {
					e.printStackTrace();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
		mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 视频源
		mMediaRecorder.setAudioSource(AudioSource.MIC);// 音频源
		mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
		mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音频格式

		// CamcorderProfile profile =
		// CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
		// Log.i("********",profile.videoFrameWidth+"********"+profile.videoFrameHeight);

		mMediaRecorder.setVideoSize(mWidth, mHeight);// 设置分辨率:
		mMediaRecorder.setVideoFrameRate(5);// 每秒5帧
		mMediaRecorder.setVideoEncodingBitRate(1 * 1280 * 720);// 设置帧频率,然后就清晰了
		mMediaRecorder.setOrientationHint(90);// 输出旋转90度,保持竖屏录制
		mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 视频录制格式
		// mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
		mMediaRecorder.setOutputFile(getFile());
		mMediaRecorder.prepare();
		try {
			mMediaRecorder.start();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private String getFile() {
		try {
			File viodFile = new File(Environment.getExternalStorageDirectory()
					.getCanonicalFile() + "/dc/myvideo.mp4");
			if (!viodFile.exists())
				viodFile.createNewFile();

			return viodFile.getAbsolutePath();
		} catch (IOException e1) {
			e1.printStackTrace();

			return null;
		}
	}
	
	/**
     * 释放摄像头资源
     *
     * @author liuyinjun
     * @date 2015-2-5
     */
    private void freeCameraResource() {
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();
            mCamera.lock();
            mCamera.release();
            mCamera = null;
        }
    }

	@Override
	protected void onDestroy() {
		super.onDestroy();

		closeVideo();
		freeCameraResource();
	}
	
	private void closeVideo(){
		if (mMediaRecorder != null) {  
            // 停止录制  
			mMediaRecorder.stop();  
            // 释放资源  
			mMediaRecorder.release();  
			mMediaRecorder = null;  
        }
		
		surfaceView = null;  
		mSurfaceHolder = null;  
		mMediaRecorder = null;
	}

}


xml没别的东西就放了一个SurfaceView
分享到:
评论

相关推荐

    Android中使用MediaRecorder进行录像详解

    文档中还提到了设置Activity的方向为横屏显示,这是因为在视频录制中通常需要固定屏幕方向,以保证录制的视频具有统一的观看方向。此外,还提到了设置全屏显示和半透明模式,这些都是为了提升用户体验。 总的来说,...

    Android VideoCamera MediaRecorder 解析PPT

    在Android平台上,MediaRecorder是用于录制音视频的关键组件。...总之,MediaRecorder是Android开发中进行音视频录制的核心工具,通过熟练掌握其使用方法和注意事项,可以创建出功能丰富的多媒体应用。

    MediaRecorder类介绍1

    `MediaRecorder`类是Android系统中用于音频和视频录制的核心组件之一。该类提供了一系列的功能接口来帮助开发者实现多媒体录制的应用场景。根据给定的部分内容,我们可以看到关于`MediaRecorder`类的一些基本介绍...

    《Android移动开发案例详解》源码

    4. **多媒体处理**:书中可能包括使用MediaRecorder和MediaPlayer类进行音频、视频录制和播放的代码,以及利用Camera API进行拍照和录像的实例。图像处理方面,可能有Bitmap操作、 Glide或Picasso库的使用,以及...

    VideoRecorderAndCompressor,安卓录像机/视频压缩程序.zip

    在这个项目中,开发者可以看到如何集成FFmpeg到Android应用中,并使用其API进行视频压缩,平衡视频质量和文件大小。 开源特性使得VideoRecorderAndCompressor极具学习价值。开发者可以通过阅读源代码,了解如何处理...

    android -testdemo

    4. **录像功能**:与拍照类似,录像功能也是通过MediaRecorder实现的,但涉及的是视频录制。开发者需要设置视频源、视频分辨率、帧率、编码格式等参数,然后启动和停止录制。VideoView或ExoPlayer可以帮助预览和播放...

    android-camera2video

    本文将深入探讨如何在Android 6.0上使用Camera2 API创建视频录制应用,基于提供的"android-camera2video"示例项目进行解析。 一、Camera2 API简介 Camera2 API是Android系统对原生Camera API的一次重大升级,旨在...

    Android高级应用源码-基于Android2.2照相机Demo,可以直接放到项目里使用.zip

    5. **拍照与录像**:在旧版API中,拍照通常通过调用`Camera.takePicture()`方法实现,而录制视频则涉及`MediaRecorder`类的使用。在Demo中,这两部分可能已经封装成了易于使用的接口。 6. **权限管理**:使用相机...

    CameraTest.rar (老外写的android摄像头模块,包含.apk文件和程序部分)

    "CameraTest.java" 是该示例的核心代码,它展示了如何在 Android 中使用 Camera API 进行编程。Android 提供了两种方式来访问摄像头:Camera API(旧版)和 Camera2 API(新版)。在这个案例中,由于没有明确指出...

    RecordDemo.zip

    《使用七牛SDK实现Android录像、拍照与视频加时间水印功能详解》 在移动开发领域,尤其是在Android平台上,我们经常需要实现录制视频、拍摄照片以及在视频中添加时间水印等功能。本项目"RecordDemo.zip"正是这样一...

    UVCCamera-common-V4.1.1.rar

    在移动设备开发中,摄像头功能的使用越来越广泛,尤其是在需要实时视频传输或者录像的场景下。UVCCamera是一个专门为Android系统设计的USB摄像头库,它允许开发者通过USB接口连接并控制外接的UVC(Universal Video ...

    TestForFloatingWindow-master.zip

    本文将深入探讨如何利用TestForFloatingWindow-master项目来理解和实现Android的浮动窗口功能,并结合“相机”与“后台录像”的标签,讨论如何在浮动窗口中集成相机功能并实现在后台录制视频。 首先,我们需要理解...

    android apidemos

    API Demos包含了音频、视频播放和录制的示例,展示了如何使用MediaPlayer和MediaRecorder类。此外,还有相机功能的使用,包括预览、拍照和录像。 五、网络通信 Android API Demos讲解了HttpURLConnection、OkHttp等...

    Android 自定义Camera

    5. 录像:使用MediaRecorder类,配置其音频和视频源、编码格式、输出文件等,然后开始录制。 三、自定义界面设计 1. SurfaceView:简单易用,适用于基本的预览需求,但无法进行复杂的图像处理。 2. TextureView:...

    UVCCAMERA_Master

    使用UVC摄像头进行拍照和录制视频,主要涉及`MediaRecorder`和`Camera2` API。`MediaRecorder`用于录制视频,而拍照则可以通过`Surface`对象直接捕获一帧图像。在UVC摄像头的场景中,可能需要额外处理UVC设备的流...

    Android-A-Programmers-Guide

    - **录音**:MediaRecorder类用于录制音频。 **11. 位置服务** - **GPS定位**:利用卫星信号确定地理位置。 - **网络定位**:通过Wi-Fi热点和移动基站来获取位置信息。 **12. 传感器应用** - **重力感应器**:...

    Android API全集

    - `MediaRecorder`:录制音频和视频。 - `Bitmap`:处理图像,包括加载、缩放、裁剪等操作。 - `ExoPlayer`:Google提供的更高级的媒体播放器库。 6. **硬件访问** - `Sensors`:访问加速度计、陀螺仪、磁力计...

    DashcamProject.rar

    2. 录像功能:利用MediaRecorder与Camera2 API结合,创建一个录制流,设置合适的编码格式(如H.264)和音频源,开始录制视频。 3. 图像处理:可能包含了一些后处理步骤,如添加时间戳、GPS信息到视频帧,或者进行...

Global site tag (gtag.js) - Google Analytics