Câmera personalizada Andorid, clique para tirar a foto, pressione e segure para gravar e chame a câmera do sistema para gravar (série de câmeras 2)


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);
            }
        }
    }

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

Acho que você gosta

Origin blog.csdn.net/leol_2/article/details/104985000
Recomendado
Clasificación