SceneExplorerをforkして長編動画の管理をやりやすく改造した話

みなさん、こんにちは。

今回は、動画ファイルをサムネイルで一覧表示してくれる便利なツール「SceneExplorer」を自分好みにカスタマイズ(fork)したお話をお届けします。動画管理をもっと快適にしたいと考えている方や、Qt/C++でのツール開発に興味がある方の参考になると思うので、興味がある方はお付き合いください。

 


 

なぜ「SceneExplorer」なのか?

 

SceneExplorer は、動画ファイルを解析して、指定した枚数のサムネイルをインデックスのように並べて表示してくれるQt/C++製のアプリケーションです。

私は日常的にLinuxを好んで使っているので、これまで、Bodhi LinuxやHaiku OSといった、少し個性的で軽量なOS環境での動作にもチャレンジしてきました。オープンソースで公開されているため、自分の環境に合わせてビルドしたり、パッチを当てたりできるのが最大の魅力です。

基本機能だけでも十分に便利なのですが、長年IT業界に身を置いていると、「あともう一歩、ここがこうだったら最高なのに……」という欲が出てくるものです。特に最近、Insta360 X5を使って撮りためた数時間に及ぶ動画を扱う機会が増え、標準の「最大5枚」というサムネイル表示では内容を把握しきれないことが多くなってきました。

そこで今回、思い切って本家をforkし、自分の理想とする「長編動画管理アプリ」へと改造することに決めました。作業は、愛用している Xubuntu 22.04 の環境で行っています。

リポジトリはこちら: taoman26/SceneExplorer

 


 

今回の改造メニュー

 

今回のアップデート内容は、大きく分けて以下の6点です。

  1. ビルド手順のバグ修正(まずは動く状態に!)
  2. サムネイル表示枚数に「10枚」を追加
  3. 4枚目以降が重複するインデックスバグの修正
  4. 各サムネイルへのタイムスタンプ(経過時間)表示
  5. DVD ISOファイルからのサムネイル生成対応(今回の目玉!)
  6. 設定更新時の拡張子スキャン漏れ防止ロジックの実装

それでは、それぞれの詳細を振り返っていきましょう。

 


 

ビルド手順の修正 – 思わぬ落とし穴

 

開発の第一歩は、ソースからビルドすることです。しかし、READMEに記載された手順通りに build フォルダを作って make を実行したところ、エラーで止まってしまいます。

原因を調査したところ、サブモジュールの参照先ファイルが不足していたり、特定のヘッダファイルへのインクルードパスが通っていなかったりすることが判明しました。

以前はコメントアウトで対応していたのですが、今回のForkにあたり、CMakeLists.txt を修正し、必要な依存関係を整理することで、まずは無事にビルドが完走するようになりました。どんなプロジェクトも、最初の一歩が一番肝心ですね。

 


 

サムネイル10枚表示への道

 

長編動画の内容を確認する際、3枚や5枚のサムネイルでは「中盤から後半にかけて何が起きているか」がさっぱり分かりません。そこで、表示枚数の選択肢に「10枚」を追加しました。

UI側のコンボボックスに項目を増やすのは簡単だったのですが、問題はバックエンドのロジックです。元のコードは、内部的に「最大5枚」であることを前提としたハードコーディングが散見されました。

特に厄介だったのが tablemodel.h 内の getActualColumnIndex() という関数です。

// 修正前:3枚または5枚のみを想定
switch (columnCountImage_) {
    case 5: return ci;
    case 3: return ci * 2;
    default: Q_ASSERT(false); return 0;
}

この関数は、「5枚生成したうち、3枚モードなら1・3・5枚目を表示する」といった、少しトリッキーなインデックスマッピングを行っていました。ここに「10枚」を突っ込もうとすると、Q_ASSERT で落ちるか、強制的にインデックス 0(1枚目の画像)が返されてしまいます。

【解決策】

「生成枚数 = 表示枚数」として、1対1で素直にインデックスを管理するように設計を見直しました。これにより、どんな枚数にも柔軟に対応できるようになっています。

 


 

4枚目以降が同じ画像になるバグの解消

 

「10枚モード」を実装してテストしてみると、奇妙な現象が発生しました。1~3枚目までは正常なのに、4枚目以降がすべて「1枚目と同じ画像」になってしまうのです。

これも先述のインデックス管理ミスが原因でした。さらに、DB(SQL)側でもサムネイルのファイル名を読み込むループが i <= 5 で固定されていたため、10枚分のデータがメモリに展開されていなかったのです。

sql.cpphelper.cpp の「5」というマジックナンバーを、動的に対応できるように修正することで、ようやく10枚すべての異なるシーンが表示されるようになりました。

 


 

サムネイルに「時間の魔法」をかける – タイムスタンプ表示

 

サムネイルが並んでいると壮観ですが、「このシーン、動画の何分目だっけ?」という疑問が常に付きまといます。そこで、各サムネイルの左下に経過時間を焼き込む機能を追加しました。

実装方法としては、ffmpegのフィルタグラフを使う方法もありますが、今回はQtの描画API(QPainter)を採用しました。Qt側で完結させたほうが、OSごとのffmpegのバージョン差異に左右されにくく、フォントのレンダリングも細かく制御できるからです。

// 描画ロジックの抜粋
void overlayTimestamp(const QString& imagePath, double timeSeconds)
{
    QImage img(imagePath);
    QPainter p(&img);
    
    // 画像の高さに応じてフォントサイズを動的に調整(1/10サイズ)
    QFont font = p.font();
    font.setPixelSize(qMax(10, img.height() / 10));
    font.setBold(true);
    p.setFont(font);

    // 半透明の背景を敷いて視認性を確保
    p.fillRect(margin, bgY, textWidth, textHeight, QColor(0, 0, 0, 160));
    p.setPen(Qt::white);
    p.drawText(..., ts);
    img.save(imagePath);
}

表示形式は、1時間未満なら MM:SS、1時間以上なら H:MM:SS と切り替わるようにしました。これで、パッと見ただけで全体の時間軸が把握できるようになりました。

 


 

DVD ISOファイルへの挑戦と「7z」の活用

 

今回、最もこだわったのが「DVD ISOファイル」への対応です。

自作のDVDをISO形式でバックアップしている場合、中身を確認するためにわざわざマウントするのは非常に面倒です。SceneExplorerで直接サムネイルが見られれば最高ですよね。

最初のアプローチ – ffmpegの標準機能(失敗)

ffmpegには -dvd-device オプションがあり、ISOファイルを直接読めるはずでした。しかし、Xubuntu 22.04標準のffmpegパッケージは libdvdread が有効化されておらず、この機能が使えないことが判明……。

採用したアプローチ – 7zによるVOB抽出

そこで、汎用性の高い「力技」を採用しました。

DVD ISOの内部にある映像データ本体(VTS_XX_1.VOBなど)を、p7zip(7zコマンド)を使って一時フォルダに抽出し、そのVOBファイルをffmpegに渡すという方法です。

  1. 7z l -slt でISO内のファイル一覧を取得。
  2. その中から「最もサイズが大きいVOBファイル」を本編と見なして特定。
  3. QTemporaryDir を作成し、そこに該当のVOBを抽出。
  4. 抽出したファイルに対して通常通りサムネイル生成処理を行う。

QTemporaryDir はスタック変数として定義しているため、関数を抜ければ一時ファイルは自動的に削除されます。ストレージを圧迫せず、クリーンに処理できるのがポイントです。

 


 

設定の「マージ」ロジックでスキャン漏れを防ぐ

 

新しく .iso という拡張子をスキャン対象に追加したのですが、既存のユーザー環境では、起動時に古い設定ファイル(INIファイル)が読み込まれ、新しい拡張子が無視されてしまうという問題がありました。

これを解決するために、「保存された設定リスト」と「アプリが持つデフォルトのリスト」を比較し、足りないものがあれば自動的に追加するマージ処理を実装しました。これで、アプリをアップデートするだけで、設定をリセットすることなく新機能が有効になります。

 


 

もちろんHaiku OSにも対応

 

私はHaiku OSでもこのツールを使いたいと考えています。

今回の改造では、すべて QProcessQTemporaryDir といったQtのクロスプラットフォームAPIを使用しました。.pro ファイルの条件分岐(linux|haiku {)も整理したため、Haikuでも p7zip をインストールすれば、Linux版と全く同じ機能が利用可能です。

実際に動作も確認できました。

haikuosにも対応
Haiku OSにも対応

 


 

より良い動画管理のために

 

今回の修正内容をまとめると以下の通りです。

修正内容主な変更ファイル
ビルド不具合解消CMakeLists.txt, common/common.h
サムネイル10枚対応tablemodel.h, sql.cpp, helper.cpp
タイムスタンプ焼き込みtaskffmpeg.cpp
DVD ISO対応 (7z連携)taskffmpeg.cpp, taskffmpeg.h
拡張子自動追加ロジックextension.cpp

長編動画でも10枚のサムネイルと正確な時間表示ができるようになり、利便性は劇的に向上しました。特にISOファイルへの対応は、同じ悩みを持つ方にとって大きな助けになるはずです。

オープンソースの良いところは、こうして「自分の欲しい機能」を自分の手で作り込み、それをまた誰かに還元できるところですね。

よかったら試してみてください。

リポジトリはこちら: taoman26/SceneExplorer

 

本日も最後までお読みいただきありがとうございました。

それでは、よい動画管理ライフを!

カテゴリ: 開発インフラ

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール