こうこく
作 ▸

ffmpeg で複数の headers を指定するにはCRLFで区切らないといけない

ネット見てると ffmpeg に複数の -headers を指定してる記事がちらほらあるのだが……

Ubuntu 20.04ffmpeg 3.4.8-0ubuntu0.2

-loglevel debug をつけて聞いてみろ。

ffmpeg \
  -headers 'X-Hogehoge: hogege' \
  -headers 'X-Piyopiyo: piyoyo' \
  -i 'http://example.com/path/to/playlist.m3u8' \
  -loglevel debug
  -acodec copy output.aac
ログ抜粋
request: GET /path/to/playlist.m3u8 HTTP/1.1
User-Agent: Lavf/57.83.100
Accept: */*
Range: bytes=0-
Connection: close
Host: example.com
Icy-MetaData: 1
X-Piyopiyo: piyoyo

ついてないじゃん X-Hogehoge がー!!!

後から指定した -headers 'X-Piyopiyo: piyoyo' に上書きされてしまったのだ。

X-Hogehoge X-Piyopiyo ともつけたければ、以下のように単一の -headers オプション中で改行コード (CRLF) で区切って指定する必要がある。(bashの場合)

ffmpeg \
  -headers 'X-Hogehoge: hogege'$'\r\n''X-Piyopiyo: piyoyo' \
  -i 'http://example.com/path/to/playlist.m3u8' \
  -loglevel debug
  -acodec copy output.aac
ログ抜粋
request: GET /path/to/playlist.m3u8 HTTP/1.1
User-Agent: Lavf/57.83.100
Accept: */*
Range: bytes=0-
Connection: close
Host: example.com
Icy-MetaData: 1
X-Hogehoge: hogege
X-Piyopiyo: piyoyo

このことは下記のコメントで見て知った。

video - ffmpeg - How to pass http headers? - Stack Overflow


なお、同じことをコマンドプロンプト (Windows) でやるのは面倒な模様。改行コードをコマンドライン引数で渡すのが難しいようだ。

Windows で改行を含む文字列をコマンド引数で渡したい

以上!

この記事に何かあればこちらまで (非公開)