You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.3 KiB
151 lines
4.3 KiB
package com.frank.live.stream;
|
|
|
|
import android.app.Activity;
|
|
import android.content.Context;
|
|
import android.graphics.Point;
|
|
import android.graphics.SurfaceTexture;
|
|
import android.util.Log;
|
|
import android.util.Size;
|
|
import android.view.SurfaceHolder;
|
|
import android.view.TextureView;
|
|
|
|
import com.frank.live.LivePusherNew;
|
|
import com.frank.live.camera2.Camera2Helper;
|
|
import com.frank.live.camera2.Camera2Listener;
|
|
import com.frank.live.param.VideoParam;
|
|
|
|
/**
|
|
* 视频推流:使用Camera2
|
|
* Created by frank on 2020/02/12.
|
|
*/
|
|
public class VideoStreamNew implements TextureView.SurfaceTextureListener, Camera2Listener {
|
|
|
|
private static final String TAG = VideoStreamNew.class.getSimpleName();
|
|
|
|
private LivePusherNew mLivePusher;
|
|
private Camera2Helper camera2Helper;
|
|
private boolean isLiving;
|
|
private TextureView mTextureView;
|
|
private Context mContext;
|
|
private VideoParam mVideoParam;
|
|
|
|
public VideoStreamNew(LivePusherNew livePusher, TextureView textureView, VideoParam videoParam, Context context) {
|
|
this.mLivePusher = livePusher;
|
|
this.mTextureView = textureView;
|
|
this.mVideoParam = videoParam;
|
|
this.mContext = context;
|
|
mTextureView.setSurfaceTextureListener(this);
|
|
}
|
|
|
|
public void setPreviewDisplay(SurfaceHolder surfaceHolder) {
|
|
// cameraHelper.setPreviewDisplay(surfaceHolder);
|
|
}
|
|
|
|
/**
|
|
* 开始预览
|
|
*/
|
|
private void startPreview() {
|
|
int rotateDegree = 0;
|
|
if (mContext instanceof Activity) {
|
|
rotateDegree = ((Activity) mContext).getWindowManager().getDefaultDisplay().getRotation();
|
|
}
|
|
Log.e(TAG, "preview width=" + mTextureView.getWidth() + "--height=" + mTextureView.getHeight());
|
|
camera2Helper = new Camera2Helper.Builder()
|
|
.cameraListener(this)
|
|
.specificCameraId(Camera2Helper.CAMERA_ID_BACK)
|
|
.context(mContext.getApplicationContext())
|
|
.previewOn(mTextureView)
|
|
// .previewViewSize(new Point(mTextureView.getWidth(), mTextureView.getHeight()))
|
|
.previewViewSize(new Point(mVideoParam.getWidth(), mVideoParam.getHeight()))
|
|
.rotation(rotateDegree)
|
|
.build();
|
|
camera2Helper.start();
|
|
}
|
|
|
|
public void switchCamera() {
|
|
if (camera2Helper != null) {
|
|
camera2Helper.switchCamera();
|
|
}
|
|
}
|
|
|
|
public void startLive() {
|
|
isLiving = true;
|
|
}
|
|
|
|
public void stopLive() {
|
|
isLiving = false;
|
|
}
|
|
|
|
public void release() {
|
|
if (camera2Helper != null) {
|
|
camera2Helper.stop();
|
|
camera2Helper.release();
|
|
camera2Helper = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 停止预览
|
|
*/
|
|
private void stopPreview() {
|
|
if (camera2Helper != null) {
|
|
camera2Helper.stop();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
|
|
Log.e(TAG, "onSurfaceTextureAvailable...");
|
|
startPreview();
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
|
|
Log.e(TAG, "onSurfaceTextureDestroyed...");
|
|
stopPreview();
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
|
|
|
|
}
|
|
|
|
/**
|
|
* nv21摄像头数据
|
|
* @param y plane of y
|
|
* @param u plane of u
|
|
* @param v plane of v
|
|
*/
|
|
@Override
|
|
public void onPreviewFrame(byte[] y, byte[] u, byte[] v) {
|
|
if (isLiving && mLivePusher != null) {
|
|
mLivePusher.pushVideo(y, u, v);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onCameraOpened(Size previewSize, int displayOrientation) {
|
|
Log.e(TAG, "onCameraOpened previewSize=" + previewSize.toString());
|
|
if (mLivePusher != null && mVideoParam != null) {
|
|
mLivePusher.setVideoCodecInfo(previewSize.getWidth(), previewSize.getHeight(),
|
|
mVideoParam.getFrameRate(), mVideoParam.getBitRate());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onCameraClosed() {
|
|
Log.e(TAG, "onCameraClosed");
|
|
}
|
|
|
|
@Override
|
|
public void onCameraError(Exception e) {
|
|
Log.e(TAG, "onCameraError=" + e.toString());
|
|
}
|
|
|
|
}
|
|
|