You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.6 KiB
Java

package com.yinuo.library.vlc;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.opengl.EGL14;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.yinuo.library.vlc.encoder.BaseMovieEncoder;
import com.yinuo.library.vlc.encoder.CameraHelper;
import com.yinuo.library.vlc.encoder.MovieEncoder1;
import com.yinuo.library.vlc.utils.BitmapUtil;
import com.yinuo.library.vlc.utils.LogUtils;
import java.io.File;
import java.nio.ByteBuffer;
/**
* Created by liwentian on 2017/10/12.
*/
public class RtspSurfaceRender2 implements RtspHelper.RtspCallback {
private final SurfaceView mSurfaceView;
private String mRtspUrl;
private BaseMovieEncoder mVideoEncoder;
private final Object mBitmapLock = new Object();
private Bitmap mVideoBitmap = null;
private volatile boolean mIsResumed = false;
private volatile boolean mRecording = false;
// mSurfaceView 渲染线程
Thread renderThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (mIsResumed) {
if (mVideoBitmap != null) {
Canvas canvas = mSurfaceView.getHolder().lockCanvas();
if (canvas != null) {
synchronized (mBitmapLock) {
canvas.drawBitmap(mVideoBitmap, null, new Rect(0, 0, canvas.getWidth(), canvas.getHeight()), null);
}
mSurfaceView.getHolder().unlockCanvasAndPost(canvas);
try {
Thread.sleep(25);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
}
});
public RtspSurfaceRender2(SurfaceView surfaceView) {
mSurfaceView = surfaceView;
SurfaceHolder holder = mSurfaceView.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
LogUtils.v(String.format("onSurfaceChanged: width = %d, height = %d", width, height));
if (mVideoEncoder == null) {
LogUtils.v("init");
mVideoEncoder = new MovieEncoder1(mSurfaceView.getContext(), width, height);
mVideoBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
RtspHelper.getInstance().createPlayer(mRtspUrl, width, height, RtspSurfaceRender2.this);
renderThread.start();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
}
public void setRtspUrl(String url) {
mRtspUrl = url;
}
public void startRecording() {
mSurfaceView.post(() -> {
if (!mVideoEncoder.isRecording()) {
File output = CameraHelper.getOutputMediaFile(CameraHelper.MEDIA_TYPE_VIDEO, "");
LogUtils.v(String.format("startRecording: %s", output));
mVideoEncoder.startRecording(new BaseMovieEncoder.EncoderConfig(output, EGL14.eglGetCurrentContext()));
mRecording = true;
}
});
}
public void stopRecording() {
mSurfaceView.post(() -> {
if (mVideoEncoder.isRecording()) {
mVideoEncoder.stopRecording();
mRecording = false;
}
});
}
public void onDestoryed() {
stopRecording();
RtspHelper.getInstance().releasePlayer();
}
@Override
public void onPreviewFrame(final ByteBuffer buffer, int width, int height) {
synchronized (mBitmapLock) {
Bitmap overLayBitmap = TxtOverlay.INSTANCE.getOverlayBitmap();
mVideoBitmap.copyPixelsFromBuffer(buffer.position(0));
if (overLayBitmap != null) {
mVideoBitmap = BitmapUtil.mergeBitmap(mVideoBitmap, overLayBitmap);
buffer.clear();
mVideoBitmap.copyPixelsToBuffer(buffer);
}
mVideoEncoder.frameAvailable(buffer.array(), System.nanoTime());
}
}
public void onResume() {
this.mIsResumed = true;
}
public void onPause() {
this.mIsResumed = false;
}
}