Запись видео с другим размером предварительного просмотра, чем полученный видеофайл

Я пытаюсь разрешить пользователям записывать видео, которое отличается от фактического экранного предварительного просмотра, которое они могут видеть во время записи. Это возможно из этой документации, касающейся функции getSupportedVideoSizes которая гласит:

Если возвращенный список не является нулевым, возвращаемый список будет содержать по крайней мере один размер, и один из размеров в возвращаемом списке должен быть передан MediaRecorder.setVideoSize () для приложения для видеокамер, если камера используется в качестве источника видео. В этом случае размер предварительного просмотра может отличаться от разрешения записанного видео во время видеозаписи.

Это говорит о том, что некоторые телефоны вернут null из этого fn (по моему опыту Galaxy SIII), но для тех, кто этого не делает, можно предоставить предварительный просмотр с другим разрешением, чем фактическое видео. Правильно ли это понимание? Некоторые телефоны позволяют поведение, а другие нет?

Попытка решения:

В официальном описании функции setPreviewDisplay , которая используется в длительном процессе настройки видеозаписи , упоминается, что:

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

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

Мои следующие шаги – посмотреть в TextureView s и использовать TextureView предварительного просмотра в отличие от типичной реализации SurfaceView, чтобы использовать openGL для растягивания текстуры до нужного размера, который отличается от фактического разрешения (и обрезает лишнее с экрана ), А затем для построения поверхности для функции setPreviewDisplay с конструктором Surface(SurfaceTexture surfaceTexture) для поверхности. Я хотел бы избежать использования TextureView из-за несовместимости ниже ICS, а также потому, что это добавляет значительную сложность.

Это кажется деликатным процессом, но я надеюсь, что кто-то может предложить некоторые советы в этой области.

Спасибо.

Solutions Collecting From Web of "Запись видео с другим размером предварительного просмотра, чем полученный видеофайл"

A. Укажите, что пользователь устанавливает размер x, y как размер видео

B.Now с функцией getSupportedVideoSizes получить весь список и посмотреть, входит ли x, y в один из них и установить MediaRecorder.setVideoSize (). Если x, y не попадает в список getSupportedVideoSizes, тогда задайте профиль по умолчанию для видео запись.

Речь идет о размере видео

Теперь приходя к размеру предварительного просмотра, не так много вариантов обхода. Возьмите RelativeLayout, который содержит SurfaceView.

 <android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/preview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> 

Предварительный просмотр – это имя SurfaceView. Здесь я дал образец переустановки его на половину ширины и высоты.

 resetCamera(); //reset the camera ViewGroup.LayoutParams params = preview.getLayoutParams(); RelativeLayout myRelLayout = (RelativeLayout) findViewById(R.id.myRelLayout); params.width = (int) (myRelLayout.getWidth()/2); params.height = (int)(myRelLayout.getHeight()/2); preview.setLayoutParams(params); initCamera(); //initiate the camera(open camera, set parameter, setPreviewDisplay,startPreview) 

Просмотрите разрешение предварительного просмотра, а затем уменьшите размер или ширину соответственно на основе размера видео.

Надеюсь, поможет.

Как вы упомянули, это возможно только тогда, когда getSupportedVideoSizes () возвращает ненулевой список.

Но если вы видите ненулевой список, то этот простой подход должен работать:

  1. Установите желаемое разрешение предварительного просмотра с помощью setPreviewSize ; Выбранный вами размер должен быть одним из размеров, указанных в getSupportedPreviewSizes .

  2. Установите отображение предварительного просмотра на SurfaceView или SurfaceTexture с помощью setPreviewDisplay или setPreviewTexture соответственно.

  3. Начать предварительный просмотр.

  4. Создайте медиа-рекордер и установите его размер видео либо напрямую с помощью setVideoSize, используя один из размеров из getSupportedVideoSizes , либо используйте один из предопределенных профилей видеокамеры, чтобы настроить все настройки медиа-рекордера для заданного качества / размера.

  5. Передайте объект камеры на вызов setCamera MediaRecorder , настройте остальную часть медиа-рекордера и начните запись.

На устройствах с ненулевым списком getSupportedVideoSizes это должно привести к тому, что предварительный просмотр останется в разрешении, заданном вашим вызовом setPreviewSize, с записью, работающей с заданным разрешением размера видео / видеокамеры. На устройствах без поддерживаемых размеров видео размер файла предварительного просмотра сбрасывается MediaRecorder в соответствии с размером записи. Вы должны проверить это, установив очень низкое разрешение предварительного просмотра и высокое разрешение записи (скажем, 160×120 для предварительного просмотра, 720p для записи). Это должно быть очевидно, если MediaRecorder переключит разрешение предварительного просмотра на 720p при начале записи, так как качество предварительного просмотра существенно скажется.

Обратите внимание: размер предварительного просмотра напрямую не связан с размерами экрана SurfaceView; Результат предварительного просмотра камеры будет масштабироваться, чтобы вписаться в SurfaceView, поэтому, если ваши размеры SurfaceView, скажем, 100×100 пикселей из-за вашего макета и устройства, независимо от того, какое разрешение для просмотра вы используете, будет масштабироваться до 100×100 для отображения. Поэтому вам все равно нужно убедиться, что соотношение сторон SurfaceView правильное, чтобы предварительный просмотр не искажался.

И для энергоэффективности вы не должны использовать разрешение предварительного просмотра намного выше фактического количества пикселей в SurfaceView, так как дополнительное разрешение будет потеряно при установке предварительного просмотра в режиме просмотра поверхности. Это, конечно, возможно только для записи, когда getSupportedVideoSizes () возвращает ненулевое значение.

Во-первых, я постараюсь ответить на ваши конкретные вопросы.

  1. Можно предоставить предварительный просмотр с другим разрешением, чем фактическое видео. Правильно ли это понимание?

Да, размер предварительного просмотра чаще всего отличается от размера записи. Размер предварительного просмотра чаще всего не связан с вашим размером экрана. Поэтому, если на телефоне отображается CIF (352 x 288), но он способен записывать D1 (720 x 480), размер предварительного просмотра и размер записи будут разными. Я считаю, что другие эксперты достаточно ответили на этот вопрос.

  1. Некоторые телефоны позволяют поведение, а другие нет?

Большинство последних телефонов поддерживают эту функцию, за исключением, возможно, нескольких low-end.

Наряду с setPreviewDisplay , мы должны рассмотреть этот момент также:

Единственное исключение состоит в том, что если поверхность предварительного просмотра не установлена ​​(или установлена ​​в нуль) до вызова функции startPreview (), этот метод может быть вызван один раз с ненулевым параметром для установки поверхности предварительного просмотра. (Это позволяет осуществлять настройку камеры и создание поверхности параллельно, экономя время.) В процессе предварительного просмотра поверхность предварительного просмотра может не измениться.

Не могли бы вы рассказать о проблеме, с которой столкнулись вы, когда setPreviewDisplay вызывается с помощью NULL поверхности?