[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);
}