parent
a76ce7e52f
commit
94518f18e4
@ -0,0 +1,151 @@ |
||||
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()); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue