Yash
Yash

Reputation: 5325

ffmpeg : audio + image to video : reduce time and space it takes

I am using FFMPEG to convert an image and an audio to a video.

I am able to achieve the final video using the following command (Attaching the output of the command too) :

time ffmpeg -loop 1 -i inputImage.jpg -i inputAudio.mp3 -c:v libx264 -
c:a copy -shortest output1.mp4
ffmpeg version 4.1.3-0york1~16.04 Copyright (c) 2000-2019 the FFmpeg 
developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 20160609
  configuration: --prefix=/usr --extra-version='0york1~16.04' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-nonfree --enable-libfdk-aac --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
Input #0, image2, from 'inputImage.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 32003 kb/s
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 4160x2340 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
[mp3 @ 0x55cd4bed0f80] Estimating duration from bitrate, this may be inaccurate
Input #1, mp3, from 'inputAudio.mp3':
  Duration: 00:00:23.77, start: 0.000000, bitrate: 127 kb/s
    Stream #1:0: Audio: mp3, 44100 Hz, mono, fltp, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
[libx264 @ 0x55cd4bee9c80] using SAR=1/1
[libx264 @ 0x55cd4bee9c80] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x55cd4bee9c80] profile High, level 6.0
[libx264 @ 0x55cd4bee9c80] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - 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=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=2 keyint=250 keyint_min=25 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 'output1.mp4':
  Metadata:
    encoder         : Lavf58.20.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj420p(pc), 4160x2340 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 12800 tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.35.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 128 kb/s
frame=  647 fps= 21 q=28.0 Lsize=    1302kB time=00:00:23.76 bitrate= 449.0kbits/s speed=0.778x    
video:908kB audio:371kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.797463%
[libx264 @ 0x55cd4bee9c80] frame I:3     Avg QP:12.36  size:235361
[libx264 @ 0x55cd4bee9c80] frame P:163   Avg QP:17.66  size:   469
[libx264 @ 0x55cd4bee9c80] frame B:481   Avg QP:20.95  size:   336
[libx264 @ 0x55cd4bee9c80] consecutive B-frames:  0.8%  0.3%  0.0% 98.9%
[libx264 @ 0x55cd4bee9c80] mb I  I16..4: 60.6% 37.5%  1.9%
[libx264 @ 0x55cd4bee9c80] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.3%  0.0%  0.0%  0.0%  0.0%    skip:99.7%
[libx264 @ 0x55cd4bee9c80] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.2%  0.0%  0.0%  direct: 0.0%  skip:99.8%  L0:46.7% L1:53.3% BI: 0.0%
[libx264 @ 0x55cd4bee9c80] 8x8 transform intra:36.9% inter:94.7%
[libx264 @ 0x55cd4bee9c80] coded y,uvDC,uvAC intra: 29.0% 60.8% 5.5% inter: 0.0% 0.1% 0.0%
[libx264 @ 0x55cd4bee9c80] i16 v,h,dc,p: 19% 67% 14%  0%
[libx264 @ 0x55cd4bee9c80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  8% 42% 41%  1%  0%  0%  0%  0%  8%
[libx264 @ 0x55cd4bee9c80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 60%  5%  0%  0%  0%  0%  0%  0%
[libx264 @ 0x55cd4bee9c80] i8c dc,h,v,p: 24% 56% 16%  5%
[libx264 @ 0x55cd4bee9c80] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x55cd4bee9c80] ref P L0: 96.2%  0.0%  1.8%  2.0%
[libx264 @ 0x55cd4bee9c80] ref B L0: 87.7%  8.6%  3.7%
[libx264 @ 0x55cd4bee9c80] ref B L1: 98.5%  1.5%
[libx264 @ 0x55cd4bee9c80] kb/s:291.81

real    0m30.671s
user    1m50.724s
sys 0m0.348s

Here are the respected sizes of inputs and output:

inputImage.jpg : 160kb

inputAudio.mp3 : 380.3kb

output1.mp4 : 1.3MB

The size of output video is pretty large as compared to the input audio. This is my first issue.

Secondly, as you can see, this process takes ~30sec, which is too much I think.

How do I solve this two problems?

I've gone through numerous online links, including a lot of questions on this forum for the past several hours but still not able to solve this. Tried playing with framerate but disturbs the duration of the output video.

Can someone please help here. Let me know if any other information is needed.

1 thing that helped me reduce the size of final video from 3MB to 1.2MB was to compress the image that I am using.

Upvotes: 0

Views: 217

Answers (1)

Suraj
Suraj

Reputation: 567

Both your issues are due to the same cause. FFmpeg has generated the video by repeating the image 647 times. Your output file has 647 video frames at 21 FPS. This info is displayed in your console output.

frame= 647 fps= 21 q=28.0 Lsize= 1302kB time=00:00:23.76 bitrate= 449.0kbits/s speed=0.778x

You can optimise this by one or more of the following ways

  • Decrease output video resolution (-s lower-resolution)
  • Decrease output video bitrate (-vb lower-video-bitrate)
  • Decrease output FPS (-r lower-frame-rate)

Upvotes: 2

Related Questions