1

I tried to process 4gb video using ffmpeg on server with 1 CPU & 2GB RAM but the command is hanged for 5 mins then starts and process very slowly. Following is the console output:

Command

ffmpeg -i input.mp4 -filter_complex '[0:v]trim=823.2:867.3,setpts=PTS-STARTPTS[v0];[0:v]trim=1074.1:1101.4,setpts=PTS-STARTPTS[v1];[0:v]trim=1142.2:1198.9,setpts=PTS-STARTPTS[v2];[0:v]trim=1227.9:1320.0,setpts=PTS-STARTPTS[v3];[0:v]trim=1887.1:1990.8,setpts=PTS-STARTPTS[v4];[0:v]trim=2008.1:2091.3,setpts=PTS-STARTPTS[v5];[0:v]trim=3090.1:3105.1,setpts=PTS-STARTPTS[v6];[0:v]trim=3185.3:3222.2,setpts=PTS-STARTPTS[v7];[0:v]trim=3306.4:3336.5,setpts=PTS-STARTPTS[v8];[0:v]trim=3426.7:3465.7,setpts=PTS-STARTPTS[v9];[0:v]trim=3548.7:3586.5,setpts=PTS-STARTPTS[v10];[v0][v1][v2][v3][v4][v5][v6][v7][v8][v9][v10]concat=n=11:v=1[out]' -map '[out]' output.mp4

Output

ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --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-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/down-net_http20200902-1614-1x7tk8f.mp4':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2020-08-28T14:02:14.000000Z
  Duration: 01:00:18.73, start: 0.000000, bitrate: 8895 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 8871 kb/s, 15 fps, 15 tbr, 6k tbn, 12k tbc (default)
    Metadata:
      creation_time   : 2020-08-28T14:02:14.000000Z
      handler_name    : Core Media Video
Stream mapping:
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  Stream #0:0 (h264) -> trim
  concat -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
[libx264 @ 0x563bd0d2c520] using SAR=1/1
[libx264 @ 0x563bd0d2c520] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x563bd0d2c520] profile High, level 3.1
[libx264 @ 0x563bd0d2c520] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - 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=250 keyint_min=15 scenecut=40 intra_refresh=0 rc_lookahead=40 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 '/opt/app/tmp/file_1599089716.mp4':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    encoder         : Lavf57.83.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 15 fps, 15360 tbn, 15 tbc (default)
    Metadata:
      encoder         : Lavc57.107.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=    0 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=   0x 


How can I improve the speed?

==================

I tried following command and getting an error:

Command

ffmpeg -ss 823.2 -to 867.3 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 1074.1 -to 1101.4 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 1142.2 -to 1198.9 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 1227.9 -to 1320.0 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 1887.1 -to 1990.8 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 2008.1 -to 2091.3 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 3090.1 -to 3105.1 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 3185.3 -to 3222.2 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 3306.4 -to 3336.5 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 3426.7 -to 3465.7 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -ss 3548.7 -to 3586.5 -i /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4  -filter_complex '[0:v][1:v][2:v][3:v][4:v][5:v][6:v][7:v][8:v][9:v][10:v]concat=n=11:v=1:a=0[v]' -map '[v]' /opt/app/tmp/file_1599127170.mp4

Error

Option to (record or transcode stop time) cannot be applied to input url /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
Error parsing options for input file /opt/app/tmp/down-net_http20200903-4776-1o4wkhk.mp4.
Error opening input files: Invalid argument
puneet18
  • 4,341
  • 2
  • 21
  • 27

1 Answers1

6

trim/atrim can be slow

The trim/atrim filter has to decode the video until it reaches the desired timestamp. This can be slow.

The reason I suggested trim in your previous answer is because you initially wanted to use frames (instead of timestamp) as the unit which trim can do, but -ss + -t/-to can not.

-ss + -to/-t is faster

You can use -ss + -to/-t input options to quickly jump to the closest keyframe then start decoding.

Examples

Using -to:

ffmpeg -ss 823.2 -to 867.3 -i input.mp4 -ss 1074.1 -to 1101.4 -i input.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
  • Using -to as an input option requires FFmpeg 4.0 or later. Or use the -t option instead as shown below.

  • For video only use -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[v]" -map "[v]" output.mp4

Using -t:

ffmpeg -ss 823.2 -t 44.1 -i input.mp4 -ss 1074.1 -t 27.3 -i input.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
llogan
  • 121,796
  • 28
  • 232
  • 243
  • please check updated question. I tried your answer but getting an error – puneet18 Sep 03 '20 at 10:04
  • @puneet18 Your ffmpeg is too old. [Download](https://johnvansickle.com/ffmpeg/) or [compile](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu) a recent version. – llogan Sep 03 '20 at 18:07
  • OK wil do and try. But if I change -to to -t then it will work. Do you know, how to compress the video by 300%, also if video has audio then what should be the command? as you answer was works for video without audio only – puneet18 Sep 03 '20 at 21:02
  • Also need to confirm, my video size is 3.4 Gb, so which is fast, 1) first compress then process OR 2) first process then compress? – puneet18 Sep 03 '20 at 21:05
  • @puneet18 1) Edited to include audio. 2) Compressing an arbitrary input to be a certain amount smaller may be inefficient. If the encoder that created the file is a poor encoder then x264 will likely make a much smaller output automatically. Also, it is not a 1:1 comparison because you are trimming the original, so saying "I want the output to be 300% smaller" may not be the best way to achieve whatever goal you are attempting. 3) I don't understand your compress/process question. The 2 examples in the answer do both in the same command. – llogan Sep 03 '20 at 21:33
  • Thanks for your answer. Need to know how can I compressed the output video? Is there any parameter which pass with trim command to compress output video – puneet18 Sep 03 '20 at 21:59
  • 1
    @puneet18 I recommend asking a new question since it is a different topic than "why FFMPEG process is slow?" (which I believe should now be solved). This site works best with 1 question, 1 answer instead of continuous multiple follow-up questions that are unrelated to the original question. – llogan Sep 03 '20 at 22:19
  • please check https://superuser.com/questions/1582867/how-to-compress-output-video-with-trim-using-ffmpeg – puneet18 Sep 03 '20 at 22:41