视频直播开篇之camera+TextureSurface预览
今天来讲讲使用camera接口和TextureSurface两个来进行预览
先看xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".camera_texture_activity">
<TextureView
android:id="@+id/preview_textureview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
xml里面就只有一个TextureView,这个就是用来预览的控件。
再看代码的实现:
package com.example.amei.cameraexample;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.TextureView;
public class camera_texture_activity extends AppCompatActivity implements TextureView.SurfaceTextureListener {
private static final String TAG = "cameraTexture";
private TextureView mTextureView = null;
private Camera mCamera = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_texture_activity);
mTextureView = findViewById(R.id.preview_textureview);
mCamera = Camera.open(0);
mTextureView.setSurfaceTextureListener(this);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
try{
mCamera.setPreviewTexture(surfaceTexture);
mCamera.startPreview();
}catch (Exception e)
{
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
mCamera.release();
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
}
}
代码里面首先是实例化camera接口,并且打开camera.设置TextureView的监听,这个监听是为了在合适的时间打开预览以及释放camera.从代码中可以看出在onSurfaceTextureAvailable
里面首先将surfaceture设置给camera,然后再预览。这个和上一篇的suerface的显示很像,在上一篇中是设置SurfaceHolder,最终的目的其实都是将显示的数据画在surface上面。