问题 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”。并且请求被卡住了。

如果我删除标题 - 一切正常。

我也尝试将两个标题放在一个字符串中,但我使用的任何换行符(\ r \ n,\ r \ n等)都不起作用。

有人可以帮我弄清楚如何使用包含的头文件正确编写此命令吗?


6059
2017-11-15 10:43


起源

只是好奇:你是否也尝试使用两个单独的 -headers "<foo>\r\n" 选项,每个都有自己的 \r\n 在选项参数字符串的末尾? - Jameson
是。它没用。我想我尝试了重复斜杠,连接标题等的完整矩阵。 - Lizozom
发送它们时遇到的问题具体是什么?接收器有什么作用? - Jameson
实际上我只是设置了一个小的本地服务器进行测试 - 而且似乎我永远无法发送任何标题(即使它只是一个标题) - Lizozom
我的目标只是计算视频文件的md5,所以这就是我需要的命令。我像你一样运行跟踪,但我没有看到我的标题是在请求中发送的。 - Lizozom


答案:


简答

确保您使用的是最新版本 ffmpeg,并使用 -user-agent 选项。

更长的答案

为了调试,我设置了一个 BaseHTTPSever 跑来跑去 127.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 正在设置它自己。但是有一个选择 -user-agent 至 ffmpeg,当我更换 -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

最后一点。关于trac中的头文件bug有很多讨论 ffmpeg。我上面已经观察到的(基本上是它  工作,也许是一个小的命令改变)是一个相当新的版本:

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


8
2017-11-15 11:53



bravo,我将指的是关于建立我自己的测试的想法。谢谢!!! - shellter
@shellter非常高兴它很有帮助! - Jameson
<3 python :)谢谢 - Lizozom
@Lizozom很棒,很高兴我们得到了它! - Jameson
以下是任何HTTP标头的示例命令。 jokecamp.com/blog/passing-http-headers-to-ffmpeg - kampsj


好吧,ffmpeg手册说要通过CRLF拆分多个http-header。问题是你用第二个“-header”覆盖你的第一个“-header”参数,因为只能有一个“-header”参数。

对于您的示例,您需要通过有效的CRLF将User-Agent和X-Forwarded加入到一个参数中,如下所示: -header“User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 46.0.2490.80 Safari / 537.36”$'\ r \ n'“X-Forwarded-For:13.14 .15.66" $ '\ r \ n'


7
2017-11-30 11:13





对于集合 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
2018-01-04 18:03