web-dev-qa-db-ja.com

ffmpeg-httpヘッダーを渡す方法は?

Httpヘッダー(ユーザーエージェントとIP)をffmpegコマンドに渡す必要があります。

次のコマンドを使用します。

ffmpeg  -y -timeout 5000000 -map 0:0 -an -sn -f md5 - -headers "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" -headers "X-Forwarded-For: 13.14.15.66"  -i "http://127.0.0.1" 

そして、ローカルのnode.jsサーバーを実行して、取得したヘッダーを表示します。

'use strict';

var express = require('express');

var server = express();

server.all('/*', function(req, res) {
  console.log(JSON.stringify(req.headers));
  res.sendFile('SampleVideo_1080x720_1mb.mp4', {root: '.'});

});


server.listen(80);

「HTTPヘッダーに後続のCRLFが見つかりません」というエラーが表示され続けます。そしてリクエストは行き詰まっています。

ヘッダーをドロップすると、すべてが正常に動作します。

また、両方のヘッダーを1つの文字列に入れてみましたが、使用した改行文字(\ r\n、\ r\nなど)が機能しませんでした。

誰かがヘッダーを含めてこのコマンドを正しく書く方法を理解するのを手伝ってくれる?

16
Lizozom

簡潔な答え

最新のffmpegを使用していることを確認し、-user-agentオプションを使用してください。

より長い答え

デバッグのために、私は BaseHTTPSever127.0.0.1:8080で実行し、do_GET()を次のように設定します。

def do_GET(self):
   try:
       f = open(curdir + sep + self.path, 'rb')
       self.send_response(200)
       self.end_headers()
       print("GET: "+ str(self.headers))
       self.wfile.write(f.read())
       f.close()
       return

   except IOError:
       self.send_error(404,'File Not Found: %s' % self.path)

これを実行すると、次のようなコマンドを実行できるようになります。

ffmpeg  \
    -y \
    -timeout 5000000 \
    -map 0:0 \
    -an \
    -sn \
    -f md5 - \
    -headers "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" \
    -headers "X-Forwarded-For: 13.14.15.66" \
    -i "http://127.0.0.1:8080/some_video_file.mp4" \
    -v trace

これを行うと、ffmpegから次の関連出力が表示されます。

Reading option '-headers' ... matched as AVOption 'headers' with argument 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36'.
Reading option '-headers' ... matched as AVOption 'headers' with argument 'X-Forwarded-For: 13.14.15.66'.

サーバー上で、私は見ました:

User-Agent: Lavf/56.40.101
X-Forwarded-For: 13.14.15.66

ffmpegが独自に設定しているようです。ただし、_ffmpeg-user-agentを使用するオプションがあり、-headers "User-Agent: <foo>"-user-agent "<foo>"に置き換えたとき、X-Forwarded-Forヘッダーと一緒にサーバーにも表示されました。

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36

最後のメモ。 ffmpegのtracには、ヘッダーのバグに関する多くの議論があります。上記で私が観察したこと(本質的にはis機能し、おそらく小さなコマンド変更で)はかなり最近のバージョンでした:

ffmpeg version 2.8.1 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc='gcc -fPIC'
libavutil      54. 31.100 / 54. 31.100
libavcodec     56. 60.100 / 56. 60.100
libavformat    56. 40.101 / 56. 40.101
libavdevice    56.  4.100 / 56.  4.100
libavfilter     5. 40.101 /  5. 40.101
libswscale      3.  1.101 /  3.  1.101
libswresample   1.  2.101 /  1.  2.101
libpostproc    53.  3.100 / 53.  3.100

したがって、次の移動では、ffmpegが最新バージョンであることを確認してください。

14
Jameson

まあ、ffmpegマニュアルはCRLFで複数のhttpヘッダーを分割するように言っています。問題は、「-header」引数が1つしかないため、最初の「-header」引数を2番目の「-header」で上書きすることです。

あなたの例では、あなたは_User-Agent_と_X-Forwarded_を次のような有効なCRLFによって1つの引数に結合する必要があります:

-header "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"$'\r\n'"X-Forwarded-For: 13.14.15.66"$'\r\n'

8
wiralus

セットx:1およびy:2ヘッダーffmpegリクエストの場合、これを使用します。

ffmpeg -headers $'x:1\r\ny:2\r\n' -i 'http://sample.com' -y 'sample.mp4' -v debug

結果:

[http @ 0x358be00] Setting default whitelist 'http,https,tls,rtp,tcp,udp,crypto,httpproxy'
[http @ 0x358be00] request: GET / HTTP/1.1
User-Agent: Lavf/57.76.100
Accept: */*
Range: bytes=0-
Connection: close
Host: example.com
Icy-MetaData: 1
x:1
y:2
1
Nabi K.A.Z.