[C++] 167 FLTK : FFmpegのログ取得・表示

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

開発中のビデオツールアプリでFFmpegのログをGUI上に表示させました。

手順は以下の通りです。

1.ffmpegコマンド内でFFmpegログの出力先を標準エラー出力から標準出力にリダイレクトする。
2.ffmpegコマンドの標準出力をFILE型データで取得する。
3.ログ用テキストファイルに書き込み、Fl_BrouserでGUIに表示する。

void inspect(){
    // 対象ファイルパス取得
    const char* path = input_line->value();
    cout << "path "<< path << endl;

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

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

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

    // ファイル情報出力コマンド作成(標準出力へリダイレクト)
    string cmd = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffprobe -i " + path2 + " 2>&1 && echo ffprobe完了";
    
    // cmdをbufferへ追記
    string appendstr = "cmd: " + cmd + "\n";
    bufferstr += appendstr;
    cout << "bufferstr: " << bufferstr << endl;

    textBuffer->append(bufferstr.c_str());
    textDisplay->buffer(textBuffer);

    // cmd実行
    outputTextMake(cmd);
    browser->load(outputText);
    int line_num = browser->size();
    browser->bottomline(line_num);

    cout << "inspect完了!" << endl;

}
void outputTextMake(string cmd){
    char buf[READ_SIZE];
    size_t ret;

    FILE* fp = popen(cmd.c_str(), "r");
    FILE* fo = fopen(outputText, "a+");

    while(1){
        ret = fread(buf, sizeof(char), READ_SIZE, fp);
        fwrite(buf, sizeof(char), ret, fo);
        
        if(ret < READ_SIZE){
            break; 
        } 
    }

    // 文字列追記
    string finish = "標準出力ファイル化完了\n";
    fprintf(fo, "%s", finish.c_str());

    pclose(fp);
    fclose(fo);
}