[C++] 129 FLTK : 動画変換アプリの製作 FFmpeg

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

movファイルをmp4に変換するアプリを即席で作成しました。HomebrewからFFmpegをインストールして使用しています。

GUIは以前作成した画像変換アプリのものを流用しました。とりあえずmov→mp4変換だけの単機能です。

画面から動画をキャプチャした時のファイル名に半角スペースが含まれているためにFFmpegが動かず、前処理として半角スペースを削除したファイル名にリネームしてから変換させました。

FFmpegはコンソールツールなのでappファイルではなく実行ファイルを使うことになります。

たかだかスペースのために難易度が結構高くなりました。作っておいた文字列分割ライブラリSplitが役に立っています。

#include <cstdio> 
#include "Split.h"

Split spt;

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)
    {
        // 自製ライブラリSplitにより半角スペースを区切り文字としてリスト化
        vector<string> prefix0_vec = spt.splits(path_str, ' ');

        // リストの要素を結合(スペースなしのpath作成)
        const char* delim = "";
        std::ostringstream os;
        std::copy(prefix0_vec.begin(), prefix0_vec.end(), std::ostream_iterator<string>(os, delim));
        path2 = os.str();
        cout << "path2 "<< path2 << endl;

        // 変換元ファイルをリネーム
        rename(path, path2.c_str());
    } else {
        path2 = path_str;
    }

    // 自製ライブラリSplitによりファイル名から拡張子を削除
    string prefix = spt.splitjoin(path2, '.', 0, -2);
    cout << "prefix "<< prefix << endl;

    // 変換先のファイルパス作成
    string path3 = prefix + fmt[formatNum];
    cout << "path3 "<< path3 << endl;

    // ファイル変換コマンド作成
    string cmd = "ffmpeg -i " + path2 + " -f " + fmt[formatNum] + " " + path3;
    cout << "cmd "<< cmd << endl;

    // コマンド実行
    system(cmd.c_str());

    cout << "フォーマット変換完了!" << endl;
    output_line->insert("フォーマット変換完了!\n");
}