Механизм для приложений для отображения их содержимого изображения в родном 4k

Как я понимаю, в настоящее время видеоконтент UHD транслируется на 4k TV в основном с использованием HEVC codec.

Я хочу понять, как приложения, имеющие контент изображения UHD, могут отображать содержимое своего изображения в native 4k?

То, что я точно ищу, - это рендеринг изображений 4k(3840*2060) jpeg. Мой дисплей поддерживает рендеринг 4k, а SOC может даже выводить 4k. Я ищу изменения в структуре, так что все приложения, которые имеют 4k-изображения, могут отображать их на моем устройстве без масштабирования.

На самом деле я пытаюсь придумать набор API, который другие могут использовать. Но моя основная путаница заключается в следующем: для jpeg-изображения я создаю поверхность 4k, но это также другие поверхности (кнопки и т.д.). Они визуализируются поверхностным flinger, который отображается при 1280*720.

Теперь, каков наилучший способ создать мою 4k-поверхность с этими другими поверхностями? Где я должен масштабировать эти поверхности и где их составлять?

Ответы

Ответ 1

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

Настройте VideoView с помощью пути воспроизведения видео и затем начните воспроизведение. Затем выберите файл VideoPlayerActivity.java и измените метод OnCreate(), как описано в следующем листинге:

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();
    }
.
.
.
}

По сути, у вас есть Android SDK для пользовательского интерфейса приложения, что означает, что вы можете использовать разные варианты для рендеринга видео streaming под слоем пользовательского интерфейса.

Перенос вашего с планшета или мобильного телефона на смарт-телевизор также может быть довольно плавным. Некоторым вещам нужно будет скорректировать - например, сенсорный экран, как правило, для интеллектуального телевизора, возможно, не является вариантом.

enter image description here

Вместо этого вы должны рассмотреть onkeyDown как более надежный способ ввода взаимодействия для вашего приложения:

@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);
}

Как часть Android Smart API Google TV, вы также можете сделать необходимую настройку для большего разрешения экрана:

   // Get the source image 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;

Вы также можете легко преобразовать свой ЖК-телевизор в интеллектуальный телевизор и начать играть и тестировать, как будет выглядеть ваше приложение для телевизора Google. Для этого вам нужно только положить руки в комплект адаптера .

Фактически Lenovo выпускает 28-дюймовый монитор 4K (ThinkVision 28), который также запускает Android, позволяя запускать все обычные приложения для потоковой передачи мультимедиа и Kogan делают то же самое.

enter image description here

Взламывая немного больше в игре с гаджетами, вы можете даже поднять свой мобильный телефон с помощью MHL HDMI на телевизоре или использовать его как компьютер.

enter image description here

Итак, Android, работающий с MHL 3.0 делает вывод 4K видео - это реальность, которую хорошие разработчики уже могут сделать своими Приложениями с необходимым разрешением и вводом в зависимости от используемого устройства.

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

  • NDK: вы решили взять некоторую библиотеку или реализовать свою собственную программу, которая на самом деле сделана на С++, чтобы оптимизировать потоковое видео .
  • RenderScript: он использует синтаксис C99 с новыми API, которые в конечном итоге скомпилированы в собственный код. Хотя этот синтаксис хорошо известен, существует кривая обучения использованию этой системы, поскольку API-интерфейсы не являются.
  • OpenCL: предназначен для ускорения графики и предоставляет множество инструментов для 3D-рендеринга и высокого видеопотока performance.

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

На самом деле код в OpenCL напоминает 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;
       }
    }

В терминах возможностей микропроцессоров ARM стоит упомянуть Sigma Designs SMP8756 ARM для Android Set-top-boxes, предназначенные для полного кодирования видео высокой эффективности (HEVC).

  • Билинейная фильтрация

Чтобы изменить размер вашего изображения/видео, вам нужно применить билинейную фильтрацию. Билинейная интерполяция - это процесс использования каждого из промежуточных полей в чересстрочном видеокадре для генерации целевого изображения полного размера. Используются либо все нечетные, либо все четные линии на поле . Интерполяции затем выполняются между линиями и между соседними пикселями для генерации целого кадра без чередования для выхода прогрессивного сканирования.

enter image description here

Чтобы реализовать, чтобы изображение правильно отрегулировалось для требуемых размеров, существует множество хороших алгоритмов, которые могут быть использованы для этой цели, например некоторые из функций OpenCL для масштабирование изображений, а также для собственных С++ других опций также доступно.