Artigo Diretório
-
- Vamos dar uma olhada no efeito final
- 1. Clique para tirar uma foto
- Em segundo lugar, grave o vídeo
- Três, interface de visualização de vídeo
- 4. Chame a câmera do sistema para gravar e obter o caminho do vídeo de gravação
- Este endereço do github
- Se você também adora aprender e quer aprender. Então vá de mãos dadas, abaixo está minha conta oficial
Prefácio: Este capítulo é um derivado da série de câmeras, tudo baseado na personalização da câmera. Pode haver muitas informações ou artigos na Internet, mas depois de ler esses dois artigos, você deve ter aprendido a personalizar a câmera (como WeChat clique para tirar fotos, toque longo para gravar); e acho que a maior vantagem do meu artigo é usar o mais simples Linguagem para descrever o código. Em seguida, o seguinte também é ilustrado. Se você não vê a câmera em série , é recomendável ver. Vou começar a falar diretamente sobre o vídeo aqui.
Seção 2 deste capítulo:
Personalize a câmera para tirar fotos e chame o sistema de câmera-série de câmeras (1)
Personalize a câmera para gravar e chame o sistema de gravação-série de câmeras (2)
Vamos dar uma olhada no efeito final
Clique para tirar uma foto | Pressione e segure para gravar vídeo |
---|---|
1. Clique para tirar uma foto
Este capítulo fala apenas sobre gravação de vídeo, clique para tirar uma foto, consulte a série de câmeras (1)
Em segundo lugar, grave o vídeo
A gravação de vídeo é baseada na série de câmeras anterior (1). Portanto, é melhor ler o artigo anterior novamente. Primeiro, o sistema fornece a classe MediaRecorder para gravarmos vídeos. Venha diretamente para a nossa aula anterior de gerenciamento CameraInterface. Lembre-se de seguir esta ordem e lembre-se de adicionar as permissões de câmera e de áudio antes
2.1, prepare-se para gravar o vídeo, prepareVideoRecorder (SurfaceHolder surfaceHolder)
public boolean prepareVideoRecorder(SurfaceHolder surfaceHolder) {
//视频存放的路径
videoPath = context.getFilesDir().getAbsolutePath().toString() + "/" + TimeUtils.getDateToStringLeo(System.currentTimeMillis() + "") + "_atmancarm.mp4";
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
//将camera设置给MediaRecorder
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
//设置音频资源,所以记得打开音频权限android.permission.RECORD_AUDIO
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
//设置录像资源
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
// Step 4: Set output file
mMediaRecorder.setOutputFile(videoPath);
// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
//这里和拍照一个概念,如果不旋转方向,那么拍摄出来的视频都是横屏的。
//这里唯一存在的问题的,前置录制视频时会出现镜像问题。可以利用FFmpeg解决。本章讲的是录制,这个问题就留着了
if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
mMediaRecorder.setOrientationHint(90);
} else if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mMediaRecorder.setOrientationHint(270);
}
// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
//释放mMediaRecorder
releaseMediaRecorder();
return false;
} catch (IOException e) {
releaseMediaRecorder();
return false;
}
return true;
}
2.2. Iniciar a gravação, startRecord ()
public void startRecord() {
//录制
mMediaRecorder.start();
}
2.3. Pare a gravação, stopRecod ()
public String stopRecod() {
//停止录制,即是录制完成,我们将路径return出去。如果大家想做视频编辑,可以去了解FFmpeg
mMediaRecorder.stop();
return videoPath;
}
2.4 、 释放 mMediaRecorder , releaseMediaRecorder ()
public void releaseMediaRecorder() {
if (mMediaRecorder != null) {
mMediaRecorder.reset(); // clear recorder configuration
mMediaRecorder.release(); // release the recorder object
mMediaRecorder = null;
mCamera.lock(); // lock camera for later use
}
}
2.5, basta gravar nosso vídeo
Como coloquei todo o código de gerenciamento em CameraInterface para separação de código e, ao mesmo tempo, personalizo CameraView para chamar, evite que nossa atividade apareça diretamente em CameraInterface, para que o código seja melhor e mais claro.
Grave vídeo chame diretamente: cameraView.startRecord ();
chame diretamente após a gravação: String path = binding.cameraView.stopRecod (); path é o caminho do vídeo
Três, interface de visualização de vídeo
Originalmente, os seguintes efeitos podem ser obtidos usando o MediaController do sistema com VideoView. No entanto, ele é feio, então personalizei um com tópicos e interface do usuário.
Preste atenção a alguns pontos ao usar VideoView
- Definir caminho de reprodução
//如果是网络路径,那么转换成uri
videoView.setVideoPath(path);
- Pausar e jogar
//开始播放
binding.videoView.start();
//暂停
binding.videoView.pause();
//跳都某个时刻播放,毫秒数
binding.videoView.seekTo(currentPosition);
- Definir reprodução de loop
binding.videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//设置循环播放
mp.setLooping(true);
}
});
- libertado
@Override
protected void onDestroy() {
super.onDestroy();
binding.videoView.suspend();
}
- Se o caminho de reprodução estiver errado, aparecerá que o vídeo não pode ser reproduzido. Quando clicarmos em OK, ele não poderá ser reproduzido, cancele o sistema e adicione o seu próprio. Saia da interface após clicar em OK
binding.videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// 这里加上你自定义的dialog作操作
// 这里return true后,就不弹出系统的无法播放此视频的弹窗
return true;
}
});
4. Chame a câmera do sistema para gravar e obter o caminho do vídeo de gravação
Chame o seguinte código diretamente
Intent intentVideo = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(intentVideo, CAMERA_VIDEO_PATH);
Obtenha o caminho do vídeo em onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == CAMERA_VIDEO_PATH) {
//获取视频路径
String path = data.getData().toString();
VideoPlayActivity.startActivity(SystemCameraActivity.this, path);
}
}
}