使用SurfaceView播放RGB原始视频-2015.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显示RGB565数据图像

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

时间: 2024-09-30 19:36:59

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

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

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例

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

本文接着上一篇文章继续记录Direct3D(简称D3D)播放视频的技术.上一篇文章中已经记录了使用Direct3D中的Surface渲染视频的技术.本文记录一种稍微复杂但是更加灵活的渲染视频的方式:使用Direct3D中的Texture(纹理)渲染视频. 纹理有关的基础知识 在记录使用Direct3D的Texture渲染视频的技术之前,首先记录一下有关纹理的基础知识.我自己归纳总结了以下几点知识. 1. 渲染(Render),纹理(Texture) 刚开始学习Direct3D显示视频技术的人一定

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

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例

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

本文记录OpenGL播放视频的技术.OpenGL是一个和Direct3D同一层面的技术.相比于Direct3D,OpenGL具有跨平台的优势.尽管在游戏领域,DirectX的影响力已渐渐超越OpenGL并被大多数PC游戏开发商所采用,但在专业高端绘图领域,OpenGL因为色彩准确,仍然是不能被取代的主角. OpenGL简介 从网上搜集了一些有关OpenGL简介方面的知识,在这里列出来.开放图形库(英语:Open Graphics Library,缩写为OpenGL)是个定义了一个跨编程语言.跨平

Android SurfaceView + MediaPlayer实现分段视频无缝播放

Android当中实现视频播放的方式有两种,即:通过VideoView实现或者通过SurfaceView + MediaPlayer实现. 由浅至深,首先来看下想要在Android上播放一段视频,我们应当怎么做. 前面我们已经提到了两种方式,这里我们来看一下具有更好的拓展性的第二种方式,也就是通过SurfaceView + MediaPlayer进行实现. 首先,我们来定义一个布局文件如下,为了方便起见,我们仅仅只在该布局中定义了一个SurfaceView: <?xml version="

Android SurfaceView播放视频

先来介绍一下大部分软件如何解析一段视频流.首先它需要先确定视频的格式,这个和解码相关, 不同的格式视频编码不同,不是这里的重点.知道了视频的编码格式后,再通过编码格式进行解码,最后得到一帧一帧的图像,并把这些图像快速的显示在界面上, 即为播放一段视频.SurfaceView在Android中就是完成这个功能的. IBM POWER8通过一年充分融入了"开放"基因,现在有哪些成效?快来注册观看直播,一起拥抱开源的力量. --> SurfaceView 先来介绍一下大部分软件如何解析

Android开发之MediaPlayer和SurfaceView播放视频

使用MediaPlayer出了了可以播放音频之外,还可以播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图像输出界面.可以使用SurfaceView组件来显示视频图像.使用MediaPlayer和SurfaceView播放视频大致可以分为如下四个步骤: 1)定义SurfaceView组件.最好在布局文件中实现. 2)创建MediaPlayer对象,并为其加载要播放的视频. 3)将所播放的视频画面输出到SurfaceView中.使用MediaPlayer对象的setDisplay

Android播放器实现视频窗口实时放大缩小功能

很多开发者希望Android播放端实现视频窗口的放大缩小功能,为此,我们做了个简单的demo,通过播放端回调RGB数据,直接在上层view操作处理即可,Github:https://github.com/daniulive/SmarterStreaming 无视频无真相:http://www.iqiyi.com/w_19s9sa7epp.html 基本流程如下: 1. 基础的初始化和参数设定 libPlayer = new SmartPlayerJniV2(); myContext = this

embed标签的使用(在网页中播放各种音频视频的插件的使用)

embed标签的使用(在网页中播放各种音频视频的插件的使用) 链接地址:http://blog.csdn.net/TomyGuan/archive/2006/11/10/1377807.aspx 播放器插件使用说明: 代码:< EMBED src="music.mid"autostart="true"loop="2"width="80"height="30"> src:音乐文件的路径及文件名:(