自定義TextureView錄製視頻的一些初始化

public class VedioTextureView extends TextureView {
    private MediaPlayer mediaPlayer;
    private boolean isPrepared = false;
    private boolean isRecord = false;
    private  boolean isPlay = false;
    private Camera camera;
    private SurfaceTexture surfaceTexture;
    private MediaRecorder recorder;
    public VedioTextureView(Context context){
        this(context,null);
    }
    public VedioTextureView(Context context, AttributeSet attrs){
        this(context,attrs,0);
    }
    public VedioTextureView(Context context, AttributeSet attrs,int defStyleAttr){
        super(context,attrs,defStyleAttr);
        init();
    }
    private void init(){
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
        camera.setDisplayOrientation(90);
        mediaPlayer = new MediaPlayer();
        recorder = new MediaRecorder();
        camera.unlock();
        recorder.setCamera(camera);
        try {
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setScreenOnWhilePlaying(true);
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    Log.i("wanlijun","onPrepared");
                    isPrepared = true;
                }
            });
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.i("wanlijun","播放完畢");

                }
            });
            recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            recorder.setVideoSize(640,480);
            recorder.setVideoFrameRate(30);
            recorder.setVideoEncodingBitRate(3*1024*1024);
            recorder.setOrientationHint(90);
            recorder.setMaxDuration(30*1000);
            recorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
                @Override
                public void onInfo(MediaRecorder mr, int what, int extra) {

                }
            });
        }catch (Exception e){
            mediaPlayer.reset();
            e.printStackTrace();
            Log.i("wanlijun","init:"+e.toString());
        }
        setSurfaceTextureListener(new SurfaceTextureListener() {
            @Override
            public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                if(surfaceTexture == null){
                    surfaceTexture = surface;
                    mediaPlayer.setSurface(new Surface(surface));
//                    try {
//                        mediaPlayer.prepare();
//                    }catch (Exception e){
//                        e.printStackTrace();
//                        Log.i("wanlijun","prepare:"+e.toString());
//                    }
//                    isPrepared = true;
                    recorder.setPreviewDisplay(new Surface(surface));
                    try {
                        camera.setPreviewTexture(surface);
                        camera.startPreview();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }else{
                    setSurfaceTexture(surfaceTexture);
                }
            }

            @Override
            public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

            }

            @Override
            public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                if(recorder != null){
                    recorder.release();
                    recorder = null;
                    camera.lock();
                }
                if(mediaPlayer != null){
                    mediaPlayer.release();
                    mediaPlayer = null;
                }
                if(camera != null) {
                    camera.stopPreview();
                    camera.release();
                    camera = null;
                }
                return true;
            }

            @Override
            public void onSurfaceTextureUpdated(SurfaceTexture surface) {

            }
        });
    }
    public void record(){
        if(isRecord){
            isRecord = false;
            camera.lock();
            recorder.stop();
        }else{
            String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Camera/one.mp4";
            Log.i("wanlijun","path:"+path);
            recorder.setOutputFile(path);
            try {
                recorder.prepare();
                recorder.start();
                isRecord = true;
            }catch (Exception e){
                e.printStackTrace();
                isRecord = false;
                Log.i("wanlijun","record:"+e.getMessage());
            }

        }
    }

    public void start(){
        if(isPlay){
            isPlay = false;
            if(mediaPlayer != null){
                mediaPlayer.stop();
            }
        }else{
            if(mediaPlayer != null){
                try {
                    String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Camera/one.mp4";
                    Log.i("wanlijun","path:"+path);
                    mediaPlayer.setDataSource(path);
                    mediaPlayer.prepare();
                    if(isPrepared){
                        mediaPlayer.start();
                    }else{
                        Log.i("wanlijun","還未準備就緒,請稍等");
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

    }
    public  void stop(){
        if(mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章