title: Crossdevice encoding static file to stream in browser using FFMPEG (segmented h264 ?)
body: <p>I'm building a mediacenter application in NodeJS which is going pretty ok. 
  (you can check it out on Github: <a href="https://github.com/jansmolders86/mediacenterjs" rel="noreferrer">https://github.com/jansmolders86/mediacenterjs</a> )</p>
  
  <p>I'm using FFMPEG to transcode local (static) movies to a stream which I then send to the browser.</p>
  
  <p>At first I used h264 with Flash which worked in browsers, but I really need it to work on Android an iOS (so no Flash) and preferably working on a Raspberry Pi.</p>
  
  <p>But getting it to play on all devices is driving me absolutely insane!</p>
  
  <p>I have all these bits of the puzzle I've gathered from countless hours reading articles, tutorials and stack overflow posts, which led me to the conclusion that I need to produce the following:</p>
  
  <blockquote>
    <ul>
    <li>Use video codec H264 to transcode to MP4</li>
    <li>Move the moovatom '-movflags' to make a MP4 streamable</li>
    <li>Segment the stream so Apple can play the stream as well.</li>
    </ul>
  </blockquote>
  
  <p>But getting nowhere with this. Every time I produce a series of FFMPEG settings that either don't work, or work on some devices rather than all. </p>
  
  <p>Some of my failed attempt where:</p>
  
  <p>My flash attempt -> <strong>Main problem (not running in IOS):</strong></p>
  
  <pre><code>    '-y','-ss 0','-b 800k','-vcodec libx264','-acodec mp3'\ 
      '-ab 128','-ar 44100','-bufsize 62000', '-maxrate 620k'\
      metaDuration,tDuration,'-f flv
  </code></pre>
  
  <p>my HLS attempt -> <strong>Main problem (not running in browser):</strong></p>
  
  <pre><code>        '-r 15','-b:v 128k','-c:v libx264','-x264opts level=41'\
          '-threads 4','-s 640x480','-map 0:v','-map 0:a:0','-c:a mp3'\
          '-b:a 160000','-ac 2','-f hls','-hls_time 10','-hls_list_size 6'\
          '-hls_wrap 18','-start_number 1'
  </code></pre>
  
  <p>My MP4 attempt -> <strong>Main problem (duration is shortened and the later part of the video is speeding by)</strong></p>
  
  <pre><code>       '-y','-ss 0','-b 800k','-vcodec libx264','-acodec mp3'\
         '-ab 128','-ar 44100','-bufsize 62000', '-maxrate 620k'\
         metaDuration,tDuration,'-f mp4','-movflags','frag_keyframe+empty_moov'
  </code></pre>
  
  <p>Second MP4 attempt: -> <strong>Main problem (duration is shortened and the later part of the video is speeding by)</strong></p>
  
  <pre><code>    '-y','-vcodec libx264','-pix_fmt yuv420p','-b 1200k','-flags +loop+mv4'\
      '-cmp 256','-partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8'\
      '-me_method hex','-subq 7','-trellis 1','-refs 5','-bf 3','-coder 1'\
      '-me_range 16','-g 150','-keyint_min 25','-sc_threshold 40'\
      '-i_qfactor 0.71','-acodec mp3','-qmin 10','-qdiff 4','-qmax 51'\
      '-ab 128k','-ar 44100','-threads 2','-f mp4','-movflags','frag_keyframe+empty_moov'])
  </code></pre>
  
  <p>Here is an example of the FFMPEG log running with these settings:</p>
  
  <pre><code>        file conversion error ffmpeg version N-52458-gaa96439 Copyright (c) 2000-2013 the FFmpeg developers
            built on Apr 24 2013 22:19:32 with gcc 4.8.0 (GCC)
            configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --e
          nable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable
          -libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --ena
          ble-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwola
          me --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enabl
          e-libxvid --enable-zlib
            libavutil      52. 27.101 / 52. 27.101
            libavcodec     55.  6.100 / 55.  6.100
            libavformat    55.  3.100 / 55.  3.100
            libavdevice    55.  0.100 / 55.  0.100
            libavfilter     3. 60.101 /  3. 60.101
            libswscale      2.  2.100 /  2.  2.100
            libswresample   0. 17.102 /  0. 17.102
            libpostproc    52.  3.100 / 52.  3.100
          [avi @ 02427900] non-interleaved AVI
          Guessed Channel Layout for  Input Stream #0.1 : mono
          Input #0, avi, from 'C:/temp/the avengers.avi':
            Duration: 00:00:34.00, start: 0.000000, bitrate: 1433 kb/s
              Stream #0:0: Video: cinepak (cvid / 0x64697663), rgb24, 320x240, 15 tbr, 15 tbn, 15 tbc
              Stream #0:1: Audio: pcm_u8 ([1][0][0][0] / 0x0001), 22050 Hz, mono, u8, 176 kb/s
          Please use -b:a or -b:v, -b is ambiguous
          [libx264 @ 02527c60] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
          [libx264 @ 02527c60] profile High, level 2.0
          [libx264 @ 02527c60] 264 - core 130 r2274 c832fe9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x26
          4.html - options: cabac=1 ref=5 deblock=1:0:0 analyse=0x3:0x133 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=2 lookahead_threads=1 sliced_th
          reads=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 we
          ightb=1 open_gop=0 weightp=2 keyint=150 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=120
          0 ratetol=1.0 qcomp=0.60 qpmin=10 qpmax=51 qpstep=4 ip_ratio=1.41 aq=1:1.00
          Output #0, mp4, to 'pipe:1':
            Metadata:
              encoder         : Lavf55.3.100
              Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 320x240, q=10-51, 1200 kb/s, 15360 tbn, 15 tbc
              Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 44100 Hz, mono, s16p, 128 kb/s
          Stream mapping:
            Stream #0:0 -&gt; #0:0 (cinepak -&gt; libx264)
            Stream #0:1 -&gt; #0:1 (pcm_u8 -&gt; libmp3lame)
          Press [q] to stop, [?] for help
          frame=  106 fps=0.0 q=10.0 size=       1kB time=00:00:06.94 bitrate=   1.4kbits/s
          frame=  150 fps=149 q=14.0 size=       1kB time=00:00:09.87 bitrate=   1.0kbits/s
          frame=  191 fps=126 q=16.0 size=       1kB time=00:00:12.61 bitrate=   0.8kbits/s
          frame=  244 fps=121 q=16.0 size=    2262kB time=00:00:16.14 bitrate=1147.6kbits/s
          frame=  303 fps=120 q=14.0 size=    2262kB time=00:00:20.08 bitrate= 922.2kbits/s
          frame=  354 fps=117 q=15.0 size=    3035kB time=00:00:23.48 bitrate=1058.6kbits/s
          frame=  402 fps=113 q=15.0 size=    3035kB time=00:00:26.67 bitrate= 932.1kbits/s
          frame=  459 fps=113 q=16.0 size=    4041kB time=00:00:30.43 bitrate=1087.7kbits/s
          frame=  510 fps=103 q=2686559.0 Lsize=    5755kB time=00:00:33.93 bitrate=1389.3kbits/s
  
          video:5211kB audio:531kB subtitle:0 global headers:0kB muxing overhead 0.235111%
          [libx264 @ 02527c60] frame I:6     Avg QP:10.55  size: 25921
          [libx264 @ 02527c60] frame P:245   Avg QP:12.15  size: 14543
          [libx264 @ 02527c60] frame B:259   Avg QP:15.55  size:  6242
          [libx264 @ 02527c60] consecutive B-frames:  6.1% 73.7% 14.7%  5.5%
          [libx264 @ 02527c60] mb I  I16..4: 19.9%  6.2% 73.9%
          [libx264 @ 02527c60] mb P  I16..4:  6.0%  0.2% 12.0%  P16..4: 35.4%  9.6% 16.3%  7.0%  5.6%    skip: 7.8%
          [libx264 @ 02527c60] mb B  I16..4:  0.7%  0.0%  4.3%  B16..8: 27.6% 17.2% 17.0%  direct:17.3%  skip:15.9%  L0:39.4% L1:43.2%
          BI:17.4%
          [libx264 @ 02527c60] final ratefactor: 11.41
          [libx264 @ 02527c60] 8x8 transform intra:1.6% inter:4.0%
          [libx264 @ 02527c60] coded y,uvDC,uvAC intra: 93.0% 97.0% 94.9% inter: 58.4% 58.7% 50.6%
          [libx264 @ 02527c60] i16 v,h,dc,p: 15% 26% 54%  5%
          [libx264 @ 02527c60] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 17% 39%  4%  4%  3%  1%  6%  9%
          [libx264 @ 02527c60] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 28% 34% 21%  4%  2%  2%  2%  2%  5%
          [libx264 @ 02527c60] i8c dc,h,v,p: 51% 24% 19%  6%
          [libx264 @ 02527c60] Weighted P-Frames: Y:4.1% UV:1.2%
          [libx264 @ 02527c60] ref P L0: 68.2%  9.8% 11.0%  5.6%  4.6%  0.8%  0.0%
          [libx264 @ 02527c60] ref B L0: 87.7%  8.0%  3.9%  0.4%
          [libx264 @ 02527c60] ref B L1: 97.8%  2.2%
          [libx264 @ 02527c60] kb/s:1255.36
  </code></pre>
  
  <p>Lastly this is my node code fireing up FFMPEG. (I use the module Fluent-ffmpeg: <a href="https://github.com/schaermu/node-fluent-ffmpeg" rel="noreferrer">https://github.com/schaermu/node-fluent-ffmpeg</a> )</p>
  
  <pre><code>    var proc = new ffmpeg({ source: movie, nolog: true, timeout:15000})                         
          .addOptions(['-r 15','-b:v 128k','-c:v libx264','-x264opts level=41','-threads 4','-s 640x480','-map 0:v','-map 0:a:0','-c:a mp3','-b:a 160000','-ac 2','-f hls','-hls_time 10','-hls_list_size 6','-hls_wrap 18','-start_number 1 stream.m3u8'])
          .writeToStream(res, function(retcode, error){
              if (!error){
                  console.log('file has been converted succesfully',retcode .green);
              }else{
                  console.log('file conversion error',error .red);
              }
          });
  </code></pre>
  
  <p><strong>So to conclude this very long and code heavy question:</strong></p>
  
  <p>I hope this does not come off as a lazy request, but could someone show/explain to me which FFMPEG settings could/should work on all platforms (modern browsers, Android and iOS) producing a stream of a static file which I can send to a HTML5 player.</p>
  
  <p><strong>[EDIT] what I need if a generic option isn't available</strong> </p>
  
  <p>And if this is not possible as some posts might suggest, I would love to see a set of FFMPEG settings that get's the job done properly as far as mp4 streaming is concerned. (e.g encoding a streamable mp4).</p>
  
  <p>The streaming mp4 needs the following</p>
  
  <blockquote>
    <ul>
    <li>A shifted moovAtom </li>
    <li>It needs to be h264</li>
    </ul>
  </blockquote>
  
  <p>Thanks very much for your help!</p>