Media Recorder становится черным при записи и работает только на телефонах, которые не имеют метки - PullRequest
2 голосов
/ 11 июля 2019

Я использую записываемую поверхность для записи видео. Я пытаюсь подготовить медиа-рекордер, настраивая все атрибуты, а также ширину и высоту videoSize. Он прекрасно работает на всех телефонах, но не работает на телефонах с выемками. Я настраиваю высоту и иногда вижу предварительный просмотр. Но если я оставлю его по умолчанию для всех устройств, настроив высоту и ширину дисплея для displayMetrics, он будет работать для некоторых телефонов и не будет работать для моего телефона PIXEL3 XL. Пожалуйста, помогите.

Вот так я настраиваю свой медиа-рекордер методом init.

private void resetVideoFragment() {
        logger.info("Resetting Video Fragment ");
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;

        if (videoRenderer == null) {
            videoRenderer = new Renderer(this, width, height);
        }
        setupVideoFragment(videoRenderer);
        viewHolder.liveSurfaceView.resume();
        videoFile = getVideoFile();
        try {
            viewHolder.liveSurfaceView.initRecorder(videoFile, width, height, (mr, what, extra) -> {
                logger.error("Media Recorder error " + " what: " + what + " extra: " + extra);
            }, (mr, what, extra) -> {
                logger.error("Media Recorder Info " + " what: " + what + " extra: " + extra);
            });
        } catch (IOException iox) {
            logger.error("Couldn't re-init recording " + iox);
        }
    }

Вот так выглядит мой метод init mediarecorder

public void initRecorder(File saveToFile, int displayWidth, int displayHeight,
                             int orientationHint, MediaRecorder.OnErrorListener errorListener,
                             MediaRecorder.OnInfoListener infoListener) {

        MediaRecorder mediaRecorder = new MediaRecorder();
        mediaRecorder.setOnInfoListener(infoListener);
        mediaRecorder.setOnErrorListener(errorListener);

        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mediaRecorder.setInputSurface(mSurface);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mediaRecorder.setAudioSamplingRate(44100);
        mediaRecorder.setAudioEncodingBitRate(96000);

        mediaRecorder.setVideoSize(displayWidth, displayHeight);
(On phone which doesn't work If i try to tweak this height and width
 it able to shows preview if i increase more number to it and
 it throws to the error i was talking about while recording
How to make it work for all the phones ?)

        mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

        // original setting-- resulted in a huge file in just a few seconds!!
//        mediaRecorder.setVideoEncodingBitRate(12000000);
        mediaRecorder.setVideoEncodingBitRate(7500000);
        mediaRecorder.setVideoFrameRate(30);
        mediaRecorder.setOrientationHint(orientationHint);

        mediaRecorder.setOutputFile(saveToFile.getPath());
        mediaRecorder.setPreviewDisplay(mSurface);
        try {
            mediaRecorder.prepare();
        } catch (IOException e) {
            logger.error("IO Exception on Media Recorder init method: " + e.getLocalizedMessage());
        }

        mMediaRecorder = mediaRecorder;

    }

код ошибки чего: 100 дополнительно: 2 а что: 268435556 дополнительно: -1007 при записи

...