linux - FFMpeg convert jpeg images to video

24
2013-08
  • Knetic

    I'm attempting to take a set of images taken at 1-second intervals to form a timelapse video. I figured this would be easy with ffmpeg, but i'm running into cryptic errors.

    All the images are yuv420 jpegs, taken from an android camera. They're saved as individual jpegs in a folder, they're all identically sized and formatted. They are named as a sequence of 7-digit names, starting at zero (so "0000000.jpg" to "0001000.jpg", as an example).

    This is my string (folder names redacted for clarity):

    avconv -r 1 -f image2 -i %07d.jpg -vcodec libx264 -crf 18 -preset slower video.mp4

    Seems great, i see plenty of posts from people who say that works for them.

    However ffmpeg gives me this (bold indicates error)

    ffmpeg version 0.8.5-6:0.8.5-1, Copyright (c) 2000-2012 the Libav developers
      built on Jan 13 2013 12:05:48 with gcc 4.7.2
    *** THIS PROGRAM IS DEPRECATED ***
    This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
    [mjpeg @ 0x233aea0] overread 8
    Input #0, image2, from '%07d.jpg':
      Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
        Stream #0.0: Video: mjpeg, yuvj420p, 640x480 [PAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
    File 'video.mp4' already exists. Overwrite ? [y/N] y
    [buffer @ 0x233b340] w:640 h:480 pixfmt:yuvj420p
    [libx264 @ 0x2339fa0] using SAR=1/1
    [libx264 @ 0x2339fa0] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
    [libx264 @ 0x2339fa0] profile Main, level 3.1
    [libx264 @ 0x2339fa0] 264 - core 123 r2189 35cf912 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=8 deblock=1:0:0 analyse=0x1:0x131 me=umh subme=9 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=2 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=0 b_adapt=2 b_bias=0 direct=3 weightb=0 open_gop=1 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=crf mbtree=1 crf=18.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=1:1.00
    Output #0, mp4, to 'video.mp4':
      Metadata:
        encoder         : Lavf53.21.1
        Stream #0.0: Video: libx264, yuvj420p, 640x480 [PAR 1:1 DAR 4:3], q=-1--1, 25 tbn, 25 tbc
    Stream mapping:
      Stream #0.0 -> #0.0
    Press ctrl-c to stop encoding
    [mjpeg @ 0x233aea0] overread 8
    frame=    0 fps=  0 q=0.0 Lsize=       0kB time=10000000000.00 bitrate=   0.0kbits/s    
    video:0kB audio:0kB global headers:0kB muxing overhead 610.000000%
    

    The import lines (which show up in red) are the ones that say "[mjpeg @ 0x233aea0] overread 8".

    This makes me think that perhaps it's trying to read the images as motion jpegs instead of plain jpeg files, and is failing somehow. I've tried with/without "-f image2", with the same result. And i've also tried using avconv, with the same result.

    I should note that the images are valid, and if i convert them all to *.png (a costly and time-consuming process) the whole thing works. But i'd prefer to just be able to use the jpegs, without an intermediate conversion. After all, that's what ffmpeg is for, transcoding.

    Does anyone have a good way to convert *.jpg to video using ffmpeg?

  • Answers
  • slhck

    [mjpeg @ 0x233aea0] overread 8 is an error that is thrown when ffmpeg tries to read a JPEG image (or a frame from an MJPEG stream) block-by-block, but there are still leftover bits.

    In that case, even though your images might be showing fine in other viewers, it's something FFmpeg can't (or won't) handle. To fix this you need to re-save the images, either as PNGs as you tried before, or as JPEGs. You can do that kind of batch conversion with ImageMagick, for example:

    for f in *.JPG; do mogrify "$f"; done
    

    This would re-save the JPEG files under the same name. Note that you'll lose quality in that process, so it's not ideal and I'd go with PNGs as intermediates as they're lossless.

    By the way: It's always a good idea to use the latest version of FFmpeg, which you can download as a static build (just download, extract, use), or compile yourself. The packages that come with Ubuntu are always outdated, and – depending on your Ubuntu version – not even the "real" FFmpeg, but the Libav fork (which is fine to use, but one should know the difference).

    Don't forget that the images need to have sequential names when you use the %07d.jpg syntax for ffmpeg, without missing numbers. See also the documentation on the image2 muxer for more options.


  • Related Question

    Why does the quality of this video suck when converted with ffmpeg as opposed to mencoder?
  • scompt.com

    screesnshot

    Here's the command line that I'm using for both and the output. Any ideas? The bitrate of the two videos is comparable: both around 1500Kbps.

    ffmpeg command:

    ffmpeg -y -i aud.mp4 -acodec copy -i input.mp4 -ac 2 -vcodec libx264 -s 1280x720 
    -b 1850k -keyint_min 25 -g 250 -deinterlace -coder 1 -trellis 1 -directpred 1
    -b_strategy 1 -bf 3 -refs 3 -subq 5 -me_method hex -me_range 16 
    -partitions +parti8x8+parti4x4+partp8x8+partb8x8 -flags +loop 
    -flags2 +bpyramid+wpred+mixed_refs+dct8x8+fastpskip+mbtree -bufsize 2000k
    -sc_threshold 40 -cmp +chroma -qdiff 4 -qmin 5 -qmax 51 -qcomp 0.6 -i_qfactor 0.71
    -t 0:0:20 -wpredp 2 -r 25 -bt 1500000 output.mp4
    

    ffmpeg output:

    FFmpeg version SVN-r21602, Copyright (c) 2000-2010 Fabrice Bellard, et al.
      built on Feb 24 2010 18:28:53 with gcc 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
      configuration: --prefix=/var/jails/build/ --enable-static --disable-altivec --disable-debug --disable-network --enable-libvorbis --enable-libtheora --enable-libxvid --enable-libx264 --enable-libfaad --enable-libfaac --enable-gpl --disable-ffplay --disable-ffserver --enable-nonfree --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-pthreads --enable-postproc --disable-shared --enable-static --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-avfilter --enable-avfilter-lavf
      libavutil     50. 8. 0 / 50. 8. 0
      libavcodec    52.51. 0 / 52.51. 0
      libavformat   52.50. 0 / 52.50. 0
      libavdevice   52. 2. 0 / 52. 2. 0
      libavfilter    1.17. 0 /  1.17. 0
      libswscale     0. 9. 0 /  0. 9. 0
      libpostproc   51. 2. 0 / 51. 2. 0
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bad.aud.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: M4A mp42isomndia
        encoder         : Nero AAC codec / 1.3.3.0
      Duration: 00:07:24.30, start: 0.000000, bitrate: 90 kb/s
        Stream #0.0(und): Audio: aac, 44100 Hz, stereo, s16, 89 kb/s
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x8b6fe10]max_analyze_duration reached
    
    Seems stream 1 codec frame rate differs from container frame rate: 50.00 (50/1) -> 25.00 (25/1)
    Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'bad.mp4':
      Metadata:
        major_brand     : mp42
        minor_version   : 0
        compatible_brands: mp42isomavc1
        encoder         : Sorenson Squeeze 5.0
      Duration: 00:07:24.32, start: 0.000000, bitrate: 910 kb/s
        Stream #1.0(und): Audio: aac, 48000 Hz, stereo, s16, 320 kb/s
        Stream #1.1(und): Video: h264, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 524 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
        Stream #1.2(und): Data: mp4s / 0x7334706D
        Stream #1.3(und): Data: mp4s / 0x7334706D
        Stream #1.4(eng): Data: rtp  / 0x20707472, 23 kb/s
        Stream #1.5(eng): Data: rtp  / 0x20707472, 34 kb/s
    [libx264 @ 0x8bae2c0]using SAR=1/1
    [libx264 @ 0x8bae2c0]using cpu capabilities: MMX2 SSE2 SSE3 Cache64
    [libx264 @ 0x8bae2c0]profile High, level 3.1
    Output #0, mp4, to 'out.mp4':
        Stream #0.0(und): Video: libx264, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], q=5-51, 1850 kb/s, 25 tbn, 25 tbc
        Stream #0.1(und): Audio: aac, 44100 Hz, stereo, 89 kb/s
    Stream mapping:
      Stream #1.1 -> #0.0
      Stream #0.0 -> #0.1
    Press [q] to stop encoding
    frame=  499 fps= 10 q=-1.0 Lsize=    3514kB time=19.92 bitrate=1445.3kbits/s        
    video:3279kB audio:220kB global headers:0kB muxing overhead 0.432718%
    [libx264 @ 0x8bae2c0]frame I:3     Avg QP: 7.77  size: 66763
    [libx264 @ 0x8bae2c0]frame P:208   Avg QP: 6.89  size: 12756
    [libx264 @ 0x8bae2c0]frame B:288   Avg QP:11.95  size:  1748
    [libx264 @ 0x8bae2c0]consecutive B-frames: 22.0%  1.2%  1.8% 75.0%
    [libx264 @ 0x8bae2c0]mb I  I16..4: 66.1% 10.0% 23.9%
    [libx264 @ 0x8bae2c0]mb P  I16..4:  3.1%  1.4%  1.6%  P16..4: 14.5%  2.0%  1.5%  0.0%  0.0%    skip:75.9%
    [libx264 @ 0x8bae2c0]mb B  I16..4:  1.0%  0.6%  0.2%  B16..8:  2.6%  0.2%  0.2%  direct: 5.7%  skip:89.4%  L0:45.2% L1:46.4% BI: 8.4%
    [libx264 @ 0x8bae2c0]8x8 transform intra:23.9% inter:38.3%
    [libx264 @ 0x8bae2c0]coded y,uvDC,uvAC intra: 38.0% 34.2% 18.6% inter: 4.9% 6.7% 2.1%
    [libx264 @ 0x8bae2c0]i16 v,h,dc,p: 59% 34%  4%  3%
    [libx264 @ 0x8bae2c0]i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 35% 28%  2%  2%  2%  2%  2%  3%
    [libx264 @ 0x8bae2c0]i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 35% 15%  4%  4%  5%  4%  4%  4%
    [libx264 @ 0x8bae2c0]Weighted P-Frames: Y:9.1%
    [libx264 @ 0x8bae2c0]ref P L0: 71.5% 18.0%  3.2%  3.5%  3.7%
    [libx264 @ 0x8bae2c0]ref B L0: 90.3%  7.4%  2.3%
    [libx264 @ 0x8bae2c0]ref B L1: 91.5%  8.5%
    [libx264 @ 0x8bae2c0]kb/s:1345.52
    

    MEncoder command:

    mencoder bad.mp4 -oac pcm -ovc x264 -ofps 25.0 -vf scale=1280:720,harddup
    -o out2.mp4 -srate 48000 -endpos 20
    -x264encopts threads=1:bitrate=1850:vbv_bufsize=2000:bframes=3:frameref=3:subq=5:me=hex:b_pyramid=normal:partitions=all 
    

    MEncoder output:

    MEncoder SVN-r30554-4.1.2 (C) 2000-2010 MPlayer Team
    
    WARNING: OUTPUT FILE FORMAT IS _AVI_. See -of help.
    success: format: 0  data: 0x0 - 0x3036dc5
    libavformat file format detected.
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x8ed2b70]max_analyze_duration reached
    [lavf] Audio stream found, -aid 0
    [lavf] Video stream found, -vid 1
    VIDEO:  [H264]  1280x720  24bpp  25.000 fps  524.0 kbps (64.0 kbyte/s)
    [V] filefmt:44  fourcc:0x34363248  size:1280x720  fps:25.000  ftime:=0.0400
    ==========================================================================
    Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
    AUDIO: 48000 Hz, 2 ch, s16le, 320.0 kbit/20.83% (ratio: 40000->192000)
    Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
    ==========================================================================
    Opening video filter: [expand osd=1]
    Expand: -1 x -1, -1 ; -1, osd: 1, aspect: 0.000000, round: 1
    Opening video filter: [harddup]
    Opening video filter: [scale w=1280 h=720]
    ==========================================================================
    Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
    Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
    ==========================================================================
    Movie-Aspect is 1.78:1 - prescaling to correct movie aspect..000 [0:0]
    [swscaler @ 0x8938400]using unscaled yuv420p -> yuv420p special converter
    x264 [info]: using SAR=1/1
    x264 [info]: using cpu capabilities: MMX2 SSE2 SSE3 Cache64
    x264 [info]: profile High, level 3.1
    New_Face failed. Maybe the font path is wrong.
    Please supply the text font file (~/.mplayer/subfont.ttf).
    subtitle font: load_sub_face failed.
    New_Face failed. Maybe the font path is wrong.
    Please supply the text font file (~/.mplayer/subfont.ttf).
    subtitle font: load_sub_face failed.
    Writing header...1f ( 2%)  0.00fps Trem:   0min   0mb  A-V:0.044 [0:0]]
    ODML: vprp aspect is 16:9.
    Setting audio delay to 0.080s.
    Writing header...
    ODML: vprp aspect is 16:9.
    Setting audio delay to 0.080s.
    Pos:  20.0s    542f ( 8%) 10.06fps Trem:  10min  79mb  A-V:0.053 [1144:1536]
    Flushing video frames.
    Writing index...
    Writing header...
    ODML: vprp aspect is 16:9.
    Setting audio delay to 0.080s.
    
    Video stream: 1063.410 kbit/s  (132926 B/s)  size: 2876525 bytes  21.640 secs  542 frames
    
    Audio stream: 1536.000 kbit/s  (192000 B/s)  size: 3840000 bytes  20.000 secs
    x264 [info]: frame I:3     Avg QP:10.62  size:106222
    x264 [info]: frame P:216   Avg QP:10.67  size:  9236
    x264 [info]: frame B:322   Avg QP:13.29  size:  1748
    x264 [info]: consecutive B-frames: 19.7%  0.7%  2.2% 77.3%
    x264 [info]: mb I  I16..4: 58.7%  8.0% 33.3%
    x264 [info]: mb P  I16..4:  2.8%  1.4%  1.3%  P16..4: 12.8%  1.6%  1.0%  0.2%  0.2%    skip:78.7%
    x264 [info]: mb B  I16..4:  0.7%  0.6%  0.2%  B16..8:  2.4%  0.3%  0.2%  direct: 6.7%  skip:88.9%  L0:44.3% L1:47.1% BI: 8.5%
    x264 [info]: 8x8 transform intra:26.2% inter:52.8%
    x264 [info]: coded y,uvDC,uvAC intra: 38.7% 35.5% 16.8% inter: 3.9% 6.7% 1.0%
    x264 [info]: i16 v,h,dc,p: 56% 37%  4%  4%
    x264 [info]: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 33% 29%  2%  2%  2%  2%  2%  3%
    x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 33% 16%  4%  4%  5%  4%  4%  4%
    x264 [info]: Weighted P-Frames: Y:8.8%
    x264 [info]: ref P L0: 69.0% 20.1%  3.6%  3.3%  4.0%
    x264 [info]: ref B L0: 91.5%  6.9%  1.6%
    x264 [info]: ref B L1: 95.0%  5.0%
    x264 [info]: kb/s:1063.41
    

  • Related Answers
  • scompt.com

    I'm an idiot. The video is non-interlaced and I was passing the -deinterlace flag to ffmpeg. This was the source of the artifacts.