httpvideocommand-lineffmpeghttp-headers

ffmpeg - How to pass http headers?


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 "http://127.0.0.1" 

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?


Solution

  • 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 "http://127.0.0.1:8080/some_video_file.mp4" \
        -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.