Grabe vídeo con un tamaño de vista previa diferente al del archivo de vídeo resultante

Estoy intentando permitir que los usuarios registren el vídeo que es un diverso tamaño que la inspección previa en pantalla real que pueden ver mientras que graba. Esto parece ser posible a partir de esta documentación relativa a la función getSupportedVideoSizes que establece:

Si la lista devuelta no es nula, la lista devuelta contendrá al menos un tamaño y uno de los tamaños de la lista devuelta se debe pasar a MediaRecorder.setVideoSize () para la aplicación de videocámara si se utiliza la cámara como fuente de vídeo. En este caso, el tamaño de la vista previa puede ser diferente de la resolución del vídeo grabado durante la grabación de vídeo.

Esto sugiere que algunos teléfonos devolverán nulo de este fn (en mi experiencia el Galaxy SIII sí), pero para aquellos que no lo hacen, es posible proporcionar una vista previa con una resolución diferente que el video real. ¿Es correcto este entendimiento? ¿Algunos teléfonos permiten el comportamiento y otros no?

Intentando una solución:

En la descripción oficial de la función setPreviewDisplay , que se utiliza en el largo proceso de configuración de la grabación de vídeo , se menciona que:

Si este método se llama con una superficie nula o no se llama en absoluto, el grabador de medios no cambiará la superficie de vista previa de la cámara.

Esto parece ser lo que quiero, pero por desgracia si lo hago, todo el proceso de grabación de vídeo está completamente desordenado. Estoy asumiendo que esta función no se puede pasar nulo o no se llama en absoluto en el proceso de grabación de vídeo. Quizás en otros contextos esto está bien. Lamentablemente, sin embargo, esto no parece que me ayude.

Mis únicos pasos siguientes son mirar en TextureView s y utilizar una textura de la previsualización en comparación con una aplicación SurfaceView típica con el fin de utilizar openGL para estirar la textura a mi tamaño deseado que difiere de la resolución real (y recortar cualquier exceso de la pantalla ) Y, a continuación, para construir una superficie para la función setPreviewDisplay con el constructor Surface(SurfaceTexture surfaceTexture) para una superficie. Me gustaría evitar usar un TextureView debido a la incompatibilidad debajo de ICS, y también porque esto agrega la complejidad significativa.

Esto parece un proceso delicado, pero espero que alguien pueda ofrecer algunos consejos en esta área.

Gracias.

3 Solutions collect form web for “Grabe vídeo con un tamaño de vista previa diferente al del archivo de vídeo resultante”

A.Assume que el usuario establece el tamaño de x, y como tamaño de vídeo

B.Now con la función getSupportedVideoSizes obtener la lista completa y ver si x, y cae en uno de ellos y establecer el MediaRecorder.setVideoSize () .Si x, y no cae en la lista getSupportedVideoSizes, a continuación, defina el perfil predeterminado para el video grabar.

Se trata del tamaño del video

Ahora llegando al tamaño de vista previa, no hay muchas opciones de solución. Tome un RelativeLayout que contiene el 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" /> 

Vista previa es el nombre del SurfaceView. Aquí he dado una muestra de volver a dimensionar a la mitad de la anchura y la altura.

 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) 

Mire la resolución de la vista previa y luego reduzca la altura o el ancho en función del tamaño del vídeo.

Espero eso ayude.

Como mencionas, esto sólo es posible cuando getSupportedVideoSizes () devuelve una lista no nula.

Pero si usted ve una lista no nula, entonces este enfoque simple debería funcionar:

  1. Establezca la resolución de vista previa deseada con setPreviewSize ; El tamaño que seleccione tiene que ser uno de los tamaños dados de getSupportedPreviewSizes .

  2. Establezca la visualización de vista previa en su SurfaceView o SurfaceTexture con setPreviewDisplay o setPreviewTexture , respectivamente.

  3. Inicie la vista previa.

  4. Cree la grabadora de medios y establezca su tamaño de vídeo directamente con setVideoSize utilizando uno de los tamaños de getSupportedVideoSizes o utilice uno de los perfiles de videocámara predefinidos para configurar todos los ajustes de la grabadora de medios para una calidad / tamaño determinado.

  5. Pase el objeto de la cámara a la llamada setCamera de MediaRecorder , configure el resto de la grabadora de medios e inicie la grabación.

En los dispositivos con una lista no-null getSupportedVideoSizes, esto debería hacer que la vista previa permanezca en la resolución establecida por la llamada setPreviewSize, con la grabación funcionando a la resolución de perfil de video / videocámara configurada. En los dispositivos sin tamaños de vídeo compatibles, el tamaño de la vista previa se restablecerá por el MediaRecorder para que coincida con el tamaño de grabación. Debe poder probar esto estableciendo una resolución de vista previa muy baja y una alta resolución de grabación (por ejemplo, 160×120 para previsualización, 720p para grabación). Debería ser obvio si el MediaRecorder cambia la resolución de vista previa a 720p cuando se inicia la grabación, ya que la calidad de vista previa salta sustancialmente.

Tenga en cuenta que el tamaño de vista previa no está directamente vinculado a las dimensiones de la pantalla SurfaceView; La salida de la vista previa de la cámara se escalará para que se ajuste a SurfaceView, por lo que si las dimensiones de su SurfaceView son, por ejemplo, 100×100 píxeles debido a su diseño y dispositivo, la resolución de vista previa se escalará a 100×100 para su visualización. Por lo tanto, debe asegurarse de que la relación de aspecto del SurfaceView sea correcta para que la vista previa no se distorsione.

Y para la eficiencia energética, no debe usar una resolución de vista previa mucho mayor que el número real de píxeles en su SurfaceView, ya que la resolución adicional se perderá al ajustar la vista previa en la vista de superficie. Esto es, por supuesto, sólo posible para la grabación cuando getSupportedVideoSizes () devuelve un valor no nulo.

En primer lugar, intentaré responder a sus preguntas específicas.

  1. Es posible proporcionar una vista previa con una resolución diferente que el video real. ¿Es correcto este entendimiento?

Sí, el tamaño de vista previa es más a menudo diferente al tamaño de grabación. El tamaño de vista previa suele estar vinculado al tamaño de la pantalla. Así que si un teléfono tiene pantalla de CIF (352 x 288), pero es capaz de grabar D1 (720 x 480), entonces el tamaño de vista previa y el tamaño de la grabación será diferente. Creo que otros expertos han respondido suficientemente sobre este punto.

  1. ¿Algunos teléfonos permiten el comportamiento y otros no?

La mayoría de los últimos teléfonos son compatibles con esta función, excepto quizás unos pocos de gama baja.

Junto con setPreviewDisplay , tenemos que considerar este punto también:

La única excepción es que si la superficie de vista previa no se establece (o se establece en nulo) antes de que startPreview () se llame, este método se puede llamar una vez con un parámetro no nulo para establecer la superficie de vista previa. (Esto permite que la configuración de la cámara y la creación de la superficie ocurran en paralelo, ahorrando tiempo.) La superficie de vista previa no puede cambiar de otra forma mientras se está ejecutando la vista previa.

¿Podría compartir el problema al que se enfrenta cuando setPreviewDisplay se invoca con una superficie NULL ?

  • MediaRecorder.start () lanzando IllegalStateException
  • Android Video Recording de la superficie de OpenGL (GLSURFACEVIEW)
  • Android API8 setDisplayOrientation no afecta en absoluto
  • Cómo grabar el video usando la vista previa de la cámara en TextureView
  • Cómo cambiar entre la cámara delantera y trasera cuando se utiliza MediaRecorder android
  • Cómo cambiar framerate cuando se utiliza clase MediaRecorder
  • Error de la cámara "No se puede conectar a la cámara" o en algunos teléfonos aparece el error "La cámara está usando otra aplicación"
  • Android MediaRecorder setCaptureRate () y velocidad de reproducción de vídeo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.