mirror of
https://github.com/tkmxqrdxddd/davinci-video-converter
synced 2025-11-08 18:45:05 +01:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64cde37777 | ||
|
|
0b8b922e5d | ||
|
|
f46e7b4465 | ||
|
|
32ab30b370 | ||
|
|
7dcf7200ca | ||
|
|
c4918446b9 | ||
|
|
a5cda7e500 | ||
|
|
b4c0399399 | ||
|
|
ba28ea0c9b |
13
.github/workflows/ci.yml
vendored
13
.github/workflows/ci.yml
vendored
@@ -15,12 +15,19 @@ jobs:
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Install Dependencies
|
||||
run: sudo apt-get install -y build-essential ffmpeg
|
||||
run: sudo apt-get install -y build-essential ffmpeg wget
|
||||
|
||||
- name: Create Tests Directory
|
||||
run: mkdir -p tests # Create the tests directory if it doesn't exist
|
||||
|
||||
- name: Download Sample Video
|
||||
run: wget -O tests/sample_video.mp4 https://www.pexels.com/video/3195394/download/
|
||||
|
||||
- name: Build
|
||||
run: make
|
||||
run: |
|
||||
g++ -o davinci-convert src/main.cpp -lstdc++fs
|
||||
|
||||
- name: Run
|
||||
run: |
|
||||
echo "Running the Video Converter..."
|
||||
./output/davinci-convert
|
||||
./davinci-convert tests/sample_video.mp4 --output tests/output/video.mov
|
||||
|
||||
14
Makefile
14
Makefile
@@ -3,25 +3,25 @@
|
||||
# 'make clean' removes all .o and executable files
|
||||
#
|
||||
|
||||
# define the Cpp compiler to use
|
||||
# Define the C++ compiler to use
|
||||
CXX = g++
|
||||
|
||||
# define any compile-time flags
|
||||
# Define any compile-time flags
|
||||
CXXFLAGS = -std=c++17 -Wall -Wextra -g
|
||||
|
||||
# define output directory
|
||||
# Define output directory
|
||||
OUTPUT = output
|
||||
|
||||
# define source directory
|
||||
# Define source directory
|
||||
SRC = src
|
||||
|
||||
# define the main executable name
|
||||
# Define the main executable name
|
||||
MAIN = davinci-convert
|
||||
|
||||
# define the C source files
|
||||
# Define the C source files
|
||||
SOURCES = $(wildcard $(SRC)/*.cpp)
|
||||
|
||||
# define the C object files
|
||||
# Define the C object files
|
||||
OBJECTS = $(SOURCES:.cpp=.o)
|
||||
|
||||
OUTPUTMAIN = $(OUTPUT)/$(MAIN)
|
||||
|
||||
@@ -21,8 +21,8 @@ Before building and running the application, ensure you have the following insta
|
||||
|
||||
1. Clone the repository:
|
||||
```bash
|
||||
git clone https://github.com/tkmxqrdxddd/DavinciVideoConverter.git
|
||||
cd DavinciVideoConverter
|
||||
git clone (https://github.com/tkmxqrdxddd/davinci-video-converter)
|
||||
cd davinci-video-converter
|
||||
```
|
||||
|
||||
2. Run the build script to install dependencies and build the project:
|
||||
|
||||
6
build.sh
6
build.sh
@@ -26,7 +26,7 @@ install_redhat_dependencies() {
|
||||
# Function to install dependencies for Arch Linux
|
||||
install_arch_dependencies() {
|
||||
echo "Installing dependencies for Arch Linux..."
|
||||
sudo pacman -Syu --noconfirm base-devel ffmpeg || {
|
||||
sudo pacman -S --noconfirm base-devel ffmpeg || {
|
||||
echo "Failed to install dependencies for Arch Linux."
|
||||
exit 1
|
||||
}
|
||||
@@ -90,7 +90,7 @@ fi
|
||||
|
||||
# Install the application
|
||||
echo "Installing the application..."
|
||||
sudo make install
|
||||
make install
|
||||
|
||||
# Inform the user about the executable
|
||||
echo "You can run the application using davinci-convert"
|
||||
echo "You can run the application using 'davinci-convert'"
|
||||
|
||||
112
src/main.cpp
112
src/main.cpp
@@ -2,53 +2,89 @@
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <filesystem>
|
||||
|
||||
class VideoConverter {
|
||||
private:
|
||||
bool conversionInProgress;
|
||||
|
||||
public:
|
||||
VideoConverter() : conversionInProgress(false) {}
|
||||
void startConversion(const std::string &inputFile, const std::string &outputFile);
|
||||
|
||||
void startConversion(const std::string &inputFile, const std::string &outputFile) {
|
||||
if (conversionInProgress) {
|
||||
std::cerr << "Error: Conversion already in progress." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
if (inputFile.empty() || outputFile.empty()) {
|
||||
std::cerr << "Error: Please enter both input and output file names." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
conversionInProgress = true;
|
||||
std::cout << "Starting conversion..." << std::endl;
|
||||
|
||||
std::thread conversionThread([this, inputFile, outputFile]() {
|
||||
std::string command = "ffmpeg -i \"" + inputFile + "\" -c:v dnxhd -profile:v dnxhr_hq -pix_fmt yuv422p -c:a alac \"" + outputFile + "\"";
|
||||
int result = std::system(command.c_str());
|
||||
conversionInProgress = false;
|
||||
|
||||
if (result == 0) {
|
||||
std::cout << "Video conversion completed successfully." << std::endl;
|
||||
} else {
|
||||
std::cerr << "Error: Conversion failed with exit code " << result << std::endl;
|
||||
}
|
||||
});
|
||||
|
||||
conversionThread.detach(); // Detach the thread to allow it to run independently
|
||||
}
|
||||
private:
|
||||
bool conversionInProgress = false;
|
||||
};
|
||||
|
||||
int main() {
|
||||
void VideoConverter::startConversion(const std::string &inputFile, const std::string &outputFile) {
|
||||
if (conversionInProgress) {
|
||||
std::cerr << "Error: Conversion already in progress." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
if (inputFile.empty()) {
|
||||
std::cerr << "Error: Please provide an input file name." << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine the output path
|
||||
std::filesystem::path outputPath;
|
||||
if (outputFile.empty()) {
|
||||
// If no output file is specified, create one in the current directory
|
||||
outputPath = std::filesystem::current_path() / (std::filesystem::path(inputFile).stem().string() + ".mov");
|
||||
} else {
|
||||
outputPath = std::filesystem::path(outputFile);
|
||||
if (outputPath.extension() != ".mov") {
|
||||
outputPath += ".mov";
|
||||
}
|
||||
}
|
||||
|
||||
conversionInProgress = true;
|
||||
std::cout << "Starting conversion..." << std::endl;
|
||||
|
||||
std::thread([this, inputFile, outputPath]() {
|
||||
std::string command = "ffmpeg -i \"" + inputFile + "\" -c:v dnxhd -profile:v dnxhr_hq -pix_fmt yuv422p -c:a alac \"" + outputPath.string() + "\" 2> /dev/null";
|
||||
int result = std::system(command.c_str());
|
||||
conversionInProgress = false;
|
||||
|
||||
if (result == 0) {
|
||||
std::cout << "Video conversion completed successfully." << std::endl;
|
||||
} else {
|
||||
std::cerr << "Error: Conversion failed with exit code " << result << std::endl;
|
||||
}
|
||||
}).detach();
|
||||
}
|
||||
|
||||
void printHelp() {
|
||||
std::cout << "Usage: davinci-convert /path/to/video [--output /path/to/output/folder]\n";
|
||||
std::cout << "Options:\n";
|
||||
std::cout << " /path/to/video Path to the input video file.\n";
|
||||
std::cout << " --output /path/to/output/folder Path to the output video file (optional).\n";
|
||||
std::cout << " --help Show this help message.\n";
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
VideoConverter converter;
|
||||
std::string inputFile, outputFile;
|
||||
|
||||
std::cout << "Welcome to the Video Converter!" << std::endl;
|
||||
std::cout << "Enter the input file path: ";
|
||||
std::getline(std::cin, inputFile);
|
||||
std::cout << "Enter the output file path: ";
|
||||
std::getline(std::cin, outputFile);
|
||||
if (argc < 2) {
|
||||
printHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// The first argument is the input file
|
||||
inputFile = argv[1];
|
||||
|
||||
// Parse the remaining arguments
|
||||
for (int i = 2; i < argc; i++) {
|
||||
if (std::strcmp(argv[i], "--output") == 0 && i + 1 < argc) {
|
||||
outputFile = argv[++i];
|
||||
} else if (std::strcmp(argv[i], "--help") == 0) {
|
||||
printHelp();
|
||||
return 0;
|
||||
} else {
|
||||
std::cerr << "Unknown option: " << argv[i] << std::endl;
|
||||
printHelp();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
converter.startConversion(inputFile, outputFile);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user