【问题标题】:ffmpeg - How to pass http headers?ffmpeg - 如何传递 http 标头?
【发布时间】:2016-02-16 13:45:39
【问题描述】:

我需要将 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 等)都不起作用。

有人可以帮我弄清楚如何正确编写包含标题的此命令吗?

【问题讨论】:

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

标签: http video command-line ffmpeg http-headers


【解决方案1】:

简答

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

更长的答案

为了调试,我设置了一个在127.0.0.1:8080 运行的BaseHTTPSeverdo_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-agentffmpeg,当我用-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,用户代理为我工作,但是当我尝试设置 IP 时 - 我仍然收到“在 HTTP 标头中找不到尾随 CRLF”。错误
  • 升级ffmpeg版本解决了第二个问题。我接受答案。
  • @Lizozom 太棒了,很高兴我们得到了它!
  • 这里是任何 HTTP 标头的示例命令。 jokecamp.com/blog/passing-http-headers-to-ffmpeg
【解决方案2】:

嗯,ffmpeg 手册说通过 CRLF 拆分多个 http-headers。问题是你用第二个“-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'

【讨论】:

    【解决方案3】:

    要设置 x:1y: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
    

    【讨论】:

    • 看来顺序也很重要。如果您将 -i 放在 -headers 之前,它们将被忽略。 -headers 首先运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2019-06-15
    • 2011-11-27
    • 2015-05-17
    • 2018-10-23
    相关资源
    最近更新 更多