DALER RAHIMOV
DALER RAHIMOV

Reputation: 11

How to speed up creating video mosaic with ffmpeg

I'm looking to speed up ffmpeg pipeline in some way (camera configuration, different filters or any other ideas would be appreciated).

I have a device that captures videos streams and later creates mosaic video view from 4 cameras. The main issue I'm having is that it's taking too long to create mosaic video. There is no GPU on the device that could be used to accelerate the process so I'm left with camera configurations (Hikvision).

Here is what I have so far

About 160 sec on Intel J-1900:

- 5 min video files,
- 640*480 resolution,
- h264 encoding,
- 10 fps,
- 1024 max bitrate,
- 10 I-frame interval,      

Command that I'm using:

ffmpeg -y -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 \
   -filter_complex " \
      color=c=black:size=1280x720 [base]; \
      [0:v] setpts=PTS-STARTPTS, scale=640x360 [cam0]; \
      [1:v] setpts=PTS-STARTPTS, scale=640x360 [cam1]; \
      [2:v] setpts=PTS-STARTPTS, scale=640x360 [cam2]; \
      [3:v] setpts=PTS-STARTPTS, scale=640x360 [cam3]; \
      [base][cam0] overlay=shortest=1:x=0:y=0  [z1]; \
      [z1][cam1] overlay=shortest=1:x=640:y=0  [z2]; \
      [z2][cam2] overlay=shortest=1:x=0:y=360  [z3]; \
      [z3][cam3] overlay=shortest=1:x=640:y=360 \
    " \
    -an -c:v libx264  -x264-params keyint=10 \
    -movflags faststart -preset fast -nostats -loglevel quiet -r 10.000000 mosaic.mp4

Thanks

Here is full output as requested

ffmpeg -y -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 \
>    -filter_complex " \
>       color=c=black:size=1280x720 [base]; \
>       [0:v] setpts=PTS-STARTPTS, scale=640x360 [cam0]; \
>       [1:v] setpts=PTS-STARTPTS, scale=640x360 [cam1]; \
>       [2:v] setpts=PTS-STARTPTS, scale=640x360 [cam2]; \
>       [3:v] setpts=PTS-STARTPTS, scale=640x360 [cam3]; \
>       [base][cam0] overlay=shortest=1:x=0:y=0  [z1]; \
>       [z1][cam1] overlay=shortest=1:x=640:y=0  [z2]; \
>       [z2][cam2] overlay=shortest=1:x=0:y=360  [z3]; \
>       [z3][cam3] overlay=shortest=1:x=640:y=360 \
>     " \
>     -an -c:v libx264  -x264-params keyint=10 \
>     -movflags faststart -preset fast -nostats -r 10.000000 mosaic.mp4
ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg -y -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4 -i 1578324600-1-stitched.mp4    -filter_complex " \
      color=c=black:size=1280x720 [base]; \
      [0:v] setpts=PTS-STARTPTS, scale=640x360 [cam0]; \
      [1:v] setpts=PTS-STARTPTS, scale=640x360 [cam1]; \
      [2:v] setpts=PTS-STARTPTS, scale=640x360 [cam2]; \
      [3:v] setpts=PTS-STARTPTS, scale=640x360 [cam3]; \
      [base][cam0] overlay=shortest=1:x=0:y=0  [z1]; \
      [z1][cam1] overlay=shortest=1:x=640:y=0  [z2]; \
      [z2][cam2] overlay=shortest=1:x=0:y=360  [z3]; \
      [z3][cam3] overlay=shortest=1:x=640:y=360 \
    "     -an -c:v libx264  -x264-params keyint=10     -movflags faststart -preset fast -r 10.000000 mosaic.mp4
ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1578324600-1-stitched.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 00:05:00.07, start: 0.000000, bitrate: 96 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x480, 95 kb/s, 10 fps, 25 tbr, 10240 tbn, 20 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '1578324600-1-stitched.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 00:05:00.07, start: 0.000000, bitrate: 96 kb/s
    Stream #1:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x480, 95 kb/s, 10 fps, 25 tbr, 10240 tbn, 20 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '1578324600-1-stitched.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 00:05:00.07, start: 0.000000, bitrate: 96 kb/s
    Stream #2:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x480, 95 kb/s, 10 fps, 25 tbr, 10240 tbn, 20 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '1578324600-1-stitched.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 00:05:00.07, start: 0.000000, bitrate: 96 kb/s
    Stream #3:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 640x480, 95 kb/s, 10 fps, 25 tbr, 10240 tbn, 20 tbc (default)
    Metadata:
      handler_name    : VideoHandler
[libx264 @ 0x171c9e0] using SAR=1/1
[libx264 @ 0x171c9e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x171c9e0] profile High, level 3.1
[libx264 @ 0x171c9e0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=2 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=6 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=6 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=1 keyint=10 keyint_min=1 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'mosaic.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 10 fps, 10240 tbn, 10 tbc (default)
    Metadata:
      encoder         : Lavc56.60.100 libx264
Stream mapping:
  Stream #0:0 (h264) -> setpts
  Stream #1:0 (h264) -> setpts
  Stream #2:0 (h264) -> setpts
  Stream #3:0 (h264) -> setpts
  overlay -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
[mp4 @ 0x1730600] Starting second pass: moving the moov atom to the beginning of the filerop=4497
frame= 3002 fps= 17 q=-1.0 Lsize=   51052kB time=00:05:00.00 bitrate=1394.1kbits/s dup=0 drop=4498
video:51017kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.068308%
[libx264 @ 0x171c9e0] frame I:301   Avg QP:15.80  size:154257
[libx264 @ 0x171c9e0] frame P:959   Avg QP:21.69  size:  5486
[libx264 @ 0x171c9e0] frame B:1742  Avg QP:22.73  size:   315
[libx264 @ 0x171c9e0] consecutive B-frames: 22.0%  0.0%  5.8% 72.2%
[libx264 @ 0x171c9e0] mb I  I16..4:  9.7% 31.0% 59.4%
[libx264 @ 0x171c9e0] mb P  I16..4:  0.6%  0.7%  0.2%  P16..4: 14.5%  2.8%  2.4%  0.0%  0.0%    skip:78.7%
[libx264 @ 0x171c9e0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  2.7%  0.3%  0.0%  direct: 1.4%  skip:95.5%  L0:25.9% L1:73.3% BI: 0.9%
[libx264 @ 0x171c9e0] 8x8 transform intra:31.8% inter:43.5%
[libx264 @ 0x171c9e0] coded y,uvDC,uvAC intra: 83.2% 85.2% 69.5% inter: 3.0% 6.3% 0.7%
[libx264 @ 0x171c9e0] i16 v,h,dc,p: 35% 21%  8% 36%
[libx264 @ 0x171c9e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 42% 10%  3%  2%  3%  6%  4%  5%
[libx264 @ 0x171c9e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 33%  9%  6%  5%  5%  7%  5%  6%
[libx264 @ 0x171c9e0] i8c dc,h,v,p: 44% 29% 20%  7%
[libx264 @ 0x171c9e0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x171c9e0] ref P L0: 93.8%  6.2%
[libx264 @ 0x171c9e0] ref B L0: 91.7%  8.3%
[libx264 @ 0x171c9e0] ref B L1: 89.3% 10.7%
[libx264 @ 0x171c9e0] kb/s:1392.16

Upvotes: 1

Views: 2343

Answers (1)

llogan
llogan

Reputation: 133713

Version 2.8 is ancient. Update to a modern build (download or compile) and use the xstack filter. It will be faster than color + overlay.

-filter_complex \
  "[0]setpts=PTS-STARTPTS,crop=iw:360[topleft]; \
   [1]setpts=PTS-STARTPTS,crop=iw:360[topright]; \
   [2]setpts=PTS-STARTPTS,crop=iw:360[bottomleft]; \
   [3]setpts=PTS-STARTPTS,crop=iw:360[bottomright]; \
   [topleft][topright][bottomleft][bottomright]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0"

Additionally you can use a faster -preset such as ultrafast, superfast, veryfast, faster.

Upvotes: 1

Related Questions