Android 录制surface
时间: 2023-10-25 08:26:40 浏览: 34
您好!要在Android上录制Surface,您可以使用MediaRecorder类来实现。下面是一个简单的示例代码,展示了如何录制SurfaceView的内容:
```java
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private static final int REQUEST_PERMISSIONS = 100;
private static final String[] PERMISSIONS = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA
};
private SurfaceView mSurfaceView;
private Button mRecordButton;
private MediaRecorder mMediaRecorder;
private boolean isRecording = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSurfaceView = findViewById(R.id.surface_view);
mRecordButton = findViewById(R.id.record_button);
mSurfaceView.getHolder().addCallback(this);
mRecordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
stopRecording();
} else {
startRecording();
}
}
});
if (!hasPermissions()) {
ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_PERMISSIONS);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
prepareMediaRecorder();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseMediaRecorder();
}
private boolean hasPermissions() {
for (String permission : PERMISSIONS) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
private void prepareMediaRecorder() {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
String outputPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "output.mp4";
mMediaRecorder.setOutputFile(outputPath);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface());
try {
mMediaRecorder.prepare();
} catch (IOException e) {
Toast.makeText(this, "录制准备失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
private void startRecording() {
mMediaRecorder.start();
isRecording = true;
mRecordButton.setText(R.string.stop_recording);
}
private void stopRecording() {
mMediaRecorder.stop();
isRecording = false;
mRecordButton.setText(R.string.start_recording);
releaseMediaRecorder();
}
private void releaseMediaRecorder() {
if (mMediaRecorder != null) {
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
}
}
}
```
请确保在AndroidManifest.xml文件中添加必要的权限,并在布局文件中添加一个SurfaceView和一个Button,用于启动/停止录制。
这是一个简单的示例,您可以根据您的需求进行扩展和优化。希望对您有所帮助!如果您有任何问题,请随时提问。