首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android读取视频文件解决方法

2012-05-03 
Android读取视频文件在android中怎么读取视频文件呢?读取一个.yuv类型视频文件,并把该文件保存为byte[]类

Android读取视频文件
在android中怎么读取视频文件呢?读取一个.yuv类型视频文件,并把该文件保存为byte[]类型的;
我用的方法出现 Out of Memoryerror错误;
代码如下:

Java code
public static byte[] getByetsFromFile(File file) {byte[]buffer = null;ByteArrayOutputStream bos =null;try{ FileInputStream fis = new FileInputStream(file);bos=new ByteArrayOutputStream();buffer = new byte[1024];int length = 0;while((length = fis.read(buffer))!= -1){bos.write(buffer, 0, length);} fis.close();bos.close(); return bos.toByteArray();//字节流转换为一个 byte数组

然后采用byte[] yuv = getByetsFromFile(new File("sdcard/foreman.yuv"));  
请问大家该如何修改呢?

[解决办法]
就是buffer开的太大了,分批来不要一次取完
以你这算法,就算10M能取,那100M、1G、10G呢,再好的配置也会有撑爆的一天
[解决办法]
ByteArrayOutputStream 这个的问题 你看下api,你从buffer 读出来,又写的buffer中了 造成了死循环
[解决办法]
假设test.yuv保存的是320*240的yuyv格式数据,现在要将其转换为RGB565并显示到界面:

public void PlayYUVYFile()
{
int readCount=0; //已经从YUYV读取的次数
int frameCountPerTime=2;//每次读取的帧数,考虑YUYV的数据排列方式,每次读取2或2的倍数帧比较好处理

byte[] buffYUYV = new byte[1024];

File file = new File("/mnt/sdcard/test.YUV");
int length=0;
do
{
length= getByetsFromYUYVFile(file,buffYUYV,readCount,frameCountPerTime);//读取了2帧的YUV数据

byte[] buffRGB565= ConvertYUYVToRGB565(buffYUYV,frameCountPerTime);//转换后得到2帧的RGB565数据

for(int i=0;i<frameCountPerTime;i++)
{
// 将每帧的RGB565数据绘制到界面
}

readCount++;
}while(length==frameCountPerTime*2);

}

private byte[] ConvertYUYVToRGB565(byte[] buffYUYV,int frameCountPerTime)
{
byte[] buffRGB565=null;
// 将YUYV的数据转换为GRB565
// 返回GRB565数据
return buffRGB565;
}

private int getByetsFromYUYVFile(File file,byte[] buffer,int readCount,int frameCountPerTime) {

int length = 0;
FileInputStream fis =null;

try
{
fis = new FileInputStream(file);
length=fis.read(buffer, readCount*320*240*2*frameCountPerTime, 2*frameCountPerTime);
fis.close();
}
catch(Exception ex)
{
//to do
}

return length;
}

热点排行