Вытягивание видеофайла из TextureView для сохранения - PullRequest
0 голосов
/ 28 января 2020

В настоящее время я создаю приложение камеры, используя camera2 api. Я записываю видео, и этот файл отправляется на другой вид деятельности, чтобы мы могли исправить ориентацию и посмотреть видео. Затем измененное видео или изображение сохраняется на устройстве.

Когда я использую неподвижное изображение, оно работает, потому что я могу вытащить растровое изображение и затем восстановить изображение следующим образом:

 public String saveImage() {

    //Getting a new file name and file path
    //Should we delete these images after were done with them?
    File newImageFile = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File newImageFolder = new File(newImageFile, "camera2VideoImage");
    if (newImageFolder.exists())
    {
        newImageFolder.mkdirs();
    }

    String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String prepend = "Image_" + timestamp + "_";
    File imageFile = null;
    try {
        imageFile = File.createTempFile(prepend, ".jpg", newImageFolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String newFileName = imageFile.getAbsolutePath();


    Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();


    try {
        FileOutputStream fos = new FileOutputStream(newFileName);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    //returning the new file path.
    return newFileName;
}

Это работает, они просматривают изображение и имеют возможность изменить его ориентацию на случай, если оно испортилось, а затем мы сохранили его.

Я пытаюсь сделать то же самое с видео, но не уверен как вытащить видео из TextureView, чтобы я мог сохранить его снова с исправленной ориентацией, поскольку фронтальная камера иногда переворачивается в зависимости от телефона.

Метод сохранения записи:

 public String saveVideo() {

    //Getting a new file name and file path
    //Should we delete these images after were done with them?
    File newVideoFile = getExternalFilesDir(Environment.DIRECTORY_MOVIES);
    File newVideoFolder = new File(newVideoFile, "camera2VideoImage");
    if (newVideoFolder.exists())
    {
        newVideoFolder.mkdirs();
    }

    String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String prepend = "Video_" + timestamp + "_";
    File videoFile = null;
    try {
        videoFile = File.createTempFile(prepend, ".jpg", newVideoFolder);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String newFileName = videoFile.getAbsolutePath();


    textureView.getBitmap();

    FileOutputStream fos = new FileOutputStream(newFileName);

    //returning the new file path.
    return newFileName;
}

Как я могу получить исправленное видео из вида текстуры и затем сохранить его, как метод Image выше?

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Я закончил тем, что изменил конфигурацию на Media Recorder, похоже, что я пытался исправить другие проблемы с ориентацией и вызвал это. Таким образом, под моим настроенным mediaRecorder я сделал это:

 private void setupMediaRecorder() throws IOException {
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setOutputFile(mVideoFileName);
    mMediaRecorder.setVideoEncodingBitRate(100000000);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(mVideoSize.getWidth(),mVideoSize.getHeight());
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    if (cameraCheck.contains("1") && mTotalRotation == 180){
        //This corrects problems for the front facing camera when recording, the default settings work, so we do nothing here.
    }else {

       mMediaRecorder.setOrientationHint(mTotalRotation);
    }


    mMediaRecorder.prepare();


}

Это проверяет, является ли это фронтальной камерой, и телефон расположен на 180. Если это не делает ничего для исправления, иначе используйте исправление.

0 голосов
/ 29 января 2020

Это не рекомендуемый способ; стоимость getBitmap в TextureView высока и вряд ли подходит для записи видео со скоростью 30 кадров в секунду.

Но если вы действительно хотите попробовать, вам нужно передать растровое изображение в MediaRecorder ; вы можете использовать MediaRecorder.getSurface () для этого, а затем заблокировать Surface Canvas и нарисовать в нем свой растровое изображение.

Однако я не удивлюсь, если производительность будет низкой или MediaRecorder Surface не принимает растровые изображения RGB.

Как правило, вы хотите подключить API-интерфейс камеры непосредственно к MediaRecorder или MediaCode c Surface. Если вам действительно нужно редактировать кадры посередине, использование графического процессора, как правило, является наиболее производительным вариантом, хотя для этого нужно написать много кода.

...