Mecanismo para que las aplicaciones muestren su contenido de imagen en 4k nativo

Como entiendo que actualmente el contenido de video UHD es transmitido en 4k TV principalmente usando HEVC codec .

Quiero entender cómo las aplicaciones que tienen contenido de imagen UHD pueden mostrar su contenido de imagen en 4K nativo?

Lo que estoy buscando exactamente es la prestación de 4k(3840*2060) imágenes 4k(3840*2060) jpeg. Mi pantalla admite la renderización 4k y el SOC puede incluso emitir 4k. Estoy buscando modificaciones en el marco, por lo que todas las aplicaciones que tienen 4k imágenes pueden renderizar en mi dispositivo sin reducción de escala.

En realidad estoy tratando de llegar a conjunto de API que otros pueden utilizar. Pero mi principal confusión es: para la imagen jpeg creo una superficie de 4k, pero sus otras superficies también (botones etc). Son rendidos por el lanzador de la superficie que rinde en 1280*720 .

¿Ahora cuál es la mejor manera de componer mi superficie 4k con estas otras superficies? ¿Dónde debo escalar estas superficies y dónde componerlas?

Una cosa importante para mantener claro es qué tipo de desarrollo que tiene en mente. Si simplemente desea mostrar una secuencia de vídeo dentro de su aplicación, debe tomar la interfaz de usuario para la actividad principal que consistirá simplemente en una instancia de la clase VideoView. La clase VideoView tiene una amplia gama de métodos que se pueden llamar para gestionar la reproducción de vídeo.

Configure el VideoView con la ruta del video que se va a reproducir y luego inicie la reproducción. A continuación, seleccione el archivo VideoPlayerActivity.java y modifique el método OnCreate () como se describe en el siguiente listado:

 package com.example.videoplayer; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.VideoView; public class VideoPlayerActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_player); final VideoView videoView = (VideoView) findViewById(R.id.videoView1); videoView.setVideoPath( "http://www.ebookfrenzy.com/android_book/movie.mp4"); videoView.start(); } . . . } 

Esencialmente, lo que tienes es el SDK de Android para la interfaz de usuario de la aplicación, lo que significa que puedes usar diferentes opciones para convertir realmente la transmisión de vídeo por debajo de la capa de interfaz de usuario.

La migración de su aplicación ya existente desde una tableta o móvil a un televisor inteligente también es algo que se puede lograr sin problemas. Algunas cosas tendrán que ser ajustadas – por ejemplo, la pantalla táctil por lo general para la televisión inteligente no puede ser una opción.

Introduzca aquí la descripción de la imagen

En su lugar, debe considerar onkeyDown como un método más confiable para la interacción de entrada para su aplicación:

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_MEDIA_PLAY:{ if (!mPlaying) { startSlideShow(); } mPlaying = true; break; } case KeyEvent.KEYCODE_MEDIA_PAUSE:{ mPlaying = false; showStatusToast(R.string.slideshow_paused); } } return super.onKeyDown(keyCode, event); } 

Como parte de Android Smart API de Google TV, también puede hacer ajustes necesarios para resoluciones de pantalla más grandes:

  // Get the source image's dimensions BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // this does not download the actual image, just downloads headers. BitmapFactory.decodeFile(IMAGE_FILE_URL, options); int srcWidth = options.outWidth; // actual width of the image. int srcHeight = options.outHeight; // actual height of the image. // Only scale if the source is big enough. This code is just trying to fit a image into a certain width. if(desiredWidth > srcWidth) desiredWidth = srcWidth; // Calculate the correct inSampleSize/scale value. This helps reduce memory use. It should be a power of 2. int inSampleSize = 1; while(srcWidth / 2 > desiredWidth){ srcWidth /= 2; srcHeight /= 2; inSampleSize *= 2; } float desiredScale = (float) desiredWidth / srcWidth; // Decode with inSampleSize options.inJustDecodeBounds = false; // now download the actual image. options.inDither = false; options.inSampleSize = inSampleSize; options.inScaled = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; // ensures the image stays as a 32-bit ARGB_8888 image. // This preserves image quality. Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(IMAGE_FILE_URL, options); // Resize Matrix matrix = new Matrix(); matrix.postScale(desiredScale, desiredScale); Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0, sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true); sampledSrcBitmap = null; // Save FileOutputStream out = new FileOutputStream(LOCAL_PATH_TO_STORE_IMAGE); scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); scaledBitmap = null; 

También puede convertir fácilmente su TV LCD en un televisor inteligente y empezar a jugar y probar cómo se comportará su aplicación para google TV. Para eso sólo es necesario poner las manos en el kit adaptador .

De hecho, Lenovo está lanzando un monitor de 4 pulgadas de 28 pulgadas (el ThinkVision 28) que también funciona con Android , lo que le permite ejecutar todas las aplicaciones de streaming de medios habituales, y Kogan está haciendo lo mismo.

Introduzca aquí la descripción de la imagen

Hacking un poco más lejos en jugar con los gadgets, incluso puede huck hasta su móvil con MHL HDMI en un televisor o utilizarlo como una computadora .

Introduzca aquí la descripción de la imagen

Por lo tanto, Android que trabaja con MHL 3.0 hace 4K de salida de vídeo es una realidad que los buenos desarrolladores ya pueden hacer sus aplicaciones con la resolución necesaria y el ajuste de entrada en función del dispositivo en uso.

Si su principal preocupación es poner el rendimiento y optimizar la transmisión de vídeo, puede considerar las siguientes opciones:

  • NDK: Usted decide tomar una biblioteca o implementar su propio programa que realmente se hace en C + + para optimizar la transmisión de vídeo .
  • RenderScript: utiliza la sintaxis C99 con nuevas API que finalmente se compilan en código nativo . Aunque esta sintaxis es bien conocida, hay una curva de aprendizaje para usar este sistema porque las API no lo son.
  • OpenCL: se destina a la aceleración de gráficos y proporciona muchas herramientas para la representación 3D y el flujo de vídeo de alto rendimiento .

Http://developer-static.se-mc.com/wp-content/blogs.dir/1/files/2013/10/OpenCL_final.jpg

De hecho el código en OpenCL se asemeja a C / C ++:

  for (int yy=-filterWidth; yy<=filterWidth; ++yy) { for (int xx=-filterWidth; xx<=filterWidth; ++xx) { int thisIndex = (y + yy) * width + (x + xx); float4 currentPixel = oneover255 *convert_float4(srcBuffer[thisIndex]); float domainDistance = fast_distance((float)(xx), (float)(yy)); float domainWeight = exp(-0.5f * pow((domainDistance/sigmaDomain),2.0f)); float rangeDistance = fast_distance(currentPixel.xyz, centerPixel.xyz); float rangeWeight = exp(-0.5f * pow((rangeDistance/sigmaRange),2.0f)); float totalWeight = domainWeight * rangeWeight ; normalizeCoeff += totalWeight; sum4 += totalWeight * currentPixel; } } 

En términos de capacidades de microprocesadores ARM, vale la pena mencionar el ARM de Sigma Designs SMP8756 para Android Set-top-boxes, destinado a abordar las capacidades completas de codificación de vídeo de alta eficiencia ( HEVC ).

  • Filtrado Bilinear

Para cambiar el tamaño de su imagen / video, lo que necesita es aplicar el filtrado bilineal . La interpolación bilineal es el proceso de usar cada uno de los campos intermedios en una trama video entrelazada para generar una imagen de la blanco del tamaño completo. Se utilizan todas las líneas impares o todas las líneas pares del campo. A continuación, se realizan interpolaciones entre las líneas y entre píxeles adyacentes para generar una trama entera no entrelazada para la salida de exploración progresiva.

Introduzca aquí la descripción de la imagen

Para implementar su imagen ajustada correctamente para los tamaños que necesita, hay un montón de buenos algoritmos que se pueden utilizar para ese propósito, como algunas de las características de OpenCL para la escala de imagen , y también para C ++ nativo otras opciones también están disponibles .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.