用andriod studio,写一个录像机(含声音)的项目,视图文件布局为:下仿有三个按钮,“录制”和“播放”和“结束录制”,点击录制,app调用手机的摄像头进行录制,并在左上角显示录制时间,点击“结束录制”,结束录制,点击“播放”,对录制的视频进行播放。我的andriod studio版本是最新版
时间: 2023-12-09 15:02:27 浏览: 72
android 录像
3星 · 编辑精心推荐
好的,这是一个比较复杂的项目,需要涉及到多个组件和功能,我将会给你提供一个基本的框架,你可以在此基础上进行开发。
首先,需要在布局文件中创建三个按钮和一个用于显示录制时间的 TextView 组件。可以参考以下代码:
```xml
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android:id="@+id/btnRecord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="录制"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"/>
<Button
android:id="@+id/btnPlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结束录制"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>
<TextView
android:id="@+id/tvTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textSize="20sp"
android:textColor="@android:color/white"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:padding="10dp"/>
</RelativeLayout>
```
接下来,需要在 MainActivity 中获取布局文件中的组件,并设置相应的点击事件。在 onCreate() 方法中添加以下代码:
```java
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private SurfaceView surfaceView;
private Button btnRecord, btnPlay, btnStop;
private TextView tvTime;
private MediaRecorder mediaRecorder;
private MediaPlayer mediaPlayer;
private int hour, minute, second;
private boolean isRecording = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surfaceView);
btnRecord = findViewById(R.id.btnRecord);
btnPlay = findViewById(R.id.btnPlay);
btnStop = findViewById(R.id.btnStop);
tvTime = findViewById(R.id.tvTime);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
btnRecord.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isRecording) {
startRecording();
isRecording = true;
}
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
stopRecording();
isRecording = false;
}
}
});
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playRecording();
}
});
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 初始化 MediaRecorder
mediaRecorder = new MediaRecorder();
mediaRecorder.setPreviewDisplay(holder.getSurface());
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setOutputFile(getOutputMediaFile().toString());
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
private void startRecording() {
mediaRecorder.prepare();
mediaRecorder.start();
startTimer();
}
private void stopRecording() {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
stopTimer();
}
private void playRecording() {
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(getOutputMediaFile().toString());
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void startTimer() {
hour = minute = second = 0;
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
second++;
if (second == 60) {
second = 0;
minute++;
}
if (minute == 60) {
minute = 0;
hour++;
}
tvTime.setText(String.format(Locale.getDefault(), "%02d:%02d:%02d", hour, minute, second));
handler.postDelayed(this, 1000);
}
});
}
private void stopTimer() {
hour = minute = second = 0;
tvTime.setText("00:00:00");
}
private File getOutputMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "MyVideo");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
return mediaFile;
}
}
```
在上面的代码中,我们首先获取了布局文件中的组件,然后为每个按钮设置了相应的点击事件。在 surfaceCreated() 方法中初始化了 MediaRecorder 对象,并设置了视频和音频的相关参数。在 startRecording() 方法中开始录制视频,并在 startTimer() 方法中启动一个计时器,用于显示录制时间。在 stopRecording() 方法中停止录制,并在 stopTimer() 方法中停止计时器。在 playRecording() 方法中播放录制的视频。
最后,需要添加以下权限到 AndroidManifest.xml 文件中:
```xml
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```
这样,一个录像机项目就完成了。当你点击 “录制” 按钮时,应用将会调用手机的摄像头进行录制,并在左上角显示录制时间。点击 “结束录制” 按钮,应用将会停止录制。点击 “播放” 按钮,应用将会播放录制的视频。
阅读全文