[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]
ffmpegコマンドをアプリ内で実行する際、コマンドは絶対パスにしないと動作しません。コンソール付き実行ファイルではコマンド名だけで動作するものの、appファイルでは動かないです。
ffmpegコマンドの標準出力はpopenで捉えられませんでしたが、movからmp4への変換自体はできたのでよしとします。
22/8/18追記:
FFmpegの公式サイトからffmpeg-107780-g6ded80af92.7zをダウンロードして実行ファイルを使ってみたところ、MacOSがカーネル機能拡張されたとかでパニック修復ブートにて再起動し、その後再起動を繰り返すようになりました。
ディスクユーティリティのFirst Aidでは直らなかったので、TimeMachineで復元し、復活させました。偶然かもしれませんが、取扱は慎重にした方が良さそうです。MacOSの場合はHomebrewからもインストールできます。こちらは問題ありませんでした。
これまでFirst Aidが修復に貢献したことは一度もなく時間の無駄なので、今後は即TimeMachineで復元します。走り出したら中断できないのも低評価です。
void outputTextMake(string cmd){
char str[READ_SIZE];
size_t ret;
FILE* fp = popen(cmd.c_str(), "r");
FILE* fo = fopen(outputText, "a+");
while(1){
ret = fread(str, sizeof(char), READ_SIZE, fp);
fwrite(str, sizeof(char), ret, fo);
if(ret < READ_SIZE){
break;
}
}
// 文字列追記
string finish = "変換完了\n";
fprintf(fo, "%s", finish.c_str());
pclose(fp);
fclose(fo);
}
void formatConvert(){
string path2;
// フォーマットリストのindex取得
int formatNum = choice->value();
// 変換元のファイルパス取得
const char* path = input_line->value();
cout << "path "<< path << endl;
// stringへ変換
string path_str = string(path);
// ファイルパスに半角スペースが含まれる場合はこれをアンダースコアに置換したファイル名に変更
if (path_str.find(" ") != std::string::npos)
{
path2 = spt.splitJoin2(path_str, " ", "_", 0, -1);
// 元ファイルをリネーム
rename(path, path2.c_str());
} else {
path2 = path_str;
}
cout << "path2 "<< path2 << endl;
// 自製ライブラリSplitによりファイル名から拡張子を削除
string prefix = spt.splitJoin(path2, ".", 0, -2);
cout << "prefix "<< prefix << endl;
// 変換先のファイルパス作成
string path3 = prefix + fmt[formatNum];
cout << "path3 "<< path3 << endl;
// ファイル変換コマンド作成(ffmpegは絶対パス)
string cmd = "/opt/homebrew/Cellar/ffmpeg/5.1/bin/ffmpeg -i " + path2 + " -f " + fmt[formatNum] + " " + path3 + " && echo ffmpeg完了";
cout << "cmd: "<< cmd << endl;
output_line->insert("cmd: ");
output_line->insert(cmd.c_str());
output_line->insert("\n");
outputTextMake(cmd);
browser->load(outputText);
cout << "フォーマット変換完了!" << endl;
}