应用程序在本机4k中显示其图像内容的机制

据我了解,目前超高清video内容在4k电视上大部分使用HEVC codecstream式传输。

我想了解具有超高清图像内容的应用程序如何在原生4K显示图像内容?

我正在寻找的是渲染4k(3840*2060) jpeg图像。 我的显示器支持4k渲染, SOC甚至可以输出4k。 我正在寻找在框架中的修改,以便所有具有4K图像的应用程序可以在我的设备上呈现它们,而不用缩小。

其实我正在想出别人可以使用的API集。 但我的主要困惑是:对于JPEG图像我创build一个4K表面,但他们也是其他表面(button等)。 它们通过在1280*720呈现的表面抛掷物呈现。

现在用这些其他表面组成我的4k表面的最好方法是什么? 我应该在哪里升级这些表面以及在哪里构build它们?

Related of "应用程序在本机4k中显示其图像内容的机制"

要保持清醒的一个重要的事情是你想要的是什么样的发展。 如果您只是希望将videostream显示在应用程序内部,则应该为主要活动提供用户界面,这些界面只包含VideoView类的一个实例。 VideoView类具有广泛的方法,可以调用以pipe理video播放。

将videoconfiguration为要播放的video的path,然后开始播放。 然后selectVideoPlayerActivity.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用户界面的Android SDK,这意味着你可以使用不同的select来实际渲染UI层下的videostream 。

将已经存在的应用程序从平板电脑或移动设备迁移到智能电视也是可以顺利实现的。 一些事情将不得不进行调整 – 例如通常用于智能电视的触摸屏可能不是一种select。

在这里输入图像说明

相反,您应该考虑将onkeyDown作为input应用程序交互的更可靠的方法:

 @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智能Google TV API的一部分,您还可以对较大的屏幕分辨率进行必要的调整:

  // 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; 

您也可以轻松地将您的液晶电视转换成智能电视,并开始播放和testing您的谷歌电视应用程序的行为。 为此,您只需将手放入适配器套件即可 。

事实上,联想正在发布一款运行Android的28英寸4K显示器(ThinkVision 28),让您可以运行所有常用的媒体stream应用程序, Kogan也是如此。

在这里输入图像说明

在玩小工具方面进一步的黑客攻击,你甚至可以在电视上用MHL HDMI把你的手机拿走,或者把它用作电脑 。

在这里输入图像说明

所以,使用MHL3.0的 Android 做4Kvideo输出是一个现实,好的开发者已经可以根据所使用的设备对其应用程序进行必要的分辨率和input调整。

如果您主要关心的是放置性能并优化videostream,则可以考虑以下选项:

  • NDK:你决定采取一些库或实现你自己的程序,实际上是用C ++来优化videostream 。
  • RenderScript:它使用C99语法和最终编译为本地代码的新API。 虽然这个语法是众所周知的,但是使用这个系统有一个学习曲线,因为API不是。
  • OpenCL:用于graphics加速,并提供许多用于3D渲染和videostream高性能的工具 。

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

实际上,OpenCL中的代码类似于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; } } 

在ARM微处理器function方面,值得一提的是Sigma Designs针对Android机顶盒的SMP8756 ARM,旨在解决全面的高效video编码( HEVC )function。

  • 双线性过滤

要调整图像/video的大小,你需要的是应用双线性滤波 。 双线性插值是在隔行video帧中使用每个中间场来生成全尺寸目标图像的过程。 无论是全部奇数还是全部偶数行都被使用 。 然后在行之间和相邻像素之间执行插值以生成用于逐行扫描输出的完整非隔行帧。

在这里输入图像说明

为了实现你的图像正确调整所需的大小,有很多好的algorithm可以用于这个目的,比如一些用于图像缩放的OpenCL特性,对于本机C ++也是如此,其他的选项也是可用的 。