首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android中录制,保存和播放视频

在 Android 中录制、保存和播放视频

在 Android 应用中录制、保存和播放视频变得越来越常见。为了实现这些功能,我们可以使用以下技术:

1. 录制视频

使用 Android Camera2 API 可以实现录制视频的功能。为了控制录制过程,可以使用 MediaRecorder。以下代码示例展示了如何使用 Camera2 API 录制视频:

代码语言:java
复制

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Matrix;

import android.media.projection.MediaProjection;

import android.media.projection.MediaProjectionManager;

import android.net.Uri;

import android.os.Build;

import android.os.Bundle;

import android.os.Environment;

import android.util.DisplayMetrics;

import android.view.Display;

import android.view.WindowManager;

import android.widget.FrameLayout;

import android.widget.Toast;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Locale;

public class VideoRecorderActivity extends AppCompatActivity {

代码语言:txt
复制
private static final String TAG = "VideoRecorderActivity";
代码语言:txt
复制
private static final int REQUEST_CODE = 1;
代码语言:txt
复制
private static final String DEFAULT_VIDEO_PATH = "video.mp4";
代码语言:txt
复制
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US);
代码语言:txt
复制
private MediaProjectionManager mediaProjectionManager;
代码语言:txt
复制
private MediaProjection mediaProjection;
代码语言:txt
复制
private DisplayMetrics displayMetrics;
代码语言:txt
复制
private int screenWidth;
代码语言:txt
复制
private int screenHeight;
代码语言:txt
复制
private FrameLayout videoView;
代码语言:txt
复制
private SurfaceView surfaceView;
代码语言:txt
复制
private CameraDevice cameraDevice;
代码语言:txt
复制
private CameraCaptureSession captureSession;
代码语言:txt
复制
private CaptureRequest.Builder captureRequestBuilder;
代码语言:txt
复制
private Surface surface;
代码语言:txt
复制
private boolean isPreviewRunning;
代码语言:txt
复制
@Override
代码语言:txt
复制
protected void onCreate(Bundle savedInstanceState) {
代码语言:txt
复制
    super.onCreate(savedInstanceState);
代码语言:txt
复制
    setContentView(R.layout.activity_video_recorder);
代码语言:txt
复制
    mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
代码语言:txt
复制
    displayMetrics = getResources().getDisplayMetrics();
代码语言:txt
复制
    screenWidth = displayMetrics.widthPixels;
代码语言:txt
复制
    screenHeight = displayMetrics.heightPixels;
代码语言:txt
复制
    videoView = findViewById(R.id.video_view);
代码语言:txt
复制
    surfaceView = findViewById(R.id.surface_view);
代码语言:txt
复制
    findViewById(R.id.record_button).setOnClickListener(new View.OnClickListener() {
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public void onClick(View v) {
代码语言:txt
复制
            startRecording();
代码语言:txt
复制
        }
代码语言:txt
复制
    });
代码语言:txt
复制
    findViewById(R.id.stop_button).setOnClickListener(new View.OnClickListener() {
代码语言:txt
复制
        @Override
代码语言:txt
复制
        public void onClick(View v) {
代码语言:txt
复制
            stopRecording();
代码语言:txt
复制
        }
代码语言:txt
复制
    });
代码语言:txt
复制
}
代码语言:txt
复制
private void startRecording() {
代码语言:txt
复制
    stopRecording(); // 先停止录制
代码语言:txt
复制
    Intent intent = mediaProjectionManager.createScreenCaptureIntent();
代码语言:txt
复制
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
代码语言:txt
复制
    startActivityForResult(intent, REQUEST_CODE);
代码语言:txt
复制
}
代码语言:txt
复制
private void stopRecording() {
代码语言:txt
复制
    if (captureSession != null) {
代码语言:txt
复制
        captureSession.close();
代码语言:txt
复制
        captureSession = null;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (cameraDevice != null) {
代码语言:txt
复制
        cameraDevice.close();
代码语言:txt
复制
        cameraDevice = null;
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
@Override
代码语言:txt
复制
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
代码语言:txt
复制
    if (requestCode == REQUEST_CODE) {
代码语言:txt
复制
        if (resultCode == RESULT_OK) {
代码语言:txt
复制
            Bundle extras = data.getExtras();
代码语言:txt
复制
            Bitmap bitmap = extras.getParcelable("data");
代码语言:txt
复制
            videoView.setVideoPath(getFilename());
代码语言:txt
复制
            videoView.setMediaController(new MediaController(this));
代码语言:txt
复制
            videoView.requestFocus();
代码语言:txt
复制
            videoView.start();
代码语言:txt
复制
        } else {
代码语言:txt
复制
            Toast.makeText(this, "Screen capture failed, please try again", Toast.LENGTH_SHORT).show();
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
private String getFilename() {
代码语言:txt
复制
    File videoFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "Camera");
代码语言:txt
复制
    if (!videoFolder.exists()) {
代码语言:txt
复制
        videoFolder.mkdirs();
代码语言:txt
复制
    }
代码语言:txt
复制
    return videoFolder.getAbsolutePath() + "/" +
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券