概要
FFmpegをコマンドラインで操作する際、特にWindowsのPowerShellとLinux/macOSのbashでは、コマンドを複数行に分けたり、複数のHTTPヘッダーを指定したりする際の「書き方」が大きく異なります。
「ネットで見つけたFFmpegのコマンドをコピペしたのに、なぜかエラーが出る……」
「複数のヘッダー(AuthorizationやCookie)を指定しようとすると、片方が無視されてしまう……」
そんな悩みの原因は、FFmpegそのものではなく、あなたが使っている「シェル(PowerShellやbash)」の作法の違いにあるかもしれません。
ネット上のサンプルをコピペしても動かない原因の多くはここにあります。今回は、「複数ヘッダー(AuthorizationヘッダーやCookieヘッダーなど)を指定する」という実例をもとに、その決定的な違いを解説します。
比較まとめ:記号の使い分け
まず、結論となる比較表がこちらです。
| 項目 | Windows (PowerShell) | Linux / macOS (bash) |
|---|---|---|
| 行の継続記号 | ` (バッククォート) | \ (バックスラッシュ) |
| 改行コード | `r`n | \r\n |
| エスケープ文字 | ` (バッククォート) | \ (バックスラッシュ) |
PowerShellでの書き方(Windows)
PowerShellでは、エスケープ文字に「バッククォート(`)」を使用します。
実装例:複数ヘッダーを指定してm3u8を保存
複数のヘッダーを -headers で送る場合、文字列内で `r`n を使って改行を指定するのがポイントです。
なお、User-AgentヘッダーとRefererヘッダーについては専用オプションがあるので、それらを使用すればOKです。
> ffmpeg
ffmpeg version 8.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2025 the FFmpeg developers
> ffmpeg `
-user_agent "Mozilla/5.0 (Test-Agent)" `
-referer "https://example.com/" `
-headers "Authorization: Bearer YOUR_TOKEN_HERE`r`nCookie: session_id=test_123" `
-i "https://test-streams.mux.dev/x36xhzz/url_6/193039199_mp4_h264_aac_hq_7.m3u8" `
-t 5 -c copy output_ps.mp4 `
-loglevel debug
コードは注意してご使用ください。
⚠️ ハマりポイント:
PowerShellで \r\n と書くと、単なる文字列として扱われ、ヘッダーが正しく分割されません。必ずバッククォート版を使用してください。
⚠️ Authorization ヘッダーについて:Authorization ヘッダーの中身は、使用する認証方式によって異なります。
エンジニアがよく使う「Bearer認証」と「Basic認証」の2パターンを整理します。
Bearer認証(トークンの場合)
YOUR_TOKEN_HERE には、パスワードではなく、システムから発行された「アクセストークン」という長い英数字の文字列が入ります。ユーザー名やパスワードを直接送らない、現代的なWebサービスで主流の方式です。
- 書き方:
Authorization: Bearer [トークン文字列]
Basic認証(ユーザー名とパスワードの場合)
昔ながらの「ユーザー名」と「パスワード」を使う方式です。ただし、そのまま書くのではなく、
「ユーザー名:パスワード」という形式の文字列を Base64 という形式でエンコードしたものを指定します。
- 例: ユーザー名が
admin、パスワードがpass123の場合admin:pass123を作成- Base64に変換 →
YWRtaW46cGFzczEyMw== - 書き方:
Authorization: Basic YWRtaW46cGFzczEyMw==
bashでの書き方(Linux / macOS)
bashでは、一般的なプログラミング言語と同様に「バックスラッシュ(\)」を使用します。
$ ffmpeg
ffmpeg version 7.1.3-0+deb13u1 Copyright (c) 2000-2025 the FFmpeg developers
$ ffmpeg -user_agent "Mozilla/5.0 (Test-Agent)" \
-referer "https://example.com/" \
-headers $'Authorization: Bearer YOUR_TOKEN_HERE\r\nCookie: session_id=test_123' \
-i "https://test-streams.mux.dev/x36xhzz/url_6/193039199_mp4_h264_aac_hq_7.m3u8" \
-t 5 -c copy output_bash.mp4 \
-loglevel debug
コードは注意してご使用ください。
⚠️ ハマりポイント:
bashで \r\n を改行として認識させるには、$'...' という特殊な引用符の書き方が必要です。
なぜ「1つの文字列内に改行」が必要なのか?
FFmpegの仕様として、-headers オプションを複数回記述すると、後に書いたもので上書きされてしまうという挙動があります。
- ❌
-headers "Referer:..." -headers "Cookie:..."(Cookieしか送られない) - ⭕️
-headers "Referer:...[改行]Cookie:..."(両方送られる)
HTTP通信の規格上、ヘッダー同士は改行で区切るルールがあるため、FFmpegに対して「ここでヘッダーを区切ってください」と教えるために、シェルごとの正しい改行コードを指定する必要があります。
動作確認のコツ:-loglevel debug
自分の環境でヘッダーが正しく送られているか不安な時は、コマンドの最後に -loglevel debug を付けましょう。ログの中に以下のような記述があれば成功です!
[https @ 0x62dcb74edc00] request: GET /x36xhzz/url_6/193039199_mp4_h264_aac_hq_7.m3u8 HTTP/1.1
User-Agent: Mozilla/5.0 (Test-Agent)
Referer: https://example.com/
Accept: */*
Range: bytes=0-
Connection: close
Host: test-streams.mux.dev
Icy-MetaData: 1
Authorization: Bearer YOUR_TOKEN_HERE
Cookie: session_id=test_123
まとめ
先の比較表にある通り、Windows (PowerShell)とLinux / macOS (bash)ではコマンドを複数行に分けたり、複数のHTTPヘッダーを指定したりする際の「書き方」が大きく異なっています。
本記事ではヘッダーの指定方法に焦点を当てましたが、FFmpegでは他にもパスの指定やワイルドカードの扱いなど、シェルごとの違いで戸惑うポイントがありますので注意が必要です。
この記事が、どなたかのお役に立てれば幸いです。


コメント