android 录像

使用MediaRecorder类
takevideo takevideo
package com.example.takepicture;

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

import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Display;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends Activity {

	
	private Button mButtonStart;
	private Button mButtonStop;
	private View mLayout;
	private SurfaceView mSurfaceView;
	private Camera camera;
	private MediaRecorder mediaRecorder;
	private final static String TAG="takepicture";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		
		Window window =getWindow();
	    requestWindowFeature(Window.FEATURE_NO_TITLE);//没有标题
	    window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
	    setContentView(R.layout.activity_main);
	    
	    
	    
	    mButtonStart =(Button) findViewById(R.id.buttonstart);
	    mButtonStop =(Button) findViewById(R.id.buttonstop);
	    mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
	    
	    //使用类MediaRecorder作为视频采集类
	    mediaRecorder =new MediaRecorder();
	    mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	    mSurfaceView.getHolder().setFixedSize(176, 144);
	    mSurfaceView.getHolder().setKeepScreenOn(true);
	    
	    //开始采集
	    mButtonStart.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
					try {
					File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+ ".3gp");
					mediaRecorder.reset();
					mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //从照相机采集视频
					mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
					mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					mediaRecorder.setVideoSize(320, 240);
					mediaRecorder.setVideoFrameRate(3); //每秒3帧
					mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //设置视频编码方式
					mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					mediaRecorder.setOutputFile(file.getAbsolutePath());
					mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
					
						mediaRecorder.prepare();
						mediaRecorder.start();//开始刻录
						
						
					} catch (IllegalStateException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					catch (Exception e) 
					{
						Log.e(TAG, e.toString());
						
					}
					
					//预期准备
					
					mButtonStart.setEnabled(false);
					mButtonStop.setEnabled(true);						
				}else{
					Toast.makeText(MainActivity.this, "err", 1).show();
				}	
			}

		});
	    

	    
	    
	    
	    mButtonStop.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				mediaRecorder.stop();
				Toast.makeText(MainActivity.this, "success", 1).show();

				mButtonStop.setEnabled(false);
				mButtonStart.setEnabled(true);
			}
		});
	    
	    
	    
	}
	
	

   @Override
	protected void onDestroy() {
		if(mediaRecorder!=null) 
			mediaRecorder.release();
		super.onDestroy();
	}




	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if(event.getAction()==MotionEvent.ACTION_DOWN)
		{
			mLayout =(View)	findViewById(R.id.buttonlayout);
			mLayout.setVisibility(ViewGroup.VISIBLE);
			
			return true;
		}
		
		return super.onTouchEvent(event);
	}

}


### Android 平台上的录像功能实现 #### 使用 `Camera` API 实现基本录像功能 对于较旧版本的 Android 应用程序,可以使用传统的 `Camera` 类来录制视频。这涉及到创建并配置一个 `MediaRecorder` 对象: ```java // 初始化 MediaRecorder 和 Camera 对象 private void prepareMediaRecorder() { mMediaRecorder = new MediaRecorder(); camera.unlock(); // 解锁摄像头以便 MediaRecorder 可以访问它 mMediaRecorder.setCamera(camera); // 设置音频源为麦克风 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置视频源为默认相机设备 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA)[^1]; } ``` 为了启动和停止录音过程,还需要定义相应的逻辑处理方法。 #### 利用 `Camera2` API 改善性能与控制力 自 Android Lollipop (API level 21) 起引入了更强大的 `Camera2` 接口,提供了更好的硬件抽象层以及更多的定制选项。特别是针对高帧速率(HFR)的支持,在此之前仅限于特定厂商提供的扩展特性[^3]。 下面是一个简单的例子展示如何通过 `Camera2` 进行录像设置: ```java import android.hardware.camera2.*; ... public class VideoCaptureActivity extends AppCompatActivity { private CaptureRequest.Builder captureBuilder; private CameraDevice cameraDevice; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... setupCamera(); startRecording(); } private void setupCamera(){ CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE); try{ String[] ids = manager.getCameraIdList(); if(ids.length>0){ final String id=ids[0]; // 默认选择第一个可用的后置摄像头 manager.openCamera(id, stateCallback, null); List<Surface> outputSurfaces=new ArrayList<>(); ImageReader reader=ImageReader.newInstance(width,height, ImageFormat.JPEG,2); Surface surface=reader.getSurface(); outputSurfaces.add(surface); mediaRecorder.start(); mediaRecorder.setOutputFile(videoFilePath); mediaRecorder.prepare(); captureBuilder=cameraDevice.createCaptureRequest( CameraDevice.TEMPLATE_RECORD); captureBuilder.addTarget(surface); cameraDevice.createCaptureSession(outputSurfaces, sessionStateCallback,null); } }catch(CameraAccessException e){e.printStackTrace();} } private void startRecording(){ try{ mediaRecorder.reset(); File videoFile=createUniqueVideoFile(this,"MP4"); Uri uri=getUriForFile(this,new FileProvider(),videoFile); mediaRecorder.setOutputFile(uri.getPath()); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.prepare(); mediaRecorder.start(); } catch(IOException | IllegalStateException e){ Log.e(TAG,e.getMessage()); } } } ... ``` 这段代码展示了如何利用 `Camera2` 来初始化会话、构建捕获请求,并最终调用 `mediaRecorder.start()` 方法开始记录视频流到文件中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值