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