2022年6月7日作成

ffmpegでHTTPリクエストにヘッダを追加する

HLSをダウンロードする際に、ffmpegにHTTPヘッダを指定したいことがある。 その場合、ffmpegには-headersオプションがあるので、これを使うとよい。

$ ffmpeg -headers 'User-Agent: xx' -i 'https://example.com/movie.m3u8?q=xx' ...

# User-Agent*の場合は`-user_agent`オプションが特別に用意されているので、
# これで代用してもよい
$ ffmpeg -user_agent 'xx' -i 'https://example.com/movie.m3u8?q=xx'

ここで、複数ヘッダを指定したい場合は、-headersオプションの値をCRLFで区切って与えるらしい。

$ ffmpeg -headers $'User-Agent: xx\r\nAuth-Token: xx\r\n' -i ...

ところで、-headersオプションと-iオプションを逆にすると、 実際のリクエストにヘッダが反映されない。

$ ffmpeg -i ... -headers ... # これは期待通りに動かない

この理由は、ffmpegにはconcatフィルタなど、 複数ストリームを扱うフィルタがあって、このとき複数の-iオプションを 与えることで一時ファイルを経由せずストリームを結合できるようになっている。 そのため、-headersのようなオプション(マニュアルによるとinfile options)は、 「次に出現する-iオプション」に対して反映される。 上記のコマンドでは、-iオプションの前には-headersがないので デフォルトのヘッダでURLにリクエストするし、 また、-headersオプションの後に-iオプションがないのでこれは単に無視される。

実際にどのようなリクエストを送っているかは-loglevelオプションで確認できる。

$ ffmpeg -loglevel debug ...