1 程序代码

使用Android中的SurfaceView播放RGB视频数据,SufaceView播放代码如下:

package com.zhoulee.surfaceviewdemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView; public class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback
{
private static String TAG = "MySurfaceView";
private static String RGB_FILE_NAME = "/data/video/bxjg_352x288.rgba";
private static int PICTURE_WIDTH = 352;
private static int PICTURE_HEIGHT = 288;
private static int PICTURE_SIZE = PICTURE_WIDTH * PICTURE_HEIGHT * 4;
private Rect m_srcRect;
private Rect m_dstRect;
private SurfaceHolder m_surfaceHolder;
private boolean m_flag;
private Canvas m_canvas;
private FileInputStream m_fileInputStream; byte [] m_pixel = new byte[PICTURE_SIZE]; private Thread m_thread = new Thread(new Runnable()
{
@Override
public void run() {
while(m_flag)
{
m_canvas = m_surfaceHolder.lockCanvas();
m_canvas.drawColor(Color.BLACK); try {
if(-1 == m_fileInputStream.read(m_pixel))
{
break;
}
} catch (IOException e1) {
e1.printStackTrace();
} ByteBuffer buffer = ByteBuffer.wrap(m_pixel); Bitmap videoBitmap = Bitmap.createBitmap(PICTURE_WIDTH, PICTURE_HEIGHT, Config.ARGB_8888); videoBitmap.copyPixelsFromBuffer(buffer); m_canvas.drawBitmap(videoBitmap, m_srcRect, m_dstRect, null); if(m_canvas != null)
{
m_surfaceHolder.unlockCanvasAndPost(m_canvas);
} try
{
Thread.sleep(5);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}); public MySurfaceView(Context context) {
super(context);
Log.i(TAG, "MySurfaceView Constructor");
m_flag = false;
m_surfaceHolder = this.getHolder();
m_surfaceHolder.addCallback(this);
m_srcRect = new Rect(0, 0, PICTURE_WIDTH, PICTURE_HEIGHT);
m_dstRect = new Rect(800, 50, 800 + PICTURE_WIDTH, 50 + PICTURE_HEIGHT);
} @Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCtreated");
m_flag = true;
try {
m_fileInputStream = new FileInputStream(RGB_FILE_NAME);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
m_thread.start();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(TAG, "surfaceChanged");
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
m_flag = false;
}
}

入口Activity代码如下:

package com.zhoulee.surfaceviewdemo;

import android.app.Activity;
import android.os.Bundle; public class SurfaceViewDemoActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurfaceView(this));
}
}

2 参考资料

How to load RGB565 buffer to ImageView

android显示RGB565数据图像

Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系

使用SurfaceView播放RGB原始视频-2016.01.22的更多相关文章

  1. [官方软件] Easy Sysprep v4.3.29.602 【系统封装部署利器】(2016.01.22)--skyfree大神

    [官方软件] Easy Sysprep v4.3.29.602 [系统封装部署利器](2016.01.22) Skyfree 发表于 2016-1-22 13:55:55 https://www.it ...

  2. [2016.01.22]万峰文本处理专家 v2.1

    <万峰文本处理专家>是一款简单易用,且功能强大的各类文本文件处理软件.1.支持多任务的处理模式,允许一次处理多个任务.2.支持正则表达式替换,替换更加强大:3.支持各类关键字的行处理操作: ...

  3. 2016.01.22 前端学习 HTML/CSS

    学习HTML/CSS  http://edu.51cto.com/course/course_id-3116.html 明日实践

  4. 最简单的视音频播放示例4:Direct3D播放RGB(通过Texture)

    本文接着上一篇文章继续记录Direct3D(简称D3D)播放视频的技术.上一篇文章中已经记录了使用Direct3D中的Surface渲染视频的技术.本文记录一种稍微复杂但是更加灵活的渲染视频的方式:使 ...

  5. 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  6. 最简单的视音频播放示例7:SDL2播放RGB/YUV

    本文记录SDL播放视频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...

  7. 最简单的视音频播放示例5:OpenGL播放RGB/YUV

    本文记录OpenGL播放视频的技术.OpenGL是一个和Direct3D同一层面的技术.相比于Direct3D,OpenGL具有跨平台的优势.尽管在游戏领域,DirectX的影响力已渐渐超越OpenG ...

  8. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  9. 最简单的视音频播放演示样例7:SDL2播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

随机推荐

  1. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. 用imageROI来增加某范围的像素

    //用imageROI来增加某范围的像素 //作者:sandy //时间:2015-10-5 #include <cv.h> #include <highgui.h> int ...

  3. Python 结巴分词(2)关键字提取

    提取关键字的文章是,小说完美世界的前十章: 我事先把前十章合并到了一个文件中: 然后直接调用关键字函数: import sys sys.path.append('../') import jieba ...

  4. Mac下更改python版本为3.5

    mac下默认安装了2.x版本的python , 安装python3.5.1后 , 需要切换一下 在~/.bash_profile中添加如下alias(如果你用的是iterm,那就修改.zshrc) a ...

  5. 常见数组&字符串API及其应用场景总结

    数组API: String(arr):将arr中每个元素转化为字符串,逗号连接     场景:用于鉴别数据有没有修改等. ps:String是万能的   toString 只能转换除null和unde ...

  6. Fatal error: Class 'GearmanClient' not found解决方法

    产生原因: 没有安装PHP的gearman扩展 解决方法:1.  打开:http://pecl.php.net/package/gearman2.  wget  http://pecl.php.net ...

  7. Jmeter html 报告中添加90% line time

    转载南风_real博客园:http://www.cnblogs.com/jaychang/p/5784882.html 首先上效果图: 其次明白几个原理: 90% Line的意思是:一组数由小到大进行 ...

  8. tomcat 部署多个项目的技巧

    方法一.在tomcat的根目录下的 conf文件夹下的server.xml文件中的<Host>标签中加入: //docBase: 项目的webRoot path:访问路径 reloadab ...

  9. 当月 当年sql

    本文转自:http://jophy.javaeye.com/blog/337321 当月数据 Java代码 select * from table t where t.create_time > ...

  10. [Java] File文件列表

    package test.file; import java.io.File; import java.io.FilenameFilter; /** * 文件列表,文件过滤 * @author Fro ...