Ответ 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 под слоем пользовательского интерфейса.
Вместо этого вы должны рассмотреть 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 делают то же самое.
Взламывая немного больше в игре с гаджетами, вы можете даже поднять свой мобильный телефон с помощью MHL HDMI на телевизоре или использовать его как компьютер.
Итак, Android, работающий с MHL 3.0 делает вывод 4K видео - это реальность, которую хорошие разработчики уже могут сделать своими Приложениями с необходимым разрешением и вводом в зависимости от используемого устройства.
Если ваша главная задача - повысить производительность и оптимизировать потоковое видео, вы можете рассмотреть следующие варианты:
- NDK: вы решили взять некоторую библиотеку или реализовать свою собственную программу, которая на самом деле сделана на С++, чтобы оптимизировать потоковое видео .
- RenderScript: он использует синтаксис C99 с новыми API, которые в конечном итоге скомпилированы в собственный код. Хотя этот синтаксис хорошо известен, существует кривая обучения использованию этой системы, поскольку API-интерфейсы не являются.
- OpenCL: предназначен для ускорения графики и предоставляет множество инструментов для 3D-рендеринга и высокого видеопотока performance.
На самом деле код в 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).
- Билинейная фильтрация
Чтобы изменить размер вашего изображения/видео, вам нужно применить билинейную фильтрацию. Билинейная интерполяция - это процесс использования каждого из промежуточных полей в чересстрочном видеокадре для генерации целевого изображения полного размера. Используются либо все нечетные, либо все четные линии на поле . Интерполяции затем выполняются между линиями и между соседними пикселями для генерации целого кадра без чередования для выхода прогрессивного сканирования.
Чтобы реализовать, чтобы изображение правильно отрегулировалось для требуемых размеров, существует множество хороших алгоритмов, которые могут быть использованы для этой цели, например некоторые из функций OpenCL для масштабирование изображений, а также для собственных С++ других опций также доступно.