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
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;
|
|
}
|
|
}
|