Free now2sdk Core is completely free — no license key required   See what's included →
SDK Modules Docs Release Notes Pricing GitHub
Get the SDK →

LConvert Reference Manual & Batch Transcoding Guide

The LConvert class is a high-performance offline media transcode and file conversion engine based on the FFmpeg architecture. It reads one or multiple input media files (MP4, MKV, MOV, etc.), decodes them, applies scaling/resampling format conversions, and encodes them into a single merged output file with precise video/audio codec, bitrate, and container parameters.

It is particularly useful for exporting/merging playlist files, offline proxy generation, and rendering finished video packages.


1. API Reference & Key Methods

📌 Transcode Target Settings

📌 Input File Queue Management

📌 Process Control & Monitoring

📌 Dynamic Queries (Static Methods)


2. Standard Supported Containers & Codecs

While LConvert dynamically queries the host system's FFmpeg library at runtime (via the static getAvailable... methods), the following table lists the industry-standard containers and codecs fully supported, validated, and optimized by the now2sdk framework:

📦 Supported Containers

Container Extension Typical Use Case
"mp4" .mp4 Standard web playout, highly compatible streaming format.
"mkv" .mkv Matroska container, ideal for archiving multi-track streams.
"mov" .mov Apple QuickTime format, used for ProRes broadcast outputs.
"mpegts" .ts, .mts Transport Stream, optimized for digital TV broadcasting and live ingest.
"webm" .webm Google WebM format, used for transparent vector overlays (VP8/VP9 + alpha).
"flv" .flv Flash video format, legacy compatibility.

🎥 Supported Video Codecs

Video Codec Key Format standard Acceleration Description / Best For
"libx264" H.264 / AVC CPU Default software encoder. High quality, universal compatibility.
"h264_nvenc" H.264 / AVC GPU (NVIDIA) Hardware-accelerated H.264. Reduces CPU load during transcoding.
"libx265" H.265 / HEVC CPU Next-gen compression. Best for high-quality, low-bandwidth 4K files.
"hevc_nvenc" H.265 / HEVC GPU (NVIDIA) Hardware-accelerated HEVC/H.265.
"mjpeg" Motion JPEG CPU Intra-frame only codec. High bitrates, fast editing seeks (standard for replays).
"prores" Apple ProRes CPU Professional editing intermediary codec (supports transparency/alpha).
"dnxhd" Avid DNxHD CPU Avid professional editing intermediary.

🔊 Supported Audio Codecs

Audio Codec Key Format standard Description / Best For
"aac" AAC Advanced Audio Coding. Default high-efficiency stereo codec.
"mp3" MP3 MPEG Audio Layer III. Legacy stereo music track compatibility.
"pcm_s16le" Uncompressed PCM 16-bit Signed Little Endian. Ideal for raw lossless CD quality audio.
"pcm_s24le" Uncompressed PCM 24-bit Signed Little Endian. Used in high-end studio mastering.
"opus" Opus Low-latency audio codec optimized for interactive real-time network play.
"flac" FLAC Free Lossless Audio Codec. Lossless compressed audio.

3. Encoder Configuration Properties (setProps)

The setProps(key, value) method is used to pass advanced configurations directly to FFmpeg codecs:

Key Value Type Description
"preset" "ultrafast", "veryfast", "fast", "medium", "slow", etc. H.264/H.265 compression complexity speed preset (for libx264).
"tune" "zerolatency", "film", "animation", etc. Fine-tunes encoding parameters for latency or content style.
"g" Integer string Keyframe interval (GOP size) in frames (e.g. "25" or "50").

4. Qt Integration Example (settings.cpp & mainwindow.cpp integration)

The following implementation shows how LConvert dynamically populates UI selector combo-boxes, triggers an asynchronous export operation from selected playlist clips, and monitors progress using a timer and a QProgressDialog.

📄 settings.cpp (Dynamic Codec Query)

#include "settings.h"
#include "LConvert.h"
#include <QComboBox>

void SettingsWindow::populateForm() {
    // 1. Fetch available containers
    std::vector<std::string> containers = LConvert::getAvailableContainers();
    ui->containerCombo->clear();
    for (const auto& fmt : containers) {
        ui->containerCombo->addItem(QString::fromStdString(fmt));
    }
}

void SettingsWindow::onContainerChanged(const QString& container) {
    // 2. Query valid video codecs for container
    std::vector<std::string> vCodecs = LConvert::getAvailableVideoCodecs(container.toStdString());
    ui->videoCodecCombo->clear();
    for (const auto& codec : vCodecs) {
        ui->videoCodecCombo->addItem(QString::fromStdString(codec));
    }

    // 3. Query valid audio codecs for container
    std::vector<std::string> aCodecs = LConvert::getAvailableAudioCodecs(container.toStdString());
    ui->audioCodecCombo->clear();
    for (const auto& codec : aCodecs) {
        ui->audioCodecCombo->addItem(QString::fromStdString(codec));
    }
}

📄 mainwindow.cpp (Asynchronous Transcode Progress Monitoring)

#include "mainwindow.h"
#include "LConvert.h"
#include <QFileDialog>
#include <QProgressDialog>
#include <QTimer>
#include <QMessageBox>

void MainWindow::exportSelectedClips() {
    // Save target file selection
    QString savePath = QFileDialog::getSaveFileName(this, "Export Merged File", "/home/user/export.mp4", "Video Files (*.mp4 *.mov)");
    if (savePath.isEmpty()) return;

    // 1. Initialize & Configure LConvert
    m_LConvert = new LConvert();
    m_LConvert->setContainer("mp4");
    m_LConvert->setVideoCodec("libx264");
    m_LConvert->setAudioCodec("aac");
    m_LConvert->setVideoBitrate(8000); // 8 Mbps
    m_LConvert->setAudioBitrate(128);
    m_LConvert->setFilePath(savePath.toStdString());

    // Normalize format to system standard (1080p50)
    videoFormatProps vFormat;
    vFormat.setVideoFormat = vF::HD1080_50p;
    m_LConvert->setVideoFormat(vFormat);

    // Apply custom preset tuning
    m_LConvert->setProps("preset", "fast");
    m_LConvert->setProps("tune", "zerolatency");

    // 2. Add files to the input queue in order
    m_LConvert->clearInputFiles();
    m_LConvert->addInputFile("/recordings/clip1.bin");
    m_LConvert->addInputFile("/recordings/clip2.bin");

    // 3. Start transcode
    if (!m_LConvert->Start()) {
        QMessageBox::critical(this, "Export Failure", "Failed to start transcode engine.");
        return;
    }

    // 4. Initialize progress bar modal
    QProgressDialog* progressDlg = new QProgressDialog("Merging & Encoding Clips...", "Cancel", 0, 100, this);
    progressDlg->setWindowModality(Qt::WindowModal);
    progressDlg->setValue(0);
    progressDlg->show();

    // 5. Connect timer to monitor progress at 100ms intervals
    QTimer* progressTimer = new QTimer(this);
    connect(progressTimer, &QTimer::timeout, this, [this, progressTimer, progressDlg]() {
        int status = 0;
        m_LConvert->statusGet(status);
        double progressVal = m_LConvert->getProgress();
        
        // Progress is 0.0 to 1.0; QProgressDialog takes 0 to 100
        progressDlg->setValue(static_cast<int>(progressVal * 100.0));

        // User clicked cancel
        if (progressDlg->wasCanceled()) {
            m_LConvert->Stop();
            progressTimer->stop();
            progressTimer->deleteLater();
            progressDlg->deleteLater();
            delete m_LConvert;
            QMessageBox::information(this, "Export", "Transcode cancelled by user.");
            return;
        }

        if (status == 0) { // Finished successfully
            progressTimer->stop();
            progressTimer->deleteLater();
            progressDlg->setValue(100);
            progressDlg->deleteLater();
            delete m_LConvert;
            QMessageBox::information(this, "Export", "File exported successfully.");
        } else if (status < 0) { // Conversion error
            progressTimer->stop();
            progressTimer->deleteLater();
            progressDlg->deleteLater();
            delete m_LConvert;
            QMessageBox::critical(this, "Export Error", "Offline transcode failed.");
        }
    });

    progressTimer->start(100);
}