RTSP-Server
RTSP-Server copied to clipboard
Double RTSP Stream
Hi Pedro,
I am confused. Where do you put video frame for feed video media codec? I can't get the structure. I am using Camera2API Can you help me?
I want to change structure. Because I need double stream. One stream is high resolution and other stream is low resolution. I don't want to use two Video Encoder. It needs too much CPU. So, I will change structure a little simpler. Like
private final ImageReader.OnImageAvailableListener mOnGetPreviewListener = reader -> {
Object[] objects = measureFPS.initFPSNew(imageReaderLogFile,"Measure fps in ImageReader --> ", frameTime, frameCount, TAG);
frameTime=(long)objects[0];
frameCount=(int)objects[1];
Image image = reader.acquireLatestImage();
if (image == null){
Log.i(TAG, "image is null: ");
}
else{
final Image.Plane[] planes = image.getPlanes();
Image.Plane yPlane = planes[0];
Image.Plane uPlane = planes[1];
Image.Plane vPlane = planes[2];
byte[] mBuffer
= yuvToBuffer(yPlane.getBuffer(),
uPlane.getBuffer(),
vPlane.getBuffer(),
yPlane.getPixelStride(),
yPlane.getRowStride(),
uPlane.getPixelStride(),
uPlane.getRowStride(),
vPlane.getPixelStride(),
vPlane.getRowStride(),
image.getWidth(),
image.getHeight());
image.close();
if(mStreaming){
if (initInputBuffers){
Log.i(TAG, "imagereader: init successful");
inputBuffers = mMediaCodec.getInputBuffers();
initInputBuffers =false;
}
long now = System.nanoTime() / 1000;
int bufferIndex = mMediaCodec.dequeueInputBuffer(RtspServerActivity.globalBitrate);
if (bufferIndex >= 0) {
inputBuffers[bufferIndex].clear();
int min = Math.min(inputBuffers[bufferIndex].capacity(), mBuffer.length);
inputBuffers[bufferIndex].put(mBuffer, 0, min);
mMediaCodec.queueInputBuffer(bufferIndex, 0, inputBuffers[bufferIndex].position(), now, 0);
} else {
mMediaCodec.queueInputBuffer(bufferIndex, 0, 0, 0, 0);
Log.e(TAG, "No buffer available from MediaCodec!");
}
if (initPacketizer){
Log.i(TAG, "imagereader: packetizer started");
mPacketizer.setInputStream(new MediaCodecInputStream(mMediaCodec, videoFrames));
mPacketizer.start();
initPacketizer = false;
}
}
}
};