pedroSG94 / RTSP-Server

Plugin of rtmp-rtsp-stream-client-java to stream directly to RTSP player.
Apache License 2.0
190 stars 58 forks source link

Double RTSP Stream #86

Open MustafaKollu1975 opened 1 year ago

MustafaKollu1975 commented 1 year ago

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?

MustafaKollu1975 commented 1 year ago

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;

            }
        }
    }
};