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を検討する一案もあります。
関連記事
動作確認: ffmpeg 6.1
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/faq.html / trac.ffmpeg.org/wiki/CompilationGuide