FFServer streaming H.264 from Logitech C920

18,657

I've been playing with ffmpeg and logitech C920 camera on my OpenWRT router (TP-Link WDR3600, MIPS cpu at 560 mHz) using your config. At 640x480 and above my system didn't work reliably. I tried launching ffmpeg alone without transcoding (my router isn't capable of any transcoding at all, too weak CPU) and watching the stream with VLC:

ffmpeg -f v4l2 -input_format h264 -video_size 320x400 -i /dev/video0 -copyinkf -codec copy -f mpegts udp://192.168.1.100:20000

At 640x480 video was getting distorted, 800x600 or better resolutions did't work at all, with ffmpeg giving tons of these "Non-monotonous DTS ..." messages. 320x400 was OK. MJPEG video output worked much better and i was able to run C920 at 1920x1080 and 15 fps, with data rates higher than 50 Mbit/s, but MJPEG wasn't 100% error-free either. Looks like the camera have some problems at H264, at least with ffmpeg. At H264 the camera gave constant bitrate of around 3.2 Mbit/s no matter which resolution/framerate i was trying to set.

But back to business. To get h264 working with ffserver i modified your Feed section, by altering "Format" and commenting out StartSendOnKey in the "stream" section:

Format mpegts
...
#StartSendOnKey

by adding ffmpeg "Launch" string in the "Feed" section:

Launch ffmpeg -f v4l2 -input_format h264 -video_size 320x400 -i /dev/video0 -copyinkf -codec copy

and changing MaxBandwidth to 50000

I used vlc as client software.

Share:
18,657

Related videos on Youtube

slm
Author by

slm

Worked in the tech field for over 20+ years. Started out learning basic on an Apple IIe then on a TRS-80. Been interested in computer hardware and software my entire life. Consider myself lucky that my hobby as a kid/adult is what I get to do everyday earning a living. You can learn more about me here. ============================================================ Stolen from @Mokubai: First, please put down the chocolate-covered banana and step away from the European currency systems. You may consider how to ask a question.

Updated on September 18, 2022

Comments

  • slm
    slm almost 2 years

    I'm having some trouble trying to implement a web live stream from my Logitech C920 webcam w/ H.264 encoding using ffmpeg/ffserver.

    Here is the configuration file I'm using for the ffserver:

    # Port on which the server is listening. You must select a different
    # port from your standard HTTP web server if it is running on the same
    # computer.
    Port 8090
    
    # Address on which the server is bound. Only useful if you have
    # several network interfaces.
    BindAddress 0.0.0.0
    
    # Number of simultaneous HTTP connections that can be handled. It has
    # to be defined *before* the MaxClients parameter, since it defines the
    # MaxClients maximum limit.
    MaxHTTPConnections 2000
    
    # Number of simultaneous requests that can be handled. Since FFServer
    # is very fast, it is more likely that you will want to leave this high
    # and use MaxBandwidth, below.
    MaxClients 1000
    
    # This the maximum amount of kbit/sec that you are prepared to
    # consume when streaming to clients.
    MaxBandwidth 1000
    
    # Access log file (uses standard Apache log file format)
    # '-' is the standard output.
    CustomLog -
    
    ##################################################################
    # Definition of the live feeds. Each live feed contains one video
    # and/or audio sequence coming from an ffmpeg encoder or another
    # ffserver. This sequence may be encoded simultaneously with several
    # codecs at several resolutions.
    
    <Feed feed.ffm>
    
    # You must use 'ffmpeg' to send a live feed to ffserver. In this
    # example, you can type:
    #
    
    File /tmp/feed.ffm
    FileMaxSize 100M
    
    # You could specify
    # ReadOnlyFile /saved/specialvideo.ffm
    # This marks the file as readonly and it will not be deleted or updated.
    
    # Only allow connections from localhost to the feed.
    ACL allow 127.0.0.1
    
    </Feed>
    
    
    ##################################################################
    # Now you can define each stream which will be generated from the
    # original audio and video stream. Each format has a filename (here
    # 'test1.mpg'). FFServer will send this stream when answering a
    # request containing this filename.
    
    <stream stream.mp4>
    
    Feed feed.ffm
    Format mp4
    
    # Audio settings
    NoAudio
    
    # Video Settings
    #VideoSize 1280x720                      # Video resolution
    #VideoFrameRate 30                      # Video FPS
    #AVOptionVideo flags +global_header          # Parameters passed to encoder
    #AVOptionVideo cpu-used 0
    #AVOptionVideo qmin 10
    #AVOptionVideo qmax 42
    #AVOptionVideo quality good
    PreRoll 0
    StartSendOnKey
    #VideoBitRate 400                      # Video bitrate
    
    </stream>
    
    # Server status
    
    <Stream stat.html>
    Format status
    
    # Only allow local people to get the status
    ACL allow localhost
    ACL allow 192.168.0.0 192.168.255.255
    
    </Stream>
    

    And here is the command I'm issuing through the command line and the respective output:

    $ ffmpeg -s 1280x720 -f video4linux2 -r 30 -vcodec h264 -re -i /dev/video0 \
        -copyinkf -codec copy h**p://localhost:8090/feed.ffm
    
    ffmpeg version N-67036-g04a4fb8 Copyright (c) 2000-2014 the FFmpeg developers
      built on Oct 20 2014 17:39:50 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
      configuration: --enable-gpl --enable-libx264
      libavutil      54. 10.100 / 54. 10.100
      libavcodec     56.  8.102 / 56.  8.102
      libavformat    56.  9.101 / 56.  9.101
      libavdevice    56.  1.100 / 56.  1.100
      libavfilter     5.  2.100 /  5.  2.100
      libswscale      3.  1.101 /  3.  1.101
      libswresample   1.  1.100 /  1.  1.100
      libpostproc    53.  3.100 / 53.  3.100
    Input #0, video4linux2,v4l2, from '/dev/video0':
      Duration: N/A, start: 12614.859199, bitrate: N/A
        Stream #0:0: Video: h264 (Constrained Baseline), yuvj420p(pc), 1280x720 [SAR 1:1 DAR 16:9], -5 kb/s, 30 fps, 30 tbr, 1000k tbn, 60 tbc
    Output #0, ffm, to 'h**p://localhost:8090/feed.ffm':
      Metadata:
        creation_time   : now
        encoder         : Lavf56.9.101
        Stream #0:0: Video: h264, yuvj420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, -5 kb/s, 30 fps, 1000k tbn, 30 tbc
    Stream mapping:
      Stream #0:0 -> #0:0 (copy)
    Press [q] to stop, [?] for help
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 0, current: -166263; changing to 1. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 1, current: -134365; changing to 2. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 2, current: -102381; changing to 3. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 3, current: -66434; changing to 4. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 4, current: -34548; changing to 5. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 5, current: -2645; changing to 6. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 232857, current: 138514; changing to 232858. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 232858, current: 167942; changing to 232859. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 232859, current: 197415; changing to 232860. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 232860, current: 227037; changing to 232861. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 997959, current: 938599; changing to 997960. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 997960, current: 995052; changing to 997961. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 1240745, current: 1232841; changing to 1240746. This may result in incorrect timestamps in the output file.
    [ffm @ 0x28c7ea0] Non-monotonous DTS in output stream 0:0; previous: 1293561, current: 1282157; changing to 1293562. This may result in incorrect timestamps in the output file.
    frame=   69 fps= 34 q=-1.0 Lsize=     912kB time=00:00:02.01 bitrate=3702.1kbits/s
    

    When I try to play the stream with VLC for example - vlc h**p://localhost:8090/stream.mp4 - I get the following error:

    [00007f5234003948] core stream error: cannot pre fill buffer

    And I can't watch the stream on the web browser side either.

    Could someone give me an hint on this?

  • bugmenot123
    bugmenot123 over 8 years
    What kind of latency do you get when streaming like this?
  • Арсений Черенков
    Арсений Черенков about 8 years
    Some detail of why specific value are choosen would have been welcome.
  • SOFuser
    SOFuser about 8 years
    I managed to capture a sample video using ffmpeg with its default configuration then tried to optimize parameters. I got the best output with those (cam defaults).