I need to pass http headers (user agent and ip) to an ffmpeg command.
I use the following command:
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 "" And I run a local node.js server to see the headers I get:
'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); I keep getting an error saying "No trailing CRLF found in HTTP header." and the request is stuck.
If I drop the headers - everything works normally.
I also tried putting both headers in one string, but any line breaking character I used (\r\n, \r\n, etc.) didn't work.
Can someone help me figure out how to write this command correctly with the headers included?
93 Answers
Short Answer
Make sure you're using the latest ffmpeg, and use the -user-agent option.
Longer Answer
For debugging, I setup a BaseHTTPSever running at 127.0.0.1:8080 with do_GET() as:
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) With that running, this enabled me to run your command like:
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 "" \ -v trace When I do this, I see the following relevant output from 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'. On the server, I saw:
User-Agent: Lavf/56.40.101 X-Forwarded-For: 13.14.15.66 So it looks like ffmpeg is setting it's own. But there is an option -user-agent to ffmpeg, and when I replaced -headers "User-Agent: <foo>" with -user-agent "<foo>", I then did see it too on the server, alongside the X-Forwarded-For 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 Last note. There are lots of discussions around headers bugs in trac for ffmpeg. What I have observed above (that essentially it is working, perhaps with a small command change) was with a fairly recent version:
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 So, your next move might be make sure you have the latest version of ffmpeg.
Well, ffmpeg manual says to split multiple http-headers by CRLF. The problem is that you overwrite your first "-header" argument with the second "-header" as there can be only one "-header" argument.
For your example, you need to join User-Agent and X-Forwarded into one argument by valid CRLF like this:
-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'
For set x:1 and y:2 for header ffmpeg request, use this:
ffmpeg -headers $'x:1\r\ny:2\r\n' -i ' -y 'sample.mp4' -v debug Result:
[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