Page 1 of 2

CPU usage

Posted: Thu Apr 07, 2022 6:06 am
by Spartak86
Hello.

When using the component, the following situation arose: when starting the rtsp video stream, the computer processor load increases to 100%, and, as a result, the video stream slows down, and recording, respectively, also slows down, even when starting one camera. The picture shows the task managers when the TRVCamera and TPasLibVlcPlayer components are working: TRVCamera - loads the computer processor, TPasLibVlcPlayer uses a graphics processor, the video does not slow down. Somehow it is possible to solve this issue, to make the TRVCamera component use a GPU?

And at the same time, the question is: is it possible to record an rtsp video stream without running stream, that is, without executing the RVCamera1.PlayVideoStream command?
Thanks.

Re: CPU usage

Posted: Thu Apr 07, 2022 7:43 am
by Sergey Tkachenko
Is this TRVCamera linked with TRVCamView or TRVCamMultiView?
If yes, try to disconnect them and check CPU usage.
Probably, most of this CPU usage comes from TBitmap stretch drawing.

Re: CPU usage

Posted: Thu Apr 07, 2022 7:57 am
by Spartak86
Tried two ways:

1 way

Code: Select all

RVCamera := TRVCamera.Create(Form1);
  RVCamera.URL := ListCams.Lines[Count];
  RVCamera.OnStartVideoStream := RVCameraStartVideoStream;
  RVCamera.Name := 'Cam' + IntToStr(Count);
  RVCamera.Tag := Count;

  RVCamSender.VideoSource := RVCamera;
  RVCamera.PlayVideoStream;
2 way

Code: Select all

RVCamera := TRVCamera.Create(Form1);
  RVCamera.URL := ListCams.Lines[Count];
  RVCamera.OnStartVideoStream := RVCameraStartVideoStream;
  RVCamera.Name := 'Cam' + IntToStr(Count);
  RVCamera.Tag := Count;
  
  vCam := TRVCamView.Create(Form1);
  vCam.VideoSource := RVCamera;
  
  RVCamera.PlayVideoStream;
RVCameraStartVideoStream Event

Code: Select all

rCam := TRVCamRecorder.Create(Form1);
    rCam.VideoSource := RVCamReceiver; // RVCamera  in the second case    
    rCam.OutputFileName := 'C:\RecCams\' + (Sender as TRVCamera).Name + '\' +
      'video' + '_' + IntToStr(DateTimeToUnix(Now)) + '.avi';
    rCam.Active := True;
In both cases, the effect is the same

Re: CPU usage

Posted: Thu Apr 07, 2022 8:08 am
by Spartak86
You gave me an idea that seemed to help, I'm going to test it now

vCam := TRVCamView.Create(nil);

Instead of "Form1" "nil"

Thank you very much

Re: CPU usage

Posted: Thu Apr 07, 2022 8:20 am
by Sergey Tkachenko
The Owner parameter of the constructor does not affect performance. The owner simply frees the component when the owner is freed itself.

Try testing without connecting senders and viewers.
Also, to understand what happens, we need to know how video is processed. Depending on the video source and available libraries, it may be played using FFmpeg, GStreamer or internal MJpeg decoding, and very different code is used in these cases.

Re: CPU usage

Posted: Thu Apr 07, 2022 10:24 am
by Spartak86
That's right, changing the Owner parameter didn't help

Video source: "dahua IPC-HFW 2230 S 2" video camera via local network via rtsp stream by link "rtsp://admin:[email protected]/live"

In the folder with the generated "exe" there are "ffmpeg 64bit" libraries

Re: CPU usage

Posted: Thu Apr 07, 2022 12:10 pm
by Sergey Tkachenko
Did you try to run it without displaying or sending video?
I still suppose that the most CPU-consuming operation is scaling of bitmaps when displaying.
In FMX version it must be much faster because performed by DirectX instead of GDI.
In the new version (that I plan to upload soon) there is an option for fast low-quality scaling.

Re: CPU usage

Posted: Thu Apr 07, 2022 12:34 pm
by Spartak86
Sergey Tkachenko wrote: Thu Apr 07, 2022 12:10 pm Did you try to run it without displaying or sending video?
Could you please explain what this means, I don't understand what you're talking about.

If you are talking about creating the TRVCamView component and assigning it the VideoSource RVCamera, then if I don't do this, then empty videoarchive files (5.5 kilobytes) are created for me

Code: Select all

vCam := TRVCamView.Create(nil);
vCam.VideoSource := RVCamera;

Re: CPU usage

Posted: Thu Apr 07, 2022 4:27 pm
by Sergey Tkachenko
You can see a high CPU usage when you recording a video file.

There are 3 processes occur on recording:
- receiving and decoding video
- encoding video
- displaying video

Most probably, only one of them have high CPU usage, so the first thing to understand what's happening is trying to separate these processes.
To do it, you can try to implement:
- "playing" video stream in TRVCamera without displaying it in TRVCamView and without recording it in TRVCamRecorder
- playing video stream in TRVCamera without displaying it in TRVCamView but with recording it in TRVCamRecorder
- playing video stream in TRVCamera displaying it in TRVCamView but without recording it in TRVCamRecorder

Re: CPU usage

Posted: Fri Apr 08, 2022 5:35 am
by Spartak86
Thanks for the explanation

I have done the following tests (I run 8 video threads):

1.

Code: Select all

RVCamera := TRVCamera.Create(nil);
RVCamera.URL := ListCams.Lines[Count];
RVCamera.PlayVideoStream;
Result: CPU usage increased ~15-20%. That is, it works well

2.

Code: Select all

procedure TForm1.CreateCam(Count: integer);
var
  RVCamera: TRVCamera;
Begin
  RVCamera := TRVCamera.Create(Form1);
  RVCamera.URL := ListCams.Lines[Count];
  RVCamera.OnStartVideoStream := RVCameraStartVideoStream;
  RVCamera.PlayVideoStream;
End;

procedure TForm1.RVCameraStartVideoStream(Sender: TObject);
var
  rCam: TRVCamRecorder;
begin
    rCam := TRVCamRecorder.Create(Form1);
    rCam.VideoSource := (Sender as TRVCamera);
    rCam.OutputFileName := 'C:\RecCams\' + (Sender as TRVCamera).Name + '\' +
      'video' + '_' + IntToStr(DateTimeToUnix(Now)) + '.avi';
    rCam.Active := true;
end;
Result: CPU usage increased ~15-20% (as in the previous test). That is, it works well

3.

Code: Select all

RVCamera := TRVCamera.Create(Form1);
  RVCamera.URL := ListCams.Lines[Count];
  vCam := TRVCamView.Create(nil);
  vCam.VideoSource := RVCamera;
  RVCamera.PlayVideoStream;
Result: CPU usage increased ~50%.

ps. With the increase in the number of threads, the load is also growing.

When all components are activated, even when running four threads, the CPU load is 100%

Re: CPU usage

Posted: Fri Apr 08, 2022 7:13 am
by Sergey Tkachenko
So, as thought, the CPU usage mostly comes from displaying.
And I quite sure, it is because of drawing bitmap using StretchDraw in half-tone mode.
Most probably, if you set vCam.ViewMode = vvmCenter, CPU usage will be lower.
In the new version, there will be an option to use non-half-tone StretchDraw which is faster and uses less CPU resources.
There are also options to change video rendering to OpenGL and DirectX, but currently they are deprecated - they will be restored and reworked in future updates.

About recording. Some property setting may lower CPU usage. For example, check, do you really need 25 frames per second? If not, you can lower rCam.VideoFramePerSec value.

Re: CPU usage

Posted: Fri Apr 08, 2022 8:10 am
by Spartak86
Thank you very much for the advice, I will play with different recording parameters
I am waiting for updates on this problem, please let me know if you partially or completely solve this problem
I hope I have provided you with information for reflection.

Re: CPU usage

Posted: Wed Aug 10, 2022 12:45 am
by ssli1133
I opened the 9rtsp video at the same time, and the CPU occupies my computer. I optimized it according to my own method, but it was still full. However, the CPU usage of VLC Midea playback is very low.

Re: CPU usage

Posted: Wed Aug 10, 2022 12:47 am
by ssli1133
More than 4 link CPU are occupied

Re: CPU usage

Posted: Wed Aug 10, 2022 5:45 am
by ssli1133
I looked at the Windows Explorer, and the program did not use the GPU for decoding, so the CPU usage was high.