问题如标题所示,不知道问题出在那里,能正常出数据,但是画面就是没有,请各位大神指点迷津

代码如下

package com.jiechu.wnd.sl;

import android.content.Context;

import android.graphics.ImageFormat;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.util.Log;

import android.view.MotionEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import java.io.IOException;

import java.util.List;

/**

* Created by zhuyt on 2016/10/20.

*/

public class LiveStreamDisplay extends SurfaceView implements SurfaceHolder.Callback,View.OnTouchListener{

private static String TAG = LiveStreamDisplay.class.getSimpleName();

Camera mCamInance=null;

Camera.Parameters mCamPmr = null;

PreviewAction mAction;

SurfaceHolder mHolder;

int displayWidth = 360;

int displayHeight = 480;

int current_width;

int current_height;

double iAspectRatio = 3.0/3.0;//设备宽高比

int iDelta = 0x7FFFFF;

int current_fps = 25;

int current_rate;

int current_camera = Camera.CameraInfo.CAMERA_FACING_BACK;

String current_video_encode = "H264";

boolean isPreview=false;

long mTimestampBegin=0;

long mTimestampRec=0;

int current_picture_format = ImageFormat.NV21;

List mSupportPreviewSizes;

List mSupportPreviewFPSRanges;

private byte[] mYuvDataBuff;

int iYuvBuffSize = 0;

public LiveStreamDisplay(Context context,int pCamNum,int iWidth,int iHeight) {

super(context);

current_camera = pCamNum>=0?pCamNum: Camera.CameraInfo.CAMERA_FACING_BACK;

displayWidth = iWidth>0?iWidth:displayWidth;

displayHeight = iHeight>0?iHeight:displayHeight;

mHolder = getHolder();

initTouchView();

}

public void initCamera(int pCamNum,PreviewAction pPA){

if(mCamInance==null){

if (pPA!=null && pPA instanceof PreviewAction){

mAction = pPA;

}

current_camera = pCamNum>=0?pCamNum: Camera.CameraInfo.CAMERA_FACING_BACK;

mCamInance = Camera.open(current_camera);

mCamPmr = mCamInance.getParameters();

List tpFormat = mCamPmr.getSupportedPreviewFormats();

if(tpFormat.contains(ImageFormat.NV21)){

mCamPmr.setPreviewFormat(ImageFormat.NV21);

}else{

Log.e(TAG, "initCamera: Camera not support NV21 format data!");

try {

throw new Throwable("Camera not support NV21 format data");

} catch (Throwable throwable) {

throwable.printStackTrace();

}

}

if (tpFormat.contains(ImageFormat.JPEG)){

mCamPmr.setPictureFormat(ImageFormat.JPEG);

}

//找到手机支持的最大的分辨率,并赋值

mSupportPreviewSizes = mCamPmr.getSupportedPreviewSizes();

Camera.Size temp=null;

for (Camera.Size s:mSupportPreviewSizes){

//寻找投备支持最大宽高

/*if(temp==null){

temp = s;

}else{

if(s.width>temp.width){

temp = s;

}

}*/

//寻找设备最合适宽高

Log.e(TAG, "initCamera: current element:[W]:"+s.width+" [H]:"+s.height);

if (Math.abs(current_width-displayWidth)

iDelta = Math.abs(current_width-displayHeight);

temp = s;

}

}

current_width = temp.width;

current_height = temp.height;

mCamPmr.setPreviewSize(current_width,current_height);

//mCamPmr.setPictureSize(current_width,current_height);

temp=null;

//寻找最合适设备的帧率

int[] tempFPS;

mSupportPreviewFPSRanges = mCamPmr.getSupportedPreviewFpsRange();

for(int[] mi:mSupportPreviewFPSRanges){

Log.e(TAG, "initCamera: FPSRange:min["+mi[0]+"] max["+mi[1]+"]");

//还没有赋值到实际的相机参数中去.需要注意

//mCamPmr.setPreviewFpsRange((int)(mi[0]/1000),(int)(mi[1]/1000));

}

mCamInance.setParameters(mCamPmr);

iAspectRatio = current_width/current_height;

iYuvBuffSize = current_width*current_height*3/2;

mYuvDataBuff = new byte[iYuvBuffSize];

Log.e(TAG, "initCamera: Test Debug 1");

mCamInance.addCallbackBuffer(mYuvDataBuff);

Log.e(TAG, "initCamera: Test Debug 2");

mCamInance.setPreviewCallback(new LivePreivewCallback());

Log.e(TAG, "initCamera: Test Debug 3");

mCamInance.setDisplayOrientation(90);

try {

mCamInance.setPreviewDisplay(mHolder);

} catch (IOException e) {

e.printStackTrace();

}

setOnTouchListener(this);

//requestLayout();

mCamInance.startPreview();

isPreview=true;

mTimestampBegin = System.currentTimeMillis();

}else{

Log.e(TAG, "initCamera: Camera Instance had exists!");

}

}

public void release(){

mCamInance.stopPreview();

mCamInance.setPreviewCallback(null);

try {

mCamInance.setPreviewDisplay(null);

} catch (IOException e) {

e.printStackTrace();

}

mYuvDataBuff = null;

mCamInance.release();

isPreview=false;

}

public void setAction(PreviewAction pPa){

if(null==pPa)return;

mAction = pPa;

}

//设置点击屏幕进行对焦

void initTouchView(){

this.setFocusable(true);

this.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View view, MotionEvent motionEvent) {

mCamInance.autoFocus(null);

return false;

}

});

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

//initCamera(current_camera,mAction);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

release();

initCamera(current_camera,mAction);

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

//release();

}

@Override

public boolean onTouch(View v, MotionEvent event) {

Log.e(TAG, "onTouch: Camera AutoFoucs!");

mCamInance.autoFocus(null);

return false;

}

class LivePreivewCallback implements Camera.PreviewCallback{

@Override

public void onPreviewFrame(byte[] data, Camera camera) {

mTimestampRec = System.currentTimeMillis();

if (data==null){

Log.e(TAG, "onPreviewFrame: undefined video data!");

}else{

if (mAction!=null && data.length==iYuvBuffSize && mAction instanceof PreviewAction){

Log.e(TAG, "onPreviewFrame: find video data & call doTakeVideo[length:"+data.length+"]!");

mAction.doTakeVideo(mYuvDataBuff,mYuvDataBuff.length);

}else{

Log.e(TAG, "onPreviewFrame: find video data but else error!");

}

}

mCamInance.addCallbackBuffer(mYuvDataBuff);

}

}

//根据传入的宽高值,重新计算VIEW的宽高并应用

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int tpWidth = MeasureSpec.getSize(widthMeasureSpec);

int tpHeight = MeasureSpec.getSize(heightMeasureSpec);

if (tpWidth>tpHeight*iAspectRatio){

tpWidth = (int)(tpHeight*iAspectRatio+.5);

}else{

tpHeight = (int)(tpWidth/iAspectRatio+.5);

}

Log.e(TAG, "onMeasure: reconstructed!");

super.onMeasure(MeasureSpec.makeMeasureSpec(tpWidth,MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(tpHeight,MeasureSpec.EXACTLY));

}

public interface PreviewAction{

void doTakePicture();

void doTakeVideo(byte[] data,int length);

}

}

调用如下

Display mDisplay = getWindowManager().getDefaultDisplay();

DisplayMetrics mDet=new DisplayMetrics();

mDisplay.getMetrics(mDet);

mLSD = new LiveStreamDisplay(getApplicationContext(), Camera.CameraInfo.CAMERA_FACING_BACK,mDet.widthPixels,mDet.heightPixels);

...

addContentView(mLSD,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

mLSD.initCamera(0,new LiveStreamDisplay.PreviewAction() {

@Override

public void doTakePicture() {

}

@Override

public void doTakeVideo(byte[] data, int length) {

Log.e(TAG, "doTakeVideo: get video data!");

}

});

这是输出

10-20 13:30:11.336 5970-5970/com.jiechu.wnd.lv E/LiveStreamDisplay: onPreviewFrame: find video data & call doTakeVideo[length:1382400]!

10-20 13:30:11.336 5970-5970/com.jiechu.wnd.lv E/MainActivity: doTakeVideo: get video data!

10-20 13:30:11.337 5970-5970/com.jiechu.wnd.lv D/Camera-JNI: Adding callback buffer to queue, 1 total

10-20 13:30:11.448 5970-6053/com.jiechu.wnd.lv D/Camera-JNI: Allocating callback buffer

10-20 13:30:11.484 5970-6053/com.jiechu.wnd.lv D/dalvikvm: GC_FOR_ALLOC freed 1350K (10), 17% free 14810K/17632K, paused 36ms, total 36ms

10-20 13:30:11.489 5970-5970/com.jiechu.wnd.lv I/CameraFramework: handleMessage: 16

10-20 13:30:11.489 5970-5970/com.jiechu.wnd.lv D/Camera-JNI: setHasPreviewCallback: installed:1, manualBuffer:0

10-20 13:30:11.491 5970-5970/com.jiechu.wnd.lv E/LiveStreamDisplay: onPreviewFrame: find video data & call doTakeVideo[length:1382400]!

10-20 13:30:11.491 5970-5970/com.jiechu.wnd.lv E/MainActivity: doTakeVideo: get video data!

10-20 13:30:11.491 5970-5970/com.jiechu.wnd.lv D/Camera-JNI: Adding callback buffer to queue, 1 total

10-20 13:30:11.609 5970-5983/com.jiechu.wnd.lv D/Camera-JNI: Allocating callback buffer

camera android 黑屏,Android Camera.startPreview()启动未报错,但SurfaceView无画面输出相关推荐

  1. python运行时黑屏什么原因_pygame 程序未报错却黑屏无法显示 请问有大佬知道解决方法吗...

    修改如下, 说明在每行右边的批注 import pygame import sys # set everything to where started pygame.init() size = wid ...

  2. win7 php乱码,打开网站php出现乱码问题的解决办法nsiserror解决办法win7黑屏解决办法龙之谷报错解决办...

    问题:用浏览器打开写好的php文件,然后发现中文字符显示为问号,网站显示不正常 原因:出现乱码的问题的原因是数据库,浏览器和php文件采用的编码方式不相同 解决办法: 1.浏览器编码方式修改:(以谷歌 ...

  3. android studio模拟手机黑屏,Android Studio 模拟器启动问题——黑屏 死机 解决方法...

    今天用了下Android Studio,出现了一些问题,现在将启动过程中遇到的问题和解决方案列出来,方便大家参考. 安装过程不多说,网上一搜一大把. 那直接说问题吧: 1. 无法启动,报错: Fail ...

  4. android 黑屏定位,如何将黑屏Android修复为正常

    作者:Selena Komez3月03,2017更新 "我的Android手机很长一段时间都变成了黑屏,我对它无能为力,甚至关机.如何修复异常状态?请帮助."-Gigi Andro ...

  5. Android Studio在模拟器启动项目报错

    android studio在模拟器启动项目报错 List of apks: [0] 'D:\Android Project\kotlin-compose-mobile-application\app ...

  6. Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...)

    Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 目录 Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 一.Android s ...

  7. Android(SpreadTurm)多语言版本电话录音系统报错

    Android(SpreadTurm)多语言版本电话录音系统报错 法语,印尼语,士耳其 [原因:] 从log里面分析com.android.phone进程重启. 如下log分析: 11-20 17:2 ...

  8. myeclipse启动php,myeclipse,jdk_启动myeclipse报错,myeclipse,jdk - phpStudy

    启动myeclipse报错 清理了系统垃圾之后myeclipse启动不起来了,并且在myeclipse目录下面产生了错误日志文件,文件内容: # # An unexpected error has b ...

  9. RK3588在SSH上启动OpenCV报错:Can‘t initialize GTK backend in function ‘cvInitSystem‘

    RK3588在SSH上启动OpenCV报错:Can't initialize GTK backend in function 'cvInitSystem' 1.问题 2.参考资料 3.解决 2023- ...

最新文章

  1. 搭建Docker私有仓库--自签名方式
  2. C++ 继承Employee类
  3. 华为p4支持鸿蒙功能吗_华为鸿蒙系统可以用了,支持这四款手机,看看有你的吗?...
  4. 关于进程和线程以及句柄
  5. PHP操作使用Redis
  6. linux centos 编译Lua5.2.0 静态库 动态库
  7. 如何在VB中实现ActiveX控件的IobjectSafety接口
  8. 71. Simplify Path
  9. python 路径拼接_python路径拼接os.path.join()函数的用法
  10. GPRS模块SIM900A怎么用
  11. 什么是场景化需求分析法?如何有效使用这个客户需求分析最有效的方法?
  12. 【信息收集】渗透测试信息收集的种类及方法(待拆分细化)
  13. 使用quartz 定时任务
  14. codeblocks 编译器设置方法 也可以酱紫滴
  15. 硬核蹭热点系列:负油价和巴舍利耶模型
  16. java 龙卷风_java8-lamba表达式的使用-遁地龙卷风
  17. K8S系列:Pod 的恢复策略restartPolicy
  18. 【C语言】—— qsort()函数的使用
  19. Qt串口等接口数据协议传输时的字节拼接处理
  20. stm32h743单片机嵌入式学习笔记4-文件系统FATFS

热门文章

  1. SAP License:美资企业、台资企业和国企的区别
  2. SAP License:GR与IR
  3. 信贷ABS资产静态池与动态池里的数据分析内容都有啥
  4. asp.net core mvc 管道之中间件
  5. Apache2.4使用require指令进行访问控制--允许或限制IP访问/通过User-Agent禁止不友好网络爬虫...
  6. pdf转html插件~~~pdf2htmlEX安装,配置及使用
  7. 怎样计算一个整数的位数并把每一位上的数字保存下来
  8. swfupload添加上传进度条(转)
  9. C++库研究笔记——Linux下是否需要使用memory pool?
  10. BIEE配置多个实例(BIEE Multiple Instance)