使用SurfaceView播放RGB原始视频-2016.01.22
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图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
使用SurfaceView播放RGB原始视频-2016.01.22的更多相关文章
- [官方软件] 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 ...
- [2016.01.22]万峰文本处理专家 v2.1
<万峰文本处理专家>是一款简单易用,且功能强大的各类文本文件处理软件.1.支持多任务的处理模式,允许一次处理多个任务.2.支持正则表达式替换,替换更加强大:3.支持各类关键字的行处理操作: ...
- 2016.01.22 前端学习 HTML/CSS
学习HTML/CSS http://edu.51cto.com/course/course_id-3116.html 明日实践
- 最简单的视音频播放示例4:Direct3D播放RGB(通过Texture)
本文接着上一篇文章继续记录Direct3D(简称D3D)播放视频的技术.上一篇文章中已经记录了使用Direct3D中的Surface渲染视频的技术.本文记录一种稍微复杂但是更加灵活的渲染视频的方式:使 ...
- 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
- 最简单的视音频播放示例7:SDL2播放RGB/YUV
本文记录SDL播放视频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...
- 最简单的视音频播放示例5:OpenGL播放RGB/YUV
本文记录OpenGL播放视频的技术.OpenGL是一个和Direct3D同一层面的技术.相比于Direct3D,OpenGL具有跨平台的优势.尽管在游戏领域,DirectX的影响力已渐渐超越OpenG ...
- 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
- 最简单的视音频播放演示样例7:SDL2播放RGB/YUV
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
随机推荐
- Jedis 连接redis超时
redis默认不允许远程连接 用vi打开Redis服务器的配置文件redis.conf ~ sudo vi /etc/redis/redis.conf #注释bind #bind 127.0.0.1 ...
- 用radio控制<tr>的隐藏和显示问题
jsp页面代码 <tr> <th nowrap="nowrap" width="10%" height="50px" st ...
- freemarker解析模板报错问题
在确定模板文件代码无误的情况下,导致报错的原因大概有以下原因: 模板文件编码改变了(比如eclipse中的项目部署到tomcat下,而忘记设置tomcat编码就会导致读取模板文件编码不正确,导致程序解 ...
- PLSQL_基础系列11_递归和层次查询CONNECT BY(案例)
2015-05-31 Created By BaoXinjian
- [Mysql] MySQL配置文件my.cnf的理解
一.缘由 最近要接手数据库的维护工作,公司首选MySQL.对于MySQL的理解,我认为很多性能优化工作.主从主主复制都是在调整参数,来适应不同时期不同数量级的数据. 故,理解透彻my.cnf里的参数是 ...
- 外中断之swi软件中断:
在stm32的标准库的外中断库文件中有void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);原来一直不知道有什么用,现总结一下: 作用:软件模拟产生中断能 ...
- SqlServer2005基于已有表创建分区
随着当今数据库的容量越来越快的朝着在大型数据库或超大型数据库的发展,对于数据库中的大 型表以及具有各种访问模式的表的可伸缩性和可管理性运行环境变得尤为重要, SQL server 从 SQL serv ...
- 【转】group by多个字段理解
来源:http://uule.iteye.com/blog/1569262 首先group by 的简单说明: group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使 ...
- 【Oracle经典】132个oracle热门精品资料——下载目录
电子书为网友wglzaj精心整理,这批资料下载量好评率都非常高,广受oracle学习者欢迎.文档共整理了12个精品专题和120个热门资料的下载地址,推荐给大家希望大家喜欢. 目录0豆下载地址:http ...
- LeetCode 101. Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...