Java 如何在Android中渲染YV12视频帧
我从MC67移动设备成像仪获得了YV12视频帧。我想在android surface上显示它。到目前为止我还无法做到 我正在使用以下代码 MainTestActivity.javaJava 如何在Android中渲染YV12视频帧,java,android,Java,Android,我从MC67移动设备成像仪获得了YV12视频帧。我想在android surface上显示它。到目前为止我还无法做到 我正在使用以下代码 MainTestActivity.java public class MainTestActivity extends Activity { protected static final String TAG = "CameraTestApp"; private Camera mCamera; private Preview mPreview; FrameLa
public class MainTestActivity extends Activity {
protected static final String TAG = "CameraTestApp";
private Camera mCamera;
private Preview mPreview;
FrameLayout frmLayoutPreview;
Button btnStart;// Test Start button
Button btnRefreshReport ;//Refresh button
ByteArrayOutputStream out;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(ImageFormat.YV12);
setContentView(R.layout.main);
mCamera= Camera.open(42);
//parameters.setPictureFormat(ImageFormat.YV12);
mPreview = new Preview(this,mCamera);
frmLayoutPreview = (FrameLayout) findViewById(R.id.frmLayoutCameraPreview);
frmLayoutPreview.addView(mPreview);
btnStart = (Button) findViewById(R.id.btnStartTest);
btnStart.setOnClickListener(new OnClickListener () {
public void onClick(View v){
btnStart.setEnabled(false);
mCamera.setPreviewCallback(mPreviewCallback);
mCamera.startPreview();
btnRefreshReport.setEnabled(true);
}
});
btnRefreshReport= (Button) findViewById(R.id.btnRefreshReport);
btnRefreshReport.setOnClickListener(new OnClickListener () {
public void onClick(View v){
mCamera.stopPreview();
btnRefreshReport.setEnabled(false);
btnStart.setEnabled(true);
}
});
btnRefreshReport.setEnabled(false);
btnStart.setEnabled(true);
}
PreviewCallback mPreviewCallback = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
};
@Override
public void onDestroy()
{
super.onDestroy();
this.mCamera.release();
}
}
Preview.java
class Preview extends SurfaceView implements SurfaceHolder.Callback {
public SurfaceHolder mHolder;
private Camera mCamera ;
private String TAG="CAMERA_TEST";
List<Integer> supportformats;//new code
String filename= "/sdcard/BB_FPS.txt";
Preview(Context context,Camera objCamera) {
super(context);
this.mCamera=objCamera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
try
{
mCamera.setPreviewDisplay(holder);
}
catch (Exception e) {
Log.i(TAG, "SurfaceCreated error\t"+e.toString());
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
Log.i(TAG, "SurfaceChanged invoked");
if (mHolder.getSurface() == null)
{
return;
}
try
{
mCamera.stopPreview();
}
catch (Exception e){}
try
{ mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
catch (Exception e)
{
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
类预览扩展了SurfaceView实现了SurfaceHolder.Callback{
公开露面律师;
私人摄像机麦卡梅拉;
私有字符串标记=“摄像机测试”;
列出supportformats;//新代码
字符串filename=“/sdcard/BB_FPS.txt”;
预览(上下文,摄影机对象){
超级(上下文);
this.mCamera=objCamera;
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
}
已创建的公共空白表面(表面持有人){
尝试
{
mCamera.setPreviewDisplay(支架);
}
捕获(例外e){
Log.i(标记“SurfaceCreated error\t”+e.toString());
}
}
公共空间表面覆盖(表面覆盖物持有人)
{
}
公共无效表面更改(表面持有人,整数格式,整数w,整数h)
{
Log.i(标记“SurfaceChanged”);
if(mHolder.getSurface()==null)
{
返回;
}
尝试
{
mCamera.stopPreview();
}
捕获(例外e){}
尝试
{mCamera.setPreviewDisplay(持有者);
mCamera.startPreview();
}
捕获(例外e)
{
Log.d(标记“启动相机预览时出错:”+e.getMessage());
}
}
}
我尝试使用setPictureFormat(ImageFormat.YV12)方法设置图片格式。但它也不起作用。这里有人能帮我一下吗。我也使用库转换为RGB。但我必须一帧一帧地做 谢谢你的回答,我试试看。