安卓用ffmepg软解h264码流时花屏是什么原因

Sourcew 2014-08-20 02:39:41

package com.zhutieju.testservice;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;

/**
* 服务端主Activity
*
* @author Administrator
*
*/
public class MainActivity extends Activity {
public static final String TAG = "服务端日志";
//ServerThread thread;
ReadFileThread thread;
boolean isActivity = true;// 控制线程ServerThread的run方法
long decoder;
H264Android h264;
byte[] mPixel = new byte[1280 * 720*10];
ByteBuffer buffer = ByteBuffer.wrap(mPixel);
public static ArrayList<byte[]> framebuf = new ArrayList<byte[]>();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
h264 = new H264Android();
decoder = h264.initDecoder(1280,720);
int i = mPixel.length;
for (i = 0; i < mPixel.length; i++) {
mPixel[i] = (byte) 0x00;
}
//thread = new ServerThread();
thread = new ReadFileThread();
thread.start();
new Thread(new DecordeThread()).start();
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (thread.isAlive()) {
isActivity = false;
}
finish();
System.exit(0);
}



/**
* 读取文件类
* @author Administrator
*
*/
public class ReadFileThread extends Thread {
int file_index = 0;
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/movies/RecordH264.h264");
@Override
public void run() {
try {
while(file_index<file.length()) {
byte[] data = new byte[1024*50];
RandomAccessFile raf = new RandomAccessFile(file, "r");
int len = readOneFrame(raf, data);
Log.i(TAG, "一帧长度为:"+len);
byte[] newData = new byte[len];
System.arraycopy(data, 0, newData, 0, len);
//Log.i(TAG, "前四个字节为:"+newData[0]+" "+newData[1]+" "+newData[2]+" "+newData[3]);
setOrget(1, newData);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 读取一帧长度
* @param raf 读取文件流
* @param data 保存读取的数据
* @return 返回一帧长度
* @throws IOException
*/
private int readOneFrame(RandomAccessFile raf,byte[] data) throws IOException {
int len = 0;//表示一帧长度
raf.seek(file_index);
while(true) {
if((data[len++] = raf.readByte())==0 && (data[len++] = raf.readByte())==0 ) {
if((data[len++] = raf.readByte()) < 2 && len>6) {
if(data[len - 1] == 0) {
if((data[len++]=raf.readByte())==1) {
file_index+=(len - 4);
return len - 4;
} else {
continue;
}
} else {
file_index+=(len - 3);
return len - 3;
}
} else {
continue;
}
} else {
continue;
}
}
}
}



/**
* 保存或获取数据
* @param type
* @param data
* @return
*/
public synchronized byte[] setOrget(int type,byte[] data) {
switch (type) {
case 1: //放入数据
framebuf.add(data);
return null;
case 0: //获取数据
if(framebuf.size()>0) {
byte[] b = framebuf.get(0);
framebuf.remove(0);
return b;
}
}
return null;
}



/**
* 解码线程类
* @author Administrator
*
*/
class DecordeThread implements Runnable {
@Override
public void run() {
while(true) {
byte[] dataa = setOrget(0, null);
if (dataa != null&&dataa.length > 0) {//一帧数据收到解码
int resout = h264.dalDecoder(dataa, dataa.length, mPixel);
if(resout>0) {
Bitmap videoBit = Bitmap.createBitmap(1280, 720, Config.RGB_565);
buffer.position(0);//将下一个读写位置置为0
videoBit.copyPixelsFromBuffer(buffer);
Util.setOrgetBitmap(0, videoBit);
Log.i(TAG, "集合中的数据:"+Util.list.size());
}
}
}
}
}

public static String nowTime() {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(new Date().getTime());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return dateFormat.format(c.getTime());
}
}



工程文件:http://url.cn/NXCTMJ
720p的h264文件:http://url.cn/NvcZdM
...全文
361 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
媒体盒子 2014-08-21
  • 打赏
  • 举报
回复
原因很简单,颜色空间不对,你可以看ffmpeg的ffplay程序解码h264数据后都会用sws_scale转化下颜色空间
sagittarius1988 2014-08-20
  • 打赏
  • 举报
回复
好像是描画速度没跟上解码速度?
Sourcew 2014-08-20
  • 打赏
  • 举报
回复
没有大神帮忙吗,自顶一下

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧