据我了解,当前UHD视频内容主要是通过4k
在HEVC codec
电视上流式传输的。
我想了解具有UHD图像内容的应用程序如何以 native 4K
显示其图像内容?
我正在寻找的是渲染4k(3840*2060)
jpeg图像。我的显示器支持4k渲染,并且SOC
甚至可以输出4k。我正在寻找框架的修改,以便所有具有4k图像的应用程序都可以在我的设备上呈现它们而无需缩小尺寸。
实际上,我正在尝试提出其他人可以使用的API
设置。但是我的主要困惑是:对于jpeg图像,我创建了一个4k的表面,但是它们也是其他表面(按钮等)。它们由表面Flinger渲染,该表面在1280*720
处渲染。
现在,将我的4k曲面与其他曲面合成的最佳方法是什么?我应该在哪里扩大这些表面以及在哪里组成所有这些表面?
最佳答案
要弄清楚的重要一件事是您要记着什么样的发展。如果您只是希望将视频流显示在您的App内,则应使用主要 Activity 的用户界面,该 Activity 仅由VideoView类的实例组成。 VideoView类具有广泛的方法,可以调用这些方法来管理视频的回放。
使用要播放的视频路径配置VideoView,然后开始播放。然后选择VideoPlayerActivity.java文件并按照以下 list 中的概述修改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();
}
.
.
.
}
本质上来说,您拥有的是用于App用户界面的Android SDK,这意味着您可以使用不同的选择在UI层下实际呈现视频streaming。
将already existing App从平板电脑或移动设备迁移到智能电视也是可以很顺利地实现的。一些事情将不得不进行调整-例如触摸屏通常不适用于智能电视。
相反,您应该考虑将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 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;
您还可以轻松地将LCD电视转换为智能电视,然后开始播放和测试您的Google TV应用程序的行为。为此,您只需要 Handlebars 放在adaptor kit中。
实际上,联想发布了一款28英寸4K显示器(ThinkVision 28),该显示器还运行Android,使您可以运行所有常见的媒体流应用程序,而Kogan也在这样做。
在玩玩小玩意时,您可以进一步破解,甚至可以在电视上使用MHL HDMI来固定手机,或将其用作computer。
因此,Android使用MHL 3.0 does 4K video输出是一个现实,那就是优秀的开发人员已经可以使用必要的分辨率和相应的使用设备调整输入来制作他们的Apps。
如果您主要关注提高性能和优化视频流,则可以考虑以下选择:
实际上,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微处理器功能而言,值得一提的是适用于Android机顶盒的Sigma Designs SMP8756 ARM,它旨在解决全部高效视频编码(HEVC)功能。
要调整图像/视频的大小,您需要应用bilinear filtering。双线性插值是使用隔行扫描视频帧中的每个中间场生成全尺寸目标图像的过程。字段are used上的所有奇数行或偶数行。然后在行之间以及相邻像素之间执行内插,以生成用于逐行扫描输出的整个非隔行帧。
为了实现根据所需大小正确调整图像,可以使用许多不错的算法来实现此目的,例如image scaling的一些OpenCL功能,同样对于 native C++,其他选项也为available。