FFmpegを実行したとき Permission denied(アクセスが拒否されました)と出て処理が止まることがあります。このエラーはコマンドの構文ミスではなく、ファイルやディレクトリへのアクセス権限の問題です。入力ファイルが読めないのか、出力ファイルが書けないのかを切り分ければ、原因はすぐに絞り込めます。本記事ではLinux・macOS・Windows・Dockerの環境別に、確認手順と解決方法を整理します。

テスト済みバージョン: ffmpeg 6.1
対象OS: Linux / macOS / Windows / Docker


この記事でわかること

  • Permission denied入力(読み取り) で起きているのか 出力(書き込み) で起きているのかの切り分け方
  • ls -l(ファイル)と ls -ld(ディレクトリ)で権限を確認する方法
  • Linux・macOSでの解決(chmod での権限付与、書き込み可能なディレクトリへの出力)
  • Dockerでボリュームの権限問題を --user で回避する方法
  • Windowsでのファイルロック・セキュリティ権限の直し方
  • なぜ sudo で無理やり実行するのが非推奨なのか

Permission denied の意味(入力か出力か)

Permission denied は「OSがアクセスを拒否した」というOSレベルのエラーです。FFmpegのコマンドそのものが間違っているわけではありません。重要なのは、どのファイルに対するアクセスで拒否されたか です。これは多くの場合、エラーメッセージの 直前に表示されているパス で判別できます。

入力で拒否されている場合

input.mp4: Permission denied

入力ファイル名のあとに Permission denied が出ているなら、FFmpegが 入力ファイルを読み取れない ことを意味します。ファイルの所有者が別ユーザー(root など)で、自分に読み取り権限が無いケースが典型です。

出力で拒否されている場合

./output/result.mp4: Permission denied
Could not open file : ./output/result.mp4

出力先のパスのあとに Permission denied が出ているなら、FFmpegが 出力ファイルを書き込めない ことを意味します。出力ディレクトリに書き込み権限が無い、ディレクトリ自体が読み取り専用でマウントされている、といった原因が考えられます。

切り分けの考え方

パス名 → Permission denied
↑ このパスが入力ファイルなら「読めない」
↑ このパスが出力ファイルなら「書けない」

まずはエラー直前のパスを見て、入力側か出力側かを確定させてください。これだけで、次に確認すべき対象(入力ファイルか出力ディレクトリか)が決まります。


権限を確認する(ls -l / ls -ld)

Linux・macOSでは、ls コマンドで権限と所有者を確認できます。これが解決の出発点です。

入力ファイルの権限を確認する

ls -l input.mp4

出力例:

-rw-r--r-- 1 root root 10485760 Jun  8 12:00 input.mp4

読み方は次のとおりです。

部分意味
-rw-r--r--権限(所有者 rw-、グループ r--、その他 r--
root root所有者ユーザー / 所有グループ

この例ではファイルの所有者が root です。あなたが一般ユーザーで作業しているなら、「その他(other)」の権限 r-- が適用され、読み取りはできます。しかし所有者が root で権限が -rw-------(その他に権限なし)だった場合は、一般ユーザーは読み取れず Permission denied になります。

出力先ディレクトリの権限を確認する

ファイルではなくディレクトリの権限を見るときは -d を付けます。

ls -ld ./output

出力例:

drwxr-xr-x 2 root root 4096 Jun  8 12:00 ./output

先頭の d はディレクトリを表します。ここでも所有者が root で、一般ユーザーに書き込み権限(w)が無ければ、そのディレクトリには出力できません。出力先ディレクトリに w(書き込み)権限があるか を必ず確認してください。


Linux・macOSでの解決

切り分けと確認ができたら、状況に応じて以下を試します。

1. ファイルに読み書き権限を付与する

自分が所有しているファイルなのに権限が足りない場合は、chmod で権限を追加します。

chmod u+rw input.mp4
  • u+rw — 所有者(user)に読み取り(r)と書き込み(w)を追加
  • 入力ファイルを読みたいだけなら chmod u+r input.mp4 でも構いません

chmod自分が所有者であるファイル に対してのみ実行できます。所有者が別ユーザーの場合は、後述のとおり所有者側で対応するか、ファイルを自分のディレクトリへコピーしてから扱うのが安全です。

2. 書き込み可能なディレクトリへ出力する

出力で拒否されている場合、最もシンプルで確実な解決策は 自分が書き込めるディレクトリへ出力する ことです。ホームディレクトリ配下なら通常は書き込み権限があります。

ffmpeg -i input.mp4 ~/Videos/output.mp4

~/Videos/(ホーム配下)のように自分が所有するディレクトリへ出せば、出力の権限問題はほぼ起きません。システムディレクトリ(/usr/.../直下など)へ直接出力しようとして拒否されているケースは、出力先を変えるだけで解決します。

3. 所有者が別ユーザーのファイルを扱う

過去に sudo で作ったファイルや、別ユーザーがコピーしたファイルは所有者が root などになっています。ls -l で所有者を確認し、必要なら所有者側(sudo chown あなたのユーザー名 ファイル)で所有権を移すか、書き込み可能な場所へコピーしてから作業してください。


Dockerでの解決

Dockerでffmpegを動かすとき、ボリュームマウント先に出力したファイルが コンテナ内のroot所有 になり、ホスト側で「自分のファイルなのに読めない・消せない」状態になることがあります。また、マウント先ディレクトリにコンテナのユーザーが書き込めず Permission denied になることもあります。

現在のユーザー権限で実行する

これを防ぐ基本は、--user でホスト側の自分のユーザーID・グループIDを指定して実行することです。

docker run --rm -v "$(pwd)":/work -w /work --user $(id -u):$(id -g) jrottenberg/ffmpeg -i input.mp4 output.mp4
  • -v "$(pwd)":/work — 現在のディレクトリをコンテナの /work にマウント
  • -w /work — 作業ディレクトリを /work に設定
  • --user $(id -u):$(id -g)ホストの自分のUID:GIDでコンテナを実行。これにより生成されるファイルが自分の所有になり、root所有化を防ぐ
  • --rm — 実行後にコンテナを自動削除

$(id -u) は自分のユーザーID、$(id -g) は自分のグループIDに展開されます。これで出力ファイルはホスト側で自分が所有するファイルになり、後から普通に読み書き・削除できます。

それでも書けないとき

  • マウントしたホスト側ディレクトリに、指定したUID/GIDの書き込み権限があるか ls -ld で確認してください
  • SELinuxが有効な環境(RHEL系など)では、ボリュームに :z / :Z を付ける(例: -v "$(pwd)":/work:z)ことでラベル付けされ、アクセスが許可される場合があります

Windowsでの解決(ロック・権限)

Windowsの Permission denied(アクセスが拒否されました)は、Linux/macOSとは原因の傾向が少し異なります。多いのは ファイルが他のアプリにロックされている ケースです。

1. ファイルのロックを解除する

Windowsでは、あるアプリがファイルを開いている間、別のプロセスがそのファイルを上書き・書き込みできないことがあります。次を確認してください。

  • 動画プレーヤーで再生中 の入力・出力ファイルを閉じる
  • エクスプローラーのプレビューウィンドウ / 詳細ウィンドウ が対象ファイルを掴んでいることがあるので、プレビューを無効化するか別フォルダーを開く
  • 出力ファイルと同名のファイルを 別アプリで開いていないか 確認する

「使用中」でロックされている場合は、該当アプリ(プレーヤーやエクスプローラーのプレビュー)を閉じるだけで書き込めるようになります。

2. フォルダーの書き込み権限を確認する

C:\Program Files\ 直下やドライブのルートなど、管理者権限が必要な場所へ出力しようとすると拒否されます。出力先を自分のユーザーフォルダー(C:\Users\ユーザー名\Videos\ など)に変えるのが最も簡単です。

権限そのものを確認・変更したい場合は、対象ファイルまたはフォルダーを 右クリック → プロパティ → セキュリティ タブで、自分のユーザーアカウントに「書き込み」「変更」の許可があるかを確認します。

3. 読み取り専用属性を外す

ファイルのプロパティで「読み取り専用」にチェックが入っていると上書きできません。プロパティ画面でチェックを外してください。


sudoを安易に使わない理由

Linux/macOSで Permission denied が出たとき、sudo ffmpeg ... で強引に実行すれば一見うまくいくことがあります。しかしこれは 後で問題を生む ため、安易に使うべきではありません。

sudoで出力するとファイルがroot所有になる

sudo ffmpeg -i input.mp4 output.mp4 のように実行すると、生成された output.mp4 の所有者が root になります。すると次のような事態に陥ります。

-rw-r--r-- 1 root root 20971520 Jun  8 12:30 output.mp4
  • 一般ユーザーのまま 編集・上書きしようとすると再び Permission denied になる
  • 後続のスクリプトやアプリ(自分の権限で動くもの)がその出力を 読めない・消せない
  • 結果として「sudoしないと触れないファイル」が増えていき、権限の状態がどんどん複雑になる

基本は「書き込み可能な自分のディレクトリへ出す」

権限エラーの正しい解決は、sudo で権限を踏み越えることではなく、自分が読み書きできる場所で作業する ことです。

ffmpeg -i input.mp4 ~/Videos/output.mp4

入力ファイルが root 所有で読めない場合も、まずは所有権や権限を ls -l で確認し、必要に応じて所有者側で chown / chmod を行うのが筋です。sudo は「本当にシステム領域を触る必要があるとき」だけに限定し、通常のエンコード作業では使わないようにしましょう。


よくある質問

エラーの直前にパスが2つ出ていて、入力か出力か分からない

ログ全体をさかのぼって、Permission denied直前 に表示されているパスを特定してください。それが入力ファイル名なら読み取りの問題、出力ファイル名なら書き込みの問題です。判別がつかないときは、まず ls -l 入力ファイルls -ld 出力ディレクトリ の両方を確認すれば、権限が足りていない側がすぐ分かります。

chmod で権限を付けようとしても「Operation not permitted」になる

そのファイルの所有者があなたではない可能性が高いです。ls -l で所有者を確認してください。chmod は所有者(または root)しか実行できません。所有者が root などの場合は、所有者側で対応するか、ファイルを自分が書き込めるディレクトリへコピーしてから作業してください。安易に sudo chmod 777 を当てるのは権限管理上おすすめしません。

macOSで「Operation not permitted」と出る(Permission deniedではない)

macOSではTCC(プライバシー保護)によって、ターミナルがデスクトップ・書類・ダウンロードなど特定フォルダーへアクセスするのをブロックすることがあります。この場合は権限ビット(ls -l)が正しくてもアクセスできません。システム設定 → プライバシーとセキュリティ → フルディスクアクセス で、使用しているターミナルアプリにアクセスを付与すると解決する場合があります。

Dockerで出力したファイルがroot所有になって消せない

docker run--user $(id -u):$(id -g) を付けて実行すると、生成ファイルがホスト側の自分の所有になり、この問題を防げます。すでにroot所有で作られてしまったファイルは、sudo chown あなたのユーザー名 ファイル で所有権を自分に移してから扱ってください。


関連リソース

長時間のエンコードや大量のバッチ処理を手元のPCで回すのが重い場合は、時間課金で使えるレンタルサーバーやVPSを検討する一案もあります。

お名前.comの高性能VPS

関連記事


動作確認: ffmpeg 6.1
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/faq.html / trac.ffmpeg.org/wiki/CompilationGuide