2

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?

2 Answers 2

1

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.

1
  • What kind of latency do you get when streaming like this? Commented Mar 28, 2016 at 15:30
0

I am using this configuration and it's working well server.conf file:

HTTPPort 1235
RTSPPort 1234
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 100000
#CustomLog –
#########################################
## usb cam:  logitec c920
#########################################
<Feed camfeed.ffm>
    File /tmp/camfeed.ffm
    FileMaxSize 500K
    #allow only localhost to publish feed
    ACL allow 192.168.1.149
</Feed>


<Stream usbcam.mov>
    Feed camfeed.ffm
    Format rtp

    #cam defaults:
    VideoSize 800x600
    VideoFrameRate 24
    VideoBitRate 400
    VideoCodec libx264

    NoLoop
    NoAudio
    Preroll 0
    StartSendOnKey
</Stream>

######################################
# ffmpeg cmd:
######################################
# ffmpeg -y -s 800x600 -f video4linux2 -i /dev/video0 -c:v libx264 -tune zerolatency -an http://192.168.1.149:1235/camfeed.ffm
3
  • Some detail of why specific value are choosen would have been welcome. Commented Jul 4, 2016 at 8:51
  • 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). Commented Jul 4, 2016 at 9:21
  • sudo ffprobe -show_streams -show_format -f video4linux2 /dev/video0 this is what you need Commented Jul 5, 2016 at 13:11

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.