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?

9

3 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.

7

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy