Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cheina97/screenrecorderqt
Screen capture multiplatform application and library based on FFMPEG and QT
https://github.com/cheina97/screenrecorderqt
Last synced: 2 months ago
JSON representation
Screen capture multiplatform application and library based on FFMPEG and QT
- Host: GitHub
- URL: https://github.com/cheina97/screenrecorderqt
- Owner: cheina97
- License: gpl-3.0
- Created: 2021-05-25T10:23:36.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-08-27T18:13:02.000Z (over 2 years ago)
- Last Synced: 2024-10-11T11:18:37.415Z (3 months ago)
- Language: C++
- Homepage:
- Size: 107 MB
- Stars: 48
- Watchers: 2
- Forks: 12
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Screen Recorder QT
Project for the **PDS** course at the **"Politecnico di Torino"**### Group
- [Francesco Cheinasso](https://github.com/cheina97)
- [Alessandra Comparetto](https://github.com/alessandracomparetto)
- [Alessandro Cannarella](https://github.com/cannarelladev)## About Project
**Screen Recorder QT** is a software based on two components.
- The first is the **ScreenRecorder library**, a multiplatform **C++** library which allow to record the screen and optionally mux the audio recorded by the microphone with the captured video.
- The second is the **QT application**, a **C++ native** frontend based on **QT libraries**, used to interact with the **ScreenRecorder library**.### Screen Recorder Library
This is the **core** of the project. The library is composed by 2 main files **ScreenRecorder.cpp** and **ScreenRecorder.h**. It uses **ffmpeg** libraries to capture the frames (video and audio) , to elaborate them, and to save in a **.mp4** file. Those libraries are **avcodec**, **avdevice**, **avfilter**, **avformat** and **avutil**.
It uses **2 threads** for the **video** recording and an for the **audio**:
- **Video**:
- **Raw Packets Thread**: It get the raw video frames from the **os** virtual device (**x11grab** on Linux, **gdigrab** on Windows and **avFoundation** on macOS) and insert them in a queue.
- **Elaboration Thread**: This take the raw packets from the queue and **decode and encode** it in the new format and **write** them in the output file. It also perform **scaling**.
- **Audio**:
- **Microphone capture thread**: It get the raw audio frames from an **os** virtual device (**alsa** on Linux, **dshow** on Windows and **avFoundation** on macOS) save them in a queue creating **bursts** that are then **elaborated (decode and encode)** and **written** in the output file.Those are the features offered by the library:
- Record **Screen Video** without **microphone audio**
- Record **Screen Video** with **microphone audio**
- **Pause** and **Resume** recording without creating separated files.
- **Compress** the video by a value chosen by the user *( 0 disable compression )*
- **Rescale** the video by a value chosen by the user, between 0.1 and 1 *( 1 means no rescaling, 0.5 half rescaling ).*
- Allows the user to specify the **position and the size** of the portion of screen that have to be recorded, by a value chosen by the user.
- Allows the user to specify the **screen number**.
- Allows the user to specify the screen recording's **fps**, by a value chosen by the user.
- Allows the user to specify an **audio input device** *(the library doesn't find the available devices, it is up to the application )*.
- Allows the user to specify the **output file name** (*it must end with **.mp4*** )
- In case of **internal errors** throws an **exception** with a **description of the error** and gracefully **stop the registration** (if the library is recording), creating the output file with what has been recorded till that moment.### QT Application
Allow to use the **ScreenRecorder library**, offering a **GUI** to set the **parameters** and to give **commands**.
In order to improve the user experience, the **GUI** create also an icon in the os **system tray** to interact with the library without using the main window.
It uses **QTmultimedia** library to find the available **audio devices** on **Windows** and **MacOS**. Instead on **Linux** is used the **getAudioDevices** function ( in getAudioDevices.cpp ), which return only the **input audio devices**.
The dimensions of the screen are retrieved with **QGuiApplication** and a portion of the screen can be selected using the **AreaSelector** ( AreaSelector.cpp ).
#### Screenshots
![Main window](./img/screen.png)
![Main window](./img/video.gif)
### Legacy Applications
**ScreenRecorder library** can be used without the support of the GUI mentioned before. In the "legacy" versions, the user is able to record a video using the terminal window provided by the OS.In this case, it's possible to control the action of the application by pressing the commands
- [1] to pause
- [2] to resume
- [3] to stop## Linux
### How to run (QT application only)
- Download the latest binary from this [link](https://github.com/cheina97/PDS_Project/releases/latest/download/ScreenRecorderQT_linux_amd64)
- Install the required libraries with `sudo apt install ffmpeg qt5-default` (Needs QT 5.15 or higher versions)
- Allow the binary execution with `chmod 777 ScreenRecorder_linux_amd64`
- Run the program with `./ScreenRecorder_linux_amd64`### How to compile, run and install
#### QT application
- Download the required **Qt libraries** `sudo apt install qt5-qmake qtmultimedia5-dev `
- Download the other required libraries and tools `sudo apt install build-essential libasound2-dev libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev`
- Install **c++ 20** `sudo apt install gcc-10 gcc-10-base gcc-10-doc g++-10` `sudo apt install libstdc++-10-dev libstdc++-10-doc`
- Clone the repository `git clone https://github.com/cheina97/ScreenRecorderQT.git`
- Go in the project folder `cd ScreenRecorderQT/ScreenRecorderQT/ScreenRecorderQT`
- Generate the **Makefile** `qmake ScreenRecorderQT.pro`
- Compile it `make clean; make all`
- Allow the **binary** to be executed `chmod 777 ScreenRecorderQT`
- Run it `./ScreenRecorderQT`
- (Optional) Install the **binary** and the **desktop launcher** in your system `sudo make install`. You can revert this operation with `sudo make uninstall`. The **binary** will be installed in **/opt/ScreenRecorderQT/ScreenRecorderQT** and the **desktop launcher** in **/usr/share/applications/ScreenRecorderQT**.#### Legacy application
- Download the required libraries and tools `sudo apt install build-essential libasound2-dev libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev`
- Install **c++ 20** `sudo apt install gcc-10 gcc-10-base gcc-10-doc g++-10` `sudo apt install libstdc++-10-dev libstdc++-10-doc`
- Clone the repository `git clone https://github.com/cheina97/ScreenRecorderQT.git`
- Go in the project folder `cd ScreenRecorderQT/ScreenRecorderLegacy`
- Generate the **Makefile** `qmake ScreenRecorderLegacy.pro`
- Compile it `make clean; make all`
- Allow the **binary** to be executed `chmod 777 ScreenRecorderLegacy`
- Run it `./ScreenRecorderLegacy` with arguments, an example may be `./ScreenRecorderLegacy 700 700 0 0 0 30 1 5 1 hw:1,0 out.mp4`### Troubleshooting
- In some cases installing **c++ 20** won't be enough to compile the application and the libraries. You will have to add manually **-std=gnu++2a** in the **CXXFLAGS** of the **Makefile ** generated by the **qmake** command.
- If the application return an error related to the video device when you start the recording it could be caused by the **DISPLAY** environment variable. Try to **export** a new **DISPLAY** variable with the command `export DISPLAY=:1`. Sometimes (especially in **VM**) the **DISPLAY** variable contains the screen number and looks like **:1.0** but this library is expecting a **DISPLAY** variable which look like **:1** (only the **Xserver**) without **screen number**.---
## Windows### How to compile and run
#### Legacy application
- Download **Qt 5.15** or higher version.
- Open with **Qt Creator** the file `ScreenRecorderLegacy.pro` that you can find in the folder `ScreenRecorderLegacy`.
- Let Qt choose the best kit configuration. The default version provided should work just fine, but in case you need to know what has been used:
- Device type: Desktop
- Compiler C++: MinGW (C++, x86 64bit in C:\TDM-GCC-64\bin)
- Debugger: System GDB at C:\TDM-GCC\bin\gdb.exe
- Qt version: Qt 5.15.2 (mingw81_64)
- CMake Tool: CMake 3.19.2 (Qt)
- Once the project is open, please click on "Project" in the side bar.
- You will be able to see "Run" option on the left (Build & Run section). Click on this option.
- Explicit the command line arguments in the field. An example may be `700 700 0 0 0 30 1 5 1 "Microphone (Realtek High Definition Audio)" ../outFolder/out.mp4`.
- Check the "Run in terminal" option.
- Finally, run the application using the green button. You will see the terminal pop up.#### QT application
- Download **Qt 5.15** or higher version.
- Open with Qt Creator the file `ScreenRecorderQT.pro` that you can find in the folder `ScreenRecorderQT\ScreenRecorderQT`.
- Let Qt choose the best kit configuration. The default version provided should work just fine, but in case you need to know what has been used:
- Device type: Desktop
- Compiler C++: MinGW (C++, x86 64bit in C:\TDM-GCC-64\bin)
- Debugger: System GDB at C:\TDM-GCC\bin\gdb.exe
- Qt version: Qt 5.15.2 (mingw81_64)
- CMake Tool: CMake 3.19.2 (Qt)
- Finally, run the application using the green button. You will see GUI pop up.---
## Mac OS
### How to compile and run
#### Legacy application
- Clone or Download the repository in a folder
- Install the required libraries with Homebrew packet manager `brew install ffmpeg`
- Open a new Terminal on `/ScreenRecorderLegacyMacOS/`folder
- Execute the following command
- `cd build`
- `cmake ..`
- `make`
- Make sure you are still in the build folder. Now you can lanch the `./main` executable file with the right options to start recording
- `./main width height offset_x offset_y screen_num fps quality compression audioOn audioDevice outFilePath`
- Example `./main 3600 2338 0 0 1 30 1 1 1 0 out.mp4`
- You can find the `screen_num` value and `audioDevice` value by digiting from terminal the following command:
- `ffmpeg -f avfoundation -list_devices true -i ""`