如何传递HTTP头信息?

28

我需要将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”,并且请求被卡住了。

如果我删除头信息 - 一切都正常工作。

我还尝试将两个头信息放在一个字符串中,但是无论我使用哪种换行符(\r\n、\r\n等),都不能正常工作。

有人能帮助我弄清楚如何正确编写带有头信息的命令吗?


1
只是好奇:您是否也尝试过使用两个单独的-headers "<foo>\r\n"选项,每个选项字符串末尾都有自己的\r\n - Jameson
是的。它没有起作用。 我想我尝试了复制斜杠、连接头等所有可能性。 - Lizozom
我的目标只是计算视频文件的md5,所以这基本上就是我从这个命令中需要的。 我像你一样运行了跟踪,但我没有看到我的头部在请求中被发送。 - Lizozom
你不能使用 md5 程序吗?祝你好运。 - shellter
你写道:“我的目标只是计算一个视频文件的 MD5 值”。祝你好运。 - shellter
显示剩余4条评论
3个回答

30

简短回答

确保您正在使用最新的ffmpeg,并使用-user-agent选项。

详细回答

为了调试,我设置了一个在127.0.0.1:8080运行的BaseHTTPSever,使用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,当我用-user-agent "<foo>"替换了-headers "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上的标题错误存在许多讨论。我所观察到的(基本上是它正在工作,也许需要进行一些小的命令更改)是针对相当新的版本:

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


@shellter 很棒,很高兴能帮到你! - Jameson
@Jameson,用户代理对我有效,但是当我尝试设置IP时,仍然出现“HTTP头中未找到尾随的CRLF”错误。 - Lizozom
1
@Lizozom 很棒,很高兴我们解决了它! - Jameson
2
以下是任何HTTP头的示例命令。http://www.jokecamp.com/blog/passing-http-headers-to-ffmpeg/ - kampsj
在新版本的ffmpeg中,它表示user-agent已经被弃用,应该使用user_agent代替。 - Luca Steeb
显示剩余2条评论

18

FFmpeg手册指出要使用CRLF分隔多个http头。问题是,由于只能有一个"-header"参数,第二个"-header"会覆盖第一个"-header"参数。

对于您的示例,您需要通过有效的CRLF将User-AgentX-Forwarded连接为一个参数,如下所示:

-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'


9

要为头部ffmpeg请求设置x:1y:2,请使用以下代码:

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

6
看起来顺序也很重要。如果你在-headers之前加上-i,它们将被忽略。先使用-headers可以正常工作。 - cirrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接