Android Camera系列开发 (二)通过Intent录制视频

Android Camera系列开发 (二)通过Intent录制视频

作者:雨水  2013-8-18 CSDN博客:http://blog.csdn.net/gobitan/

概述

使用Camera有两种方式:通过Intent方式和通过Camera的API。在开发系列(一) 中已经介绍了通过Intent方式拍照,本文介绍通过Intent的方式录制视频。


通过Itent实现拍录制视频

第一步:在Eclipse中创建一个名为AndroidCamera的Android工程,可参见Helloworld的例子;

第二步:在AndroidManifest.xml中添加使用Camera相关的声明如下:

 <uses-feature android:name="android.hardware.camera" android:required="false" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />	
   

第三步:编写 AndroidCameraActivity类,如下: \

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.Toast;

public class AndroidCameraActivity extends Activity {
    private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;  
      
    private Intent intent  = null;  
    private Uri fileUri    = null;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);//create a intent to record video  
        fileUri = getOutputMediaFileUri(); // create a file Uri to save the video
        
        // set the video file name
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);   
        
        // set the video quality high
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 

        // start the video capture Intent
        startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);  
    }  
  
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        super.onActivityResult(requestCode, resultCode, data);  
          
        if(requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {  
            if (resultCode == RESULT_OK) {  
                // video captured and saved to fileUri specified in the Intent  
                Toast.makeText(this, "Video saved to:\n" +  
                         data.getData(),   
                         Toast.LENGTH_LONG).show();  
            } else if (resultCode == RESULT_CANCELED) {  
                // User cancelled the video capture  
            }  
        }  
    }  
      
    /** Create a File Uri for saving a video */  
    private static Uri getOutputMediaFileUri(){  
    	//get the mobile Pictures directory
    	File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

        //get the current time
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
        
        File videoFile = new File(picDir.getPath() + File.separator + "VIDEO_"+ timeStamp + ".mp4");  
  
        return Uri.fromFile(videoFile);
    }  
}


第四步:运行程序。


运行程序会出现录制视频的窗口,录制保存后可以即可在SD卡的Pictures目录下找到刚才录制的视频。

参考资料

  1. http://developer.android.com/guide/topics/media/camera.html

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以使用AndroidCamera2 API来录制15秒的视频。以下是一个简单的示例代码,可以帮助你开始录制视频: 1. 在你的AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 在你的布局文件中添加一个SurfaceView元素用于预览视频: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在你的Activity或Fragment中,获取SurfaceView并设置它的回调: ```java private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surfaceView); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(surfaceHolderCallback); } private SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // 初始化Camera initializeCamera(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 当SurfaceView尺寸发生变化时,更新Camera参数 updateCameraParameters(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 释放Camera资源 releaseCamera(); } }; ``` 4. 初始化Camera并设置参数: ```java private CameraDevice camera; private CameraCaptureSession captureSession; private CaptureRequest.Builder previewRequestBuilder; private Size previewSize; private void initializeCamera() { CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { // 获取后置摄像头 String cameraId = cameraManager.getCameraIdList()[0]; CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); previewSize = map.getOutputSizes(SurfaceTexture.class)[0]; // 打开Camera if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { cameraManager.openCamera(cameraId, cameraStateCallback, null); } } catch (CameraAccessException e) { e.printStackTrace(); } } private CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { MainActivity.this.camera = camera; // 开始预览 startPreview(); } @Override public void onDisconnected(CameraDevice camera) { camera.close(); MainActivity.this.camera = null; } @Override public void onError(CameraDevice camera, int error) { camera.close(); MainActivity.this.camera = null; } }; private void startPreview() { try { SurfaceTexture texture = surfaceHolder.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface surface = new Surface(texture); previewRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewRequestBuilder.addTarget(surface); List<Surface> surfaces = new ArrayList<>(); surfaces.add(surface); camera.createCaptureSession(surfaces, captureSessionStateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private CameraCaptureSession.StateCallback captureSessionStateCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { captureSession = session; try { previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); CaptureRequest previewRequest = previewRequestBuilder.build(); captureSession.setRepeatingRequest(previewRequest, null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { session.close(); captureSession = null; } }; private void updateCameraParameters() { if (camera == null) { return; } try { // 获取最佳预览尺寸 CameraCharacteristics characteristics = camera.getCameraCharacteristics(camera.getId()); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] supportedSizes = map.getOutputSizes(SurfaceTexture.class); Size optimalSize = getOptimalPreviewSize(supportedSizes, surfaceView.getWidth(), surfaceView.getHeight()); // 更新预览尺寸 if (!previewSize.equals(optimalSize)) { previewSize = optimalSize; updatePreview(); } } catch (CameraAccessException e) { e.printStackTrace(); } } private void updatePreview() { if (camera == null) { return; } try { // 停止当前预览 captureSession.stopRepeating(); captureSession.abortCaptures(); // 更新预览大小 SurfaceTexture texture = surfaceHolder.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); // 创建新的预览请求 Surface surface = new Surface(texture); previewRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewRequestBuilder.addTarget(surface); List<Surface> surfaces = new ArrayList<>(); surfaces.add(surface); camera.createCaptureSession(surfaces, captureSessionStateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private Size getOptimalPreviewSize(Size[] sizes, int width, int height) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) height / width; if (sizes == null) { return null; } Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = height; for (Size size : sizes) { double ratio = (double) size.getWidth() / size.getHeight(); if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) { continue; } if (Math.abs(size.getHeight() - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.getHeight() - targetHeight); } } if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.getHeight() - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.getHeight() - targetHeight); } } } return optimalSize; } ``` 5. 在你的Activity或Fragment中实现录制视频的逻辑: ```java private MediaRecorder mediaRecorder; private File outputFile; private void startRecording() { try { // 创建输出文件 outputFile = new File(getExternalFilesDir(null), "video.mp4"); // 创建MediaRecorder mediaRecorder = new MediaRecorder(); 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.setVideoSize(previewSize.getWidth(), previewSize.getHeight()); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setOutputFile(outputFile.getAbsolutePath()); // 配置MediaRecorder mediaRecorder.prepare(); mediaRecorder.start(); // 录制15秒后停止 new Handler().postDelayed(new Runnable() { @Override public void run() { stopRecording(); } }, 15000); } catch (IOException e) { e.printStackTrace(); } } private void stopRecording() { if (mediaRecorder != null) { mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; // 停止预览 if (camera != null) { captureSession.close(); captureSession = null; camera.close(); camera = null; } // 播放录制视频 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(outputFile.getAbsolutePath())); intent.setDataAndType(Uri.parse(outputFile.getAbsolutePath()), "video/*"); startActivity(intent); } } ``` 6. 最后,在你的Activity或Fragment中添加一个按钮来启动录制: ```java public void onRecordButtonClicked(View view) { startRecording(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gobitan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值