Nextcloudで写真・動画が「消えた?」|HEIC・MOVの表示トラブルを直した記録

写真は入っているのに、一覧では灰色。動画はパソコンで見えるのに、iPhoneでは見つからない。Nextcloudを家族アルバムとして使い始めてから、何度か「消えた?」と焦りました。

結論から言うと、ファイルが壊れたわけではありませんでした。動画のサムネイル、HEIC写真のプレビュー、同じ名前の写真とMOVの扱いを、一つずつ切り分ける必要がありました。この記事では、実際に確認した順番と、一気に変えず少しずつ試した理由を残します。


家族写真を守るまでの全4回

  1. 第1回|iPhoneの容量不足から、保存先を決めるまで
  2. 第2回|Nextcloudを夫婦のiPhoneから見られるアルバムに
  3. 第3回|写真・動画が「消えた?」表示トラブルを直した記録(この記事)
  4. 第4回|Googleフォト・iPhone・古いMacの写真をまとめて救出

問題1:動画は再生できるのに、サムネイルが灰色

最初の困りごとは、動画の一覧でした。ファイルはあり、開けば再生できます。でも一覧では全部同じ灰色のマークです。子どもの運動会なのか、旅行の動画なのか、開くまで分かりません。

▼ 実際の画面

Nextcloudの動画一覧でサムネイルが灰色になっている画面
動画そのものは保存できているのに、一覧用の小さな画像が作られていない状態です。

足りなかったのは、動画から1コマを取り出す道具

調べると、Nextcloudが動画の見本画像を作るには「FFmpeg」という道具を使います。名前は難しいですが、動画の途中から1コマを切り出し、小さな画像にできるソフトです。私が使っているXServerの環境では、そのまま呼び出せるFFmpegがありませんでした。

▼ 実際の画面

ffmpegとffprobeが見つからない確認画面
確認すると、ffmpegとffprobeは「NOT FOUND(見つからない)」。ここで初めて、灰色になる理由が分かりました。

▼ 実際の画面

iPhone版Nextcloudで動画が汎用アイコンになっている画面
iPhone側でも、145.5MBの動画が同じアイコンに見えていました。家族で使うなら、再生できるだけでなく一覧で見分けられることも大事でした。

「道具がない」と分かっても、勝手に入れてよいのか分からなかった

FFmpegは動画から画像を取り出す道具、ffprobeは動画の長さや形式を調べる道具です。8月19日の確認では、ソフトの置き場所を探す命令(command -vやwhereis)を入力しても、サーバーで利用できる場所を見つけられませんでした。

ただ、使っているのは自分専用のパソコンではなく、XServerの共有レンタルサーバーです。自分の判断で何でも入れてよいとは限りません。そこで、Nextcloudで動画一覧用の見本画像(サムネイル)を作りたいこと、FFmpegとffprobeが見つからないこと、契約者の領域へ導入して利用できるかを、XServerのサポートへ問い合わせました。

8月22日に確認した返信では、FFmpegとffprobeは標準提供されていない一方、サーバー全体を管理する権限を使わず、自分の契約で許された範囲なら、自分用の保存領域(ホームディレクトリ)などに入れて使えるとのことでした。ただし、導入の技術支援や、それによって起きた障害への対応は対象外です。

「サポートが設定してくれる」のではなく、「使うことはできるが、自分で検証する必要がある」という回答でした。ここでようやく、自分の利用領域に置いて試す方針を決められました。

1.2秒の動画から「3秒目」を取り出そうとしていた

道具を置いたあとも、すぐに成功したわけではありません。まずFFmpegとffprobeが動くか、さらに、Nextcloudのプログラム側からも使えるかを確認しました。手動で動いても、Webアプリ側から実行できなければ、一覧の見本画像は作れないためです。Nextcloudで使われているPHPの「別のソフトを動かす機能」(proc_open)でも、実行できました。

次に、実際のMOV動画から、一般的な画像形式のJPEGを作るテストをしました。ところが、長さが約1.2秒しかない動画に対して、3秒目の画像を取り出そうとしていたため、画像が出力されませんでした。道具の導入に失敗したようにも見えますが、指定していた位置が動画の終わりより後だったのです。

取り出す位置を0.2秒に変えると、MOV動画から、横1920×縦1080画素のJPEG画像を作れました。動画の圧縮方式はHEVCでした。ここで確かめられたのは、「このサーバーで、この動画から、実際に画像を作れる」ということでした。空の出力だけを見て、すぐ別のソフトへ変える必要はありませんでした。

画像が作れたあとで、Nextcloudにつないだ

動画1本から画像を作れると確認してから、Nextcloud側の「動画の見本画像を作る機能」(Movie Provider)を有効にし、自分で置いたFFmpegとffprobeの場所を設定しました。道具を置くことと、Nextcloudがその道具を使う設定は別の作業です。

その後、写真・MOV動画の見本画像と再生を確認し、100MBを超える動画でも確認しました。小さい動画が一つ動いただけで、家族の長めの動画も大丈夫だと判断しないようにしています。

画面を開いて操作していない間に進める自動処理にも、12日間動いていないという警告がありました。XServer側から、Nextcloudの定期処理用ファイル「cron.php」を5分ごとに動かす設定を行い、警告が解消したことを確認しました。これは画像を作る道具とは別の、定期的に処理を動かす仕組みです。

サムネイルを先回りして作る追加機能を入れるだけでは、動画から画像を作る道具がない問題は解決しませんでした。今回の順番は、道具の確認、導入の可否の問い合わせ、1本での画像生成、Nextcloudへの設定、実際の一覧と再生の確認です。

ここで一気に全部の動画を処理しなかったのがよかったです。まず数本で試し、問題がなければ少しずつ範囲を広げました。見本画像づくりはサーバーに仕事をさせるので、大量の動画をまとめて処理すると重くなることがあります。

問題2:HEIC写真は開けるのに、一覧だけが灰色

次は写真です。ファイル名をタップすれば写真は開くのに、一覧の小さな画像だけが灰色になります。iPhoneでよく使うHEIC形式が対象でした。

Imagickが入っていても、HEICを読めるとは限らない

サーバーには「Imagick」という画像処理の仕組みが入っていました。ところが、Imagickがあることと、HEICを読めることは別でした。読み取れる画像形式を調べると、HEICやその関連形式であるHEIFが、対応一覧に出てきませんでした。確認に使ったのはImagick::queryFormats("HEI*")という命令です。私の環境では、Imagickが読み込まれていても、標準のHEICプレビューを有効にするだけでは足りませんでした。

タップすれば元の写真は開けたので、ファイルそのものが壊れたのではなく、一覧用の小さな画像だけを作れていないのではないかと考えました。

動画用に入れたFFmpegで試すと、4032×3024のHEIC原本から、320×240ほどの小さなJPEGを取り出せました。ただし、HEICの中に写真が何番目に入っているかは、すべて同じではありませんでした。ある写真では48番、別の写真では35番というように違います。

番号を固定せず、写真ごとに調べる形にした

最初はうまくいった番号をそのまま使おうとしましたが、別のHEICでは表示できませんでした。そこで、写真ごとに中身を調べ、白黒の画像(gray)を除き、縦横の画素数を掛け合わせた値が最も小さいカラー画像を選んでJPEGにする方法へ変えました。原本全体を高解像度で変換するのではなく、一覧に必要な小さな見本画像を作るための処理です。

Nextcloud本体のファイルを直接書き換えると、更新のたびに元に戻る心配があります。そのため、本体とは別の小さな追加機能として作りました。難しい言い方では「Preview Provider」ですが、役目は「HEICから一覧用の小さなJPEGを作る係」です。

HEIC原本そのまま保存
追加機能写真の中身を確認
FFmpeg小さなJPEGを作成
Nextcloud一覧に表示

1枚→20枚→100枚の順で試した

ここだけ読むと、一度の設定で直ったように見えるかもしれません。実際は、次の順番で確認しています。

  1. 灰色になっているHEICを一枚だけ選ぶ
  2. 元の写真を開けるか確認する
  3. 写真の中にある静止画の位置を調べる
  4. FFmpegで小さなJPEGを作れるか試す
  5. 20枚、次に100枚と対象を増やす
  6. 問題が出ないことを確認してから全体へ広げる

使っているサーバーやNextcloudのバージョンによって、同じ設定がそのまま使えるとは限りません。そのため、この記事では設定値を丸写しするより、「原本は開けるか」「一覧画像だけの問題か」を切り分けた流れを中心に書いています。

20枚の成功だけでは終えず、100枚の結果を数えた

写真ごとに候補を選ぶ処理は、「heic-thumb.sh」という、決まった手順を自動で行う小さなプログラムにまとめました。1枚で使えた画像番号を全ファイルへ当てはめるのではなく、毎回ffprobeで中身を調べてからFFmpegへ渡します。

20枚のテストに続いて100枚で試すと、320×240の見本画像が76枚、416×312が24枚で、候補を見つけられなかったものは0枚でした。「一応動いた」ではなく、別の写真でも選択できるかを枚数で確かめた段階です。

この数字は100枚のテスト結果で、保管中の全HEICのサイズや成功率を表しているわけではありません。原本をJPEGへ置き換えたのでもありません。HEICは残し、Nextcloudの一覧に使う見本画像の生成方法を追加しています。

問題3:PCにはあるMOVが、iPhone版だけで見えない

いちばん不思議だったのがこれです。パソコンのブラウザーではIMG_3193.MOVが見えるのに、iPhone版Nextcloudの一覧ではIMG_3196.MOVの次に進んでも3193がありません。アプリが表示を速くするために一時保存している情報(キャッシュ)が古いのかと思い、それを消しても変わりませんでした。

動画自体を調べても、見えているMOVとほぼ同じです。映像の圧縮方式はHEVC、画面の大きさは1920×1080画素、音声の形式はAAC、ファイルの種類はvideo/quicktimeでした。壊れている様子はありません。そこで、同じ動画をTEST_3193.MOVという名前に変えて置くと、iPhoneにも表示されました。

動画の中身には手を加えていません。名前だけを変えて表示されたことで、動画自体ではなく、ファイル名の扱いに原因があると分かりました。

同じ名前の写真と動画が、Live Photoとしてまとまっている?

iPhoneのLive Photoは、同じ場面の写真と短い動画を組み合わせて保存します。NextcloudのiPhoneアプリは、同じ番号のHEICやJPGとMOVがあると、一組のLive Photoとしてまとめることがあります。ところが古いデータの中には、番号が同じだけで、撮影日がまったく違う写真と動画もありました。

同名の組み合わせを調べると695組。撮影時刻の差が10秒以内だったものは28組、約9時間差が5組、1日以上違うものが662組でした。最初の33組は本物のLive Photoかもしれないので触らず、1日以上違う662組だけを別物として扱いました。

662本を一気に変えなかった

  • まず1本だけ名前を変え、iPhoneに表示されるか確認
  • 次に2〜3本で、写真側に影響がないか確認
  • 実際には変更せず、変更予定の一覧だけを出す「DRY RUN」を実行
  • 元の名前へ戻すための記録を残す
  • 確認後、残りをまとめて変更

番号は同じでも、撮った年は違っていた

実際に調べたIMG_3193.MOVは2021年5月4日の動画でした。一方、同じ番号のIMG_3193.HEICには、Nextcloud側の写真日時として2025年6月10日が入っていました。同じ場面を写した写真と短い動画とは考えにくい組み合わせです。

名前を変えたテストで動画が現れ、撮影時期も一致しない。この二つを合わせ、私のデータではLive Photoの組として扱われて動画が隠れている、と判断しました。Nextcloudのすべての版・すべてのMOVで起こるという意味ではありません。

695組のうち、時刻差が10秒以内の28組には、実際のLive Photoが含まれる可能性があります。約9時間差の5組も、世界標準時と日本時間の違いかもしれません。名前が同じというだけで全部のMOVを改名することはせず、この33組は保留しました。

変更予定を作り、名前がぶつからないかを先に調べた

別データと判断した662組は、MOV側に日付を付ける方針にしました。たとえばIMG_3193.MOVはIMG_3193_20210504.MOVのように、写真側と同じ名前にならない形です。

ただし、変更先の名前がすでに使われていたら、別の問題になります。そのため、変更前と変更後の名前を並べた予定表を作り、変更後の名前が、ほかのファイルと重なるケースが0件であることを確認しました。DRY RUNは、この段階で実ファイルを変えずに予定だけ確認するためのものです。

名前の変更には、Nextcloud自身に移動や改名を行わせる機能「Node::move()」を使いました。サーバーへの命令(mv)でファイル名だけを直接変えるのではなく、Nextcloud自身に移動・改名を行わせる方法です。先行テストではファイルIDが維持されることも確認しました。ファイルIDは、Nextcloudがそのファイルを識別するための番号です。

残り660件を処理し、記録も660行確認した

少数の先行テストでiPhoneに表示されることを確認したあと、残りの対象は660件でした。本番処理では660件が成功し、成功したという処理記録も660行であることを確認しています。最初の候補662件と、本番の660件は、先行テスト前後の別の数です。

ここで行ったのは動画の変換ではなく改名です。元の名前と変更後の名前の対応を残し、何を変えたかを後からたどれるようにしました。

「iPhoneで見えない」からといって、ファイルが消えていたわけではありませんでした。パソコンでの存在確認、元動画の確認、名前だけを変える実験、撮影日時の比較、対象の限定、少数テスト、予定表、本番と、確認を重ねてから直しています。

500エラーや警告も、一つずつ切り分けた

▼ 実際の画面

Nextcloud管理画面に出た警告
管理画面には警告がいくつも出ました。赤い文字を全部まとめて直そうとせず、写真表示に関係するものから確認しました。

▼ 実際の画面

サーバーのPHP設定画面
1回の処理に使える時間や、作業用の記憶領域(メモリ)の上限も確認。数字だけを大きくすればよいわけではないので、少量テストを続けました。

▼ 実際の画面

500 Internal Server Errorの画面
設定中には500エラーも経験しました。元に戻せるよう、変更前の記録を残してから作業しました。

最後に:一気に直さず、一つずつ確かめる

専門的な作業はありましたが、考え方は単純でした。「ファイルは本当にないのか」「開けるけれど一覧だけ出ないのか」「名前を変えるとどうなるか」と、一度に一つだけ条件を変えます。

  • 原本は消さない
  • 少ない枚数・本数で試す
  • 変更前の状態をメモする
  • うまくいった一例だけで全部に広げない
  • 元に戻す手順を用意してから本番に進む

同じ症状でも、サーバーやNextcloudの版によって原因は変わります。この記事は私の環境での体験記です。いきなり大量処理せず、まず一つのファイルで確認するのが安全でした。


このシリーズを前後から読む

← 前の記事
第2回|Nextcloudを夫婦のiPhoneから見られるアルバムに

次の記事 →
第4回|Googleフォト・iPhone・古いMacの写真をまとめて救出

\ 最新情報をチェック /

コメントを残す

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