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

対象OS: Linux / macOS / Windows / Docker

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

Permission denied は「OSがアクセスを拒否した」というOSレベルのエラーです。コマンドのオプションは、たいてい間違っていません。ただしWindowsでは、ファイルではなくフォルダーを指すパスを渡したときにも同じエラーになるので、パスも確認してください。まず、どのファイルへのアクセスが拒否されたか を確かめます。エラーの行が Error opening input(入力)か Error opening output(出力)か で判別できます。

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

[in#0 @ 00000275351b8400] Error opening input: Permission denied
Error opening input file input.mp4.
Error opening input files: Permission denied

Error opening input: Permission denied と出ているなら、FFmpegは 入力ファイルを読み取れていません。ファイル名は次の行の Error opening input file のあとに表示されます。よくあるのは、ファイルの所有者が別ユーザー(root など)で、自分に読み取り権限が無いケースです。

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

[out#0/mp4 @ 0000024fa9834c80] Error opening output ./output/result.mp4: Permission denied
Error opening output file ./output/result.mp4.
Error opening output files: Permission denied

Error opening output のあとに出力先のパスと Permission denied が出ているなら、FFmpegは 出力ファイルを書き込めていません。原因としては、出力ディレクトリに書き込み権限が無い、ディレクトリ自体が読み取り専用でマウントされている、などがあります。連番画像(frame_%03d.png など)を書き出すときは、代わりに [image2 @ …] Could not open file : パス と表示されます。

切り分けの考え方

[in#0 …]  Error opening input: Permission denied   → 入力ファイルが「読めない」
[out#0 …] Error opening output …: Permission denied → 出力ファイルが「書けない」

まずエラーの行が in#0(Error opening input)か out#0(Error opening output)かを見て、入力側か出力側かを確定させてください。それで次に確認する対象(入力ファイルか出力ディレクトリか)が決まります。

権限を確認する(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 ~/output.mp4

~/(ホームディレクトリ)のように自分が所有するディレクトリへ出せば、出力の権限問題はほぼ起きません。システムディレクトリ(/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)ことでラベル付けされ、アクセスが許可される場合があります。ただし、/home や /usr などのシステムディレクトリには使わないでください。Docker のドキュメントは、こうしたディレクトリを :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 ~/output.mp4

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

よくある質問

ログを見ても入力か出力か分からない

Permission denied が出ている行を見てください。[in#0 …] Error opening input なら読み取りの問題、[out#0 …] Error opening output なら書き込みの問題です。判別がつかないときは、まず 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 あなたのユーザー名 ファイル で所有権を自分に移してから扱ってください。なお、削除できるかどうかはファイルの所有者ではなく、置き場所のディレクトリの書き込み権限で決まります。自分のディレクトリにあるroot所有のファイルは削除できます。root所有のディレクトリの中にあるファイルを削除するには、そのディレクトリの所有権も自分に移してください。

関連記事