[C++] 178 FLTK : 動画からフレームレートを取得 FFmpeg

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

開発中のビデオツールアプリにおいて、すでに分割したフレーム群から動画を作成できるようにしました。

さらに動画の一部をマスクする機能を実装して、このアプリはとりあえず完成としたいです。

// 解析ボタンのコールバック関数
void analyzeCB(Fl_Widget*, void*) {
    string bufferStr2;
    std::ifstream file;
    string fpsFile = "fps.txt";
    string buffer;

    fpsInput2 -> value("\0");
    // 対象ファイルパス取得
    const char* path = inputLine2->value();
    
    // path未入力の場合は既存の静止画群のFPSを取得し表示
    if (string(path) == ""){
        cout << "pathなし" << endl;

        // fps.txtからfps(分数)を取得
        file.open(fpsFile, std::ios::in);
        std::getline(file, buffer);
        string fps_str = buffer;

        vector<string> list_fps = spt2.splits(fps_str,"/");
        string top0 = list_fps[0];
        float top = stof(top0);
        string bottom0 = list_fps[1];
        float bottom = stof(bottom0);

        fps = top/bottom;
        cout << "fps "<< fps << endl;

        fpsInput2 -> value((to_string(fps)).c_str());
        fpsInput2 -> position(0);
        
        outputLine2 -> value("out.mp4");

        toImagesRbtn -> value(false);
        toVideoRbtn -> value(true);

        return;
    }

    cout << "path "<< path << endl;

    string path_str = string(path);
    bufferStr2 += "path_str: " + path_str + "\n";

    // path内半角スペースをアンダースコアへ置き換え
    path2 = underScoreReplace(string(path_str));
    bufferStr2 += "path2: " + path2 + "\n";

    // 元ファイルをリネーム
    rename(path, path2.c_str());

    // 出力ファイル名を作成
    string outputFile0 = spt2.splitJoin(path2, ".", 0, -2);
    outputFile0.pop_back();
    outputFile = outputFile0 + "_trimmed.mp4";
    cout << "outputFile " << outputFile << endl;

    outputLine2 -> value(outputFile.c_str());

    // フレームレート出力コマンドcmd作成
    string cmd = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffprobe -v error -select_streams v -show_entries stream=avg_frame_rate -of csv=p=0 " + path2;
    // fps.txtとしても出力
    string cmd2 = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffprobe -v error -select_streams v -show_entries stream=avg_frame_rate -of csv=p=0 " + path2 + " 1> " + fpsFile;

    cout << "cmd: "<< cmd << endl;

    cmdBuffer2 -> append(cmd.c_str());
    cmdBuffer2 -> append("\n");

    bufferStr2 += cmd + "\n";

    // cmdTextDisplay2にcmdを表示する
    cmdTextDisplay2->buffer(cmdBuffer2);

    // FPSを取得し表示
    showFPS(cmd);
    system(cmd2.c_str());

    textBuffer2 -> append(bufferStr2.c_str());
    textDisplay2 -> buffer(textBuffer2);
}