KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

【Synology】 DS fileで動画のサムネイルを表示させる方法

こんにちは。KENTEMでフロントエンドを担当しているS・Kです。

私はプライベートでSynology製のNAS(Network Attached Storage)を使っています。普段、DS fileというスマホアプリでNASに保存した動画を閲覧していたのですが、ある日を境にサムネイルが表示されなくなってしまいました。

実際の画像

今回の記事では、同じような症状が出て困っている方に向けて、DS fileでサムネイルを復活させる方法を紹介します。スクリプトをコピペするだけで簡単にできるので、ぜひお試しください。

サムネイルが表示されなくなった原因

サムネイルが表示されなくなった原因は、私がVideo Stationというパッケージを削除してしまったことでした。

調べていて初めて知ったのですが、DS file単体では動画のサムネイル生成をしておらず、Video Stationが生成していたサムネイルをDS fileが読み取って表示していただけだったのです。

reddit - Stupid question: Why can't I see video thumbnails/previews?

「それならVideo Stationをまたダウンロードすれば解決じゃん」と思い、パッケージセンターを見てみたのですが...... Video Stationが見当たりません。

DSM 7.2.2以降、Video Stationが利用できなくなっていた

調べてみると、Video StationDSM 7.2.2(2024年8月リリース)以降で利用できなくなっており、パッケージセンターから新たにインストールすることもできなくなっていました。これは困りました。

実際、公式のリリースノートにも「Video Station is not available on DSM 7.2.2.」と明記されています。

Release Notes for DSM | Synology Inc.

解決の糸口をAIで探ってみる

まず調査の当たりをつけるため、生成AIのGeminiに相談してみました。 そこで得られたのが、「Synology NASでは@eaDirという隠しフォルダ内に、サムネイル関連のファイルが保存されているらしい」という手がかりです。

この手がかりをもとにSynology Communityの情報を確認したところ、@eaDirという隠しフォルダの中にサムネイルが保存されていることが分かりました。

Synology Community: メディアインデックス付けで作成されたファイルの保存場所について

また、動画のサムネイルについては@eaDir/<動画ファイル名>/の中にSYNOVIDEO_VIDEO_SCREENSHOT.jpgといった名前で保存されるようです。

つまり、サムネイル画像を自分で作って所定の名前・場所に配置してあげれば、DS file側がそれを読み取って表示してくれるというわけです。

なので、スクリプトでこのサムネイルを生成する仕組みを作ればなんとかなりそうです。

@eaDirにサムネイルを生成するアプローチは以下でも紹介されており、スクリプトを組むうえで参考にしています。

実際に表示させてみる

準備

サムネイル生成に必要なコーデック類を利用するため、まずSynology公式パッケージのAdvanced Media Extensionsをインストールします。

  1. NASの管理画面でパッケージセンターを開きます。
  2. 検索ボックスでAdvanced Media Extensionsと入力します。
  3. Advanced Media Extensionsをインストールします。

※コーデックに関する注意

拡張子が.mp4でも、動画内部のコーデックによってはサムネイルを生成できない場合があります。特にHEVC(H.265)はDSM 7.2.2以降のAdvanced Media Extensionsではサポートされなくなっているため、HEVCの動画ではこの手順でサムネイルが生成できないことがあります。本手順はすべての動画形式でのサムネイル生成を保証するものではない点にご注意ください。

Advanced Media Extensions Technical Specifications | Synology Inc.

タスクスケジューラーで自動でサムネイルを生成

準備ができたので、実際にサムネイルを生成するスクリプトを設定していきます。

  1. コントロールパネルを開きます。
  2. タスクスケジューラーを開きます。
  3. 作成 > 予約タスク > ユーザー指定のスクリプトを選択します。
  4. タスク作成のダイアログが表示されるので、それぞれのタブの設定を変更していきます。

    ① 全般
    • タスク: 任意のタスク名(例:create_thumbnail)
    • ユーザー: NASの管理者ユーザーを選択(rootではなく、普段ログインしている管理者アカウント)


    ② スケジュール
    • 日付: サムネイルを生成する頻度を設定(毎日、週ごとなど)
    • 時間: 実行する時刻を設定

    ※ あまりNASに動画を追加しない方は、頻度は月に1回でも十分だと思います(私は週に1回にしています)。また実行中はNASに負荷がかかるため、時間は自分がNASを使わない時間帯に設定するのがおすすめです。



    ③ タスク設定
    • コマンドを実行: 以下のスクリプトをコピー&ペーストします。(パスの書き換えを一部する必要があります。)


    # 設定エリア
    # ==========================================
    # サムネイルを作成したいフォルダのパスをここに記述
    TARGET_DIR="/volume1/my folder"
    
    # 動画の何秒地点をサムネイルとして切り出すか(秒)。お好みで変更できます
    # ※動画がこの秒数より短い場合は、自動的に中間地点が使われます
    TARGET_SS=10
    export TARGET_SS
    
    # ==========================================
    # メイン処理
    # ==========================================
    # @eaDir(サムネイル保存先の隠しフォルダ)は除外し、通常ファイルのみを対象にする
    find "$TARGET_DIR" -type d -name "@eaDir" -prune -o -type f \( -name "*.mp4" -o -name "*.mkv" -o -name "*.mov" -o -name "*.avi" -o -name "*.wmv" -o -name "*.m4v" -o -name "*.mpg" -o -name "*.mpeg" \) -exec sh -c '
        FILE="$0"
        EA_DIR="$(dirname "$FILE")/@eaDir/$(basename "$FILE")"
        OUT_FILE="$EA_DIR/SYNOVIDEO_VIDEO_SCREENSHOT.jpg"
    
        # 既にサムネイルが存在し、サイズが0バイトより大きい場合はスキップ
        if [ -f "$OUT_FILE" ] && [ -s "$OUT_FILE" ]; then
            exit 0
        fi
    
        # 存在しないか0バイトの場合、ディレクトリを作成する
        mkdir -p "$EA_DIR" || true
    
        # Synologyのffmpegパス設定
        FFMPEG_PATH="/var/packages/CodecPack/target/bin/ffmpeg41"
        FFPROBE_PATH="/var/packages/CodecPack/target/bin/ffprobe41"
        
        # 切り出し位置(設定エリアのTARGET_SSを使用)
        SS=$TARGET_SS
    
        # ffprobeが実行可能かチェックして動画時間を取得
        if [ -x "$FFPROBE_PATH" ]; then
            DURATION=$( "$FFPROBE_PATH" -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i "$FILE" 2>/dev/null )
            
            # 動画が短すぎる場合は中間の時間を計算
            if [ -n "$DURATION" ]; then
                SS=$(awk -v dur="$DURATION" -v target="$TARGET_SS" "BEGIN { if (dur < target) { print dur / 2 } else { print target } }")
            fi
        fi
    
        # ffmpegを実行してサムネイルを生成(失敗時は調査できるようWARNを出す)
        if ! "$FFMPEG_PATH" -an -ss "$SS" -i "$FILE" -vframes 1 -vf scale=size=hd480:force_original_aspect_ratio=decrease -f mjpeg -y "$OUT_FILE" 2>/dev/null; then
            echo "WARN: サムネイル生成に失敗しました(コーデック非対応の可能性あり): $FILE" >&2
        fi
    
    ' {} \;

    【重要】パスの書き換えについて

    スクリプト1行目のTARGET_DIR="/volume1/my folder"の部分を、ご自身の環境に合わせて変更する必要があります。

    確認方法
    File Stationで対象フォルダを右クリックして、「プロパティ」を開きます。そして、「場所」に表示されているパスをコピーして貼り付けてください。

    ※スクリプトについて

    上記のコードは生成AIによって作成し、筆者の環境で動作確認したものです。
    処理内容としては、ffmpegで動画ファイルを読み取り、@eaDirという隠しフォルダにサムネイル画像(jpg)を保存しているだけで、動画ファイルそのものを変更・削除する処理は含まれていません。
    ただし環境によって動作は異なります。ご利用は自己責任でお願いします。はじめはテスト用の小さなフォルダで試すことをおすすめします。
  5. OKを押します。

以上の設定を行い、指定した時間が経過すると自動的にサムネイルが生成されます。 無事にDS fileでサムネイルが表示されるようになりました。

まとめ

サムネイルがいきなり表示されなくなり、ネットで検索しても解決策が見つからず途方に暮れていましたが、Geminiに相談することで解決の糸口が見つかりました。AIのおかげでスムーズにトラブルを解決できる、とてもいい時代になったと感じます。

もし、DSM 7.2.2以降Video Stationが利用できなくなった影響でDS fileのサムネイルが表示されなくなってお困りの方がいらっしゃいましたら、ぜひ上記の手順をお試しください。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp