Как я могу захватить видео с камеры по умолчанию android в формате mp4? - PullRequest
0 голосов
/ 06 марта 2020

Мое приложение должно иметь возможность отправлять видео на сервер через службу загрузки. Когда я снимаю видео с камеры устройства, оно использует формат .3gp, который не поддерживается бэкэндом.

На моем Presenter я получаю удовольствие startCamera () {CLog.d ("UploadVideoPresenter.startCamera" )

        val values = ContentValues()
        values.put(MediaStore.Video.Media.TITLE, "yyy")
        mCapturedVideoURI = (view as NewBaseFragment).activity?.contentResolver?.insert(
            MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
            values
        )

        CLog.d("UploadVideoPresenter.startCamera futureVideo mCapturedVideoURI: ${mCapturedVideoURI.toString()}")
        val intentPicture = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
        intentPicture.putExtra(
            MediaStore.EXTRA_VIDEO_QUALITY,
            1
        ) // set to high quality, it still saves in 3pg format, though
        intentPicture.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedVideoURI)
        (view as NewBaseFragment).startActivityForResult(intentPicture, REQUEST_CAMERA)
    }

Я получаю результат в своем фрагменте

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        CLog.d("UploadVideoFragment.onActivityResult ")
        (activity as ActivityFeedActivity).showUpButton(true)
        (activity as ActivityFeedActivity).setActionBarIcon(R.drawable.ico_close)
        if (resultCode == Activity.RESULT_OK) {
            presenter.captureVideoResult(requestCode, data)
        }
    }

И обратно к докладчику мы снимаем видео

 fun captureVideoResult(requestCode: Int, data: Intent?) {
        CLog.d("UploadVideoPresenter.captureVideoResult")


        data?.data?.let {
            mCapturedVideoURI = data.data
        }
        mCapturedVideoURI.let {
            val msm = MediaStorageManager((view as NewBaseFragment).activity!!)
            val file = File(msm.getPath(mCapturedVideoURI!!))
            currentFileName = file.name
            videoBytes = getBytes(file)
            CLog.d("UploadVideoPresenter.captureVideoResult  videoBytes: ${(videoBytes as ByteArray).size}")

            val bitmap = ThumbnailUtils.createVideoThumbnail(
                msm.getPath(mCapturedVideoURI!!),
                MediaStore.Images.Thumbnails.MINI_KIND
            )
            view.renderVideo(bitmap)
        }
    }

Оттуда оно отправляется на услуги загрузки. Однако отправляемый файл всегда является файлом .3gp, а наш бэкэнд работает только с файлами mp4 / WebM. Я искал об этом, но большинство ответов " установить качество 1 " или "создать выходной файл и назовите его foo.mp4", ни один из них не помог вообще. Был один способ использования ffmpeg для преобразования, но это выходит за рамки этого приложения.

Я что-то упустил перед запуском камеры?

...