title: HTTP Livestreaming with ffmpeg
body: <p>Some context: I have an MKV file, I am attempting to stream it to <a href="http://localhost:8090/test.flv" rel="nofollow">http://localhost:8090/test.flv</a> as an flv file.</p>
  
  <p>The stream begins and then immediately ends.</p>
  
  <p>The command I am using is:</p>
  
  <pre><code>sudo ffmpeg -re -i input.mkv -c:v libx264 -maxrate 1000k -bufsize 2000k -an -bsf:v h264_mp4toannexb -g 50 http://localhost:8090/test.flv
  </code></pre>
  
  <p>A breakdown of what I believe these options do incase this post becomes useful for someone else:</p>
  
  <pre><code>sudo
  </code></pre>
  
  <p>Run as root</p>
  
  <pre><code>ffmpeg
  </code></pre>
  
  <p>The stream command thingy</p>
  
  <pre><code>-re
  </code></pre>
  
  <p>Stream in real-time</p>
  
  <pre><code>-i input.mkv
  </code></pre>
  
  <p>Input option and path to input file</p>
  
  <pre><code>-c:v libx264
  </code></pre>
  
  <p>Use codec libx264 for conversion</p>
  
  <pre><code>-maxrate 1000k -bufsize 2000k
  </code></pre>
  
  <p>No idea, some options for conversion, seems to help</p>
  
  <pre><code>-an -bsf:v h264_mp4toannexb
  </code></pre>
  
  <p>Audio options I think, not sure really. Also seems to help</p>
  
  <pre><code>-g 50
  </code></pre>
  
  <p>Still no idea, maybe frame rateframerateframerateframerate?</p>
  
  <pre><code>http://localhost:8090/test.flv
  </code></pre>
  
  <p>Output using http protocol to localhost on port 8090 as a file called test.flv</p>
  
  <p><strong>Anyway the actual issue I have is that it begins to stream for about a second and then immediately ends.</strong></p>
  
  <p><strong>The mpeg command result:</strong></p>
  
  <pre><code>ffmpeg version N-80901-gfebc862 Copyright (c) 2000-2016 the FFmpeg developers
    built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
    configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --mandir=/usr/share/man --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libfreetype --enable-gnutls --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvidstab
    libavutil      55. 28.100 / 55. 28.100
    libavcodec     57. 48.101 / 57. 48.101
    libavformat    57. 41.100 / 57. 41.100
    libavdevice    57.  0.102 / 57.  0.102
    libavfilter     6. 47.100 /  6. 47.100
    libavresample   3.  0.  0 /  3.  0.  0
    libswscale      4.  1.100 /  4.  1.100
    libswresample   2.  1.100 /  2.  1.100
    libpostproc    54.  0.100 / 54.  0.100
  Input #0, matroska,webm, from 'input.mkv':
    Metadata:
      encoder         : libebml v1.3.0 + libmatroska v1.4.0
      creation_time   : 1970-01-01 00:00:02
    Duration: 00:01:32.26, start: 0.000000, bitrate: 4432 kb/s
      Stream #0:0(eng): Video: h264 (High 10), yuv420p10le, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
      Stream #0:1(nor): Audio: flac, 48000 Hz, stereo, s16 (default)
  [libx264 @ 0x2e1c380] using SAR=1/1
  [libx264 @ 0x2e1c380] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
  [libx264 @ 0x2e1c380] profile High, level 4.0
  [libx264 @ 0x2e1c380] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=50 keyint_min=5 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=1000 vbv_bufsize=2000 crf_max=0.0 nal_hrd=none filler=0 ip_ratio=1.40 aq=1:1.00
  [flv @ 0x2e3f0a0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
  Output #0, flv, to 'http://localhost:8090/test.flv':
    Metadata:
      encoder         : Lavf57.41.100
      Stream #0:0(eng): Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 23.98 fps, 1k tbn, 23.98 tbc (default)
      Metadata:
        encoder         : Lavc57.48.101 libx264
      Side data:
        cpb: bitrate max/min/avg: 1000000/0/0 buffer size: 2000000 vbv_delay: -1
  Stream mapping:
    Stream #0:0 -&gt; #0:0 (h264 (native) -&gt; h264 (libx264))
  Press [q] to stop, [?] for help
  Killed   26 fps= 26 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=   0x  
  </code></pre>
  
  <p><strong>The ffserver outputs:</strong></p>
  
  <pre><code>Sat Aug 20 12:40:11 2016 File '/test.flv' not found
  Sat Aug 20 12:40:11 2016 [SERVER IP] - - [POST] "/test.flv HTTP/1.1" 404 189
  </code></pre>
  
  <p><strong>The config file is:</strong></p>
  
  <pre><code>#Sample ffserver configuration file
  
  # 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 -
  
  # Suppress that if you want to launch ffserver as a daemon.
  #NoDaemon
  
  
  ##################################################################
  # 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.
  
  &lt;Feed feed1.ffm&gt;
  
  ACL allow 192.168.0.0 192.168.255.255
  
  # You must use 'ffmpeg' to send a live feed to ffserver. In this
  # example, you can type:
  #
  #ffmpeg http://localhost:8090/test.ffm
  
  # ffserver can also do time shifting. It means that it can stream any
  # previously recorded live stream. The request should contain:
  # "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify
  # a path where the feed is stored on disk. You also specify the
  # maximum size of the feed, where zero means unlimited. Default:
  # File=/tmp/feed_name.ffm FileMaxSize=5M
  File /tmp/feed1.ffm
  FileMaxSize 200m
  
  # You could specify
  # ReadOnlyFile /saved/specialvideo.ffm
  # This marks the file as readonly and it will not be deleted or updated.
  
  # Specify launch in order to start ffmpeg automatically.
  # First ffmpeg must be defined with an appropriate path if needed,
  # after that options can follow, but avoid adding the http:// field
  #Launch ffmpeg
  
  # Only allow connections from localhost to the feed.
      ACL allow 127.0.0.1
  
  &lt;/Feed&gt;
  
  
  ##################################################################
  # 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.
  
  &lt;Stream test1.mpg&gt;
  
  # coming from live feed 'feed1'
  Feed feed1.ffm
  
  # Format of the stream : you can choose among:
  # mpeg       : MPEG-1 multiplexed video and audio
  # mpegvideo  : only MPEG-1 video
  # mp2        : MPEG-2 audio (use AudioCodec to select layer 2 and 3 codec)
  # ogg        : Ogg format (Vorbis audio codec)
  # rm         : RealNetworks-compatible stream. Multiplexed audio and video.
  # ra         : RealNetworks-compatible stream. Audio only.
  # mpjpeg     : Multipart JPEG (works with Netscape without any plugin)
  # jpeg       : Generate a single JPEG image.
  # asf        : ASF compatible streaming (Windows Media Player format).
  # swf        : Macromedia Flash compatible stream
  # avi        : AVI format (MPEG-4 video, MPEG audio sound)
  Format mpeg
  
  # Bitrate for the audio stream. Codecs usually support only a few
  # different bitrates.
  AudioBitRate 32
  
  # Number of audio channels: 1 = mono, 2 = stereo
  AudioChannels 2
  
  # Sampling frequency for audio. When using low bitrates, you should
  # lower this frequency to 22050 or 11025. The supported frequencies
  # depend on the selected audio codec.
  AudioSampleRate 44100
  
  # Bitrate for the video stream
  VideoBitRate 64
  
  # Ratecontrol buffer size
  VideoBufferSize 40
  
  # Number of frames per second
  VideoFrameRate 3
  
  # Size of the video frame: WxH (default: 160x128)
  # The following abbreviations are defined: sqcif, qcif, cif, 4cif, qqvga,
  # qvga, vga, svga, xga, uxga, qxga, sxga, qsxga, hsxga, wvga, wxga, wsxga,
  # wuxga, woxga, wqsxga, wquxga, whsxga, whuxga, cga, ega, hd480, hd720,
  # hd1080
  VideoSize hd1080
  
  # Transmit only intra frames (useful for low bitrates, but kills frame rate).
  #VideoIntraOnly
  
  # If non-intra only, an intra frame is transmitted every VideoGopSize
  # frames. Video synchronization can only begin at an intra frame.
  VideoGopSize 12
  
  # More MPEG-4 parameters
  # VideoHighQuality
  # Video4MotionVector
  
  # Choose your codecs:
  #AudioCodec mp2
  #VideoCodec mpeg1video
  
  # Suppress audio
  #NoAudio
  
  # Suppress video
  #NoVideo
  
  #VideoQMin 3
  #VideoQMax 31
  
  # Set this to the number of seconds backwards in time to start. Note that
  # most players will buffer 5-10 seconds of video, and also you need to allow
  # for a keyframe to appear in the data stream.
  #Preroll 15
  
  # ACL:
  
  # You can allow ranges of addresses (or single addresses)
  ACL ALLOW localhost
  
  # You can deny ranges of addresses (or single addresses)
  #ACL DENY &lt;first address&gt; 
  
  # You can repeat the ACL allow/deny as often as you like. It is on a per
  # stream basis. The first match defines the action. If there are no matches,
  # then the default is the inverse of the last ACL statement.
  #
  # Thus 'ACL allow localhost' only allows access from localhost.
  # 'ACL deny 1.0.0.0 1.255.255.255' would deny the whole of network 1 and
  # allow everybody else.
  
  &lt;/Stream&gt;
  
  
  ##################################################################
  # Example streams
  
  
  # Multipart JPEG
  
  #&lt;Stream test.mjpg&gt;
  #Feed feed1.ffm
  #Format mpjpeg
  #VideoFrameRate 2
  #VideoIntraOnly
  #NoAudio
  #Strict -1
  #&lt;/Stream&gt;
  
  
  # Single JPEG
  
  #&lt;Stream test.jpg&gt;
  #Feed feed1.ffm
  #Format jpeg
  #VideoFrameRate 2
  #VideoIntraOnly
  ##VideoSize 352x240
  #NoAudio
  #Strict -1
  #&lt;/Stream&gt;
  
  
  # Flash
  
  #&lt;Stream test.swf&gt;
  #Feed feed1.ffm
  #Format swf
  #VideoFrameRate 2
  #VideoIntraOnly
  #NoAudio
  #&lt;/Stream&gt;
  
  
  # ASF compatible
  
  &lt;Stream test.asf&gt;
  Feed feed1.ffm
  Format asf
  VideoFrameRate 15
  VideoSize 352x240
  VideoBitRate 256
  VideoBufferSize 40
  VideoGopSize 30
  AudioBitRate 64
  StartSendOnKey
  &lt;/Stream&gt;
  
  
  # MP3 audio
  
  #&lt;Stream test.mp3&gt;
  #Feed feed1.ffm
  #Format mp2
  #AudioCodec mp3
  #AudioBitRate 64
  #AudioChannels 1
  #AudioSampleRate 44100
  #NoVideo
  #&lt;/Stream&gt;
  
  
  # Ogg Vorbis audio
  
  #&lt;Stream test.ogg&gt;
  #Feed feed1.ffm
  #Title "Stream title"
  #AudioBitRate 64
  #AudioChannels 2
  #AudioSampleRate 44100
  #NoVideo
  #&lt;/Stream&gt;
  
  
  # Real with audio only at 32 kbits
  
  #&lt;Stream test.ra&gt;
  #Feed feed1.ffm
  #Format rm
  #AudioBitRate 32
  #NoVideo
  #NoAudio
  #&lt;/Stream&gt;
  
  
  # Real with audio and video at 64 kbits
  
  #&lt;Stream test.rm&gt;
  #Feed feed1.ffm
  #Format rm
  #AudioBitRate 32
  #VideoBitRate 128
  #VideoFrameRate 25
  #VideoGopSize 25
  #NoAudio
  #&lt;/Stream&gt;
  
  
  ##################################################################
  # A stream coming from a file: you only need to set the input
  # filename and optionally a new format. Supported conversions:
  #    AVI -&gt; ASF
  
  #&lt;Stream file.rm&gt;
  #File "/usr/local/httpd/htdocs/tlive.rm"
  #NoAudio
  #&lt;/Stream&gt;
  
  #&lt;Stream file.asf&gt;
  #File "/usr/local/httpd/htdocs/test.asf"
  #NoAudio
  #Author "Me"
  #Copyright "Super MegaCorp"
  #Title "Test stream from disk"
  #Comment "Test comment"
  #&lt;/Stream&gt;
  
  
  ##################################################################
  # RTSP examples
  #
  # You can access this stream with the RTSP URL:
  #   rtsp://localhost:5454/test1-rtsp.mpg
  #
  # A non-standard RTSP redirector is also created. Its URL is:
  #   http://localhost:8090/test1-rtsp.rtsp
  
  #&lt;Stream test1-rtsp.mpg&gt;
  #Format rtp
  #File "/usr/local/httpd/htdocs/test1.mpg"
  #&lt;/Stream&gt;
  
  
  # Transcode an incoming live feed to another live feed,
  # using libx264 and video presets
  
  #&lt;Stream live.h264&gt;
  #Format rtp
  #Feed feed1.ffm
  #VideoCodec libx264
  #VideoFrameRate 24
  #VideoBitRate 100
  #VideoSize 480x272
  #AVPresetVideo default
  #AVPresetVideo baseline
  #AVOptionVideo flags +global_header
  #
  #AudioCodec libfaac
  #AudioBitRate 32
  #AudioChannels 2
  #AudioSampleRate 22050
  #AVOptionAudio flags +global_header
  #&lt;/Stream&gt;
  
  ##################################################################
  # SDP/multicast examples
  #
  # If you want to send your stream in multicast, you must set the
  # multicast address with MulticastAddress. The port and the TTL can
  # also be set.
  #
  # An SDP file is automatically generated by ffserver by adding the
  # 'sdp' extension to the stream name (here
  # http://localhost:8090/test1-sdp.sdp). You should usually give this
  # file to your player to play the stream.
  #
  # The 'NoLoop' option can be used to avoid looping when the stream is
  # terminated.
  
  #&lt;Stream test1-sdp.mpg&gt;
  #Format rtp
  #File "/usr/local/httpd/htdocs/test1.mpg"
  #MulticastAddress 224.124.0.1
  #MulticastPort 5000
  #MulticastTTL 16
  #NoLoop
  #&lt;/Stream&gt;
  
  
  ##################################################################
  # Special streams
  
  # Server status
  
  &lt;Stream stat.html&gt;
  Format status
  
  # Only allow local people to get the status
  ACL allow localhost
  ACL allow 192.168.0.0 192.168.255.255
  
  #FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico
  &lt;/Stream&gt;
  
  
  # Redirect index.html to the appropriate site
  
  &lt;Redirect index.html&gt;
  URL http://www.ffmpeg.org/
  &lt;/Redirect&gt;
  
  
  #http://www.ffmpeg.org/
  </code></pre>
  
  <p>Any help is greatly appreciated, I will do my best draw a picture of the best answer based on their username.</p>