Tchoupi
Tchoupi

Reputation: 303

FFMPEG : Change Video during encoding (using mapping)

I'm currently trying to concat several videos using a complex filter:

ffmpeg.exe -threads 8 -i "D:\Temporary0.mp4"  -i "D:\Temporary1.mp4"  -i "D:\Temporary2.mp4"  -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a]  concat=n=3:v=1:a=1 [v] [a] " -map "[v]" -map "[a]"  -vcodec libx264 -b 2500000 -s 1920:1080 -y D:\EditedVideo.mp4

This command work fine. Edit: Here the output of the command:

ffmpeg version N-56297-g7ac6c63 Copyright (c) 2000-2013 the FFmpeg developers
  built on Sep 15 2013 18:02:28 with gcc 4.7.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libblu
ray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-l
ibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 43.100 / 52. 43.100
  libavcodec     55. 31.101 / 55. 31.101
  libavformat    55. 16.102 / 55. 16.102
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 84.100 /  3. 84.100
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\Temporary0.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.16.102
  Duration: 00:00:02.91, start: 0.033333, bitrate: 8998 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 8965 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\Temporary1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.16.102
  Duration: 00:00:05.00, start: 0.023220, bitrate: 846 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 835 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #1:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 1 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'D:\Temporary2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.16.102
  Duration: 00:00:04.35, start: 0.033333, bitrate: 4684 kb/s
    Stream #2:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 4581 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #2:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Please use -b:a or -b:v, -b is ambiguous
[libx264 @ 04f617e0] using SAR=1/1
[libx264 @ 04f617e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 04f617e0] profile High, level 4.0
[libx264 @ 04f617e0] 264 - core 135 r2345 f0c1c53 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subm
e=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=12 lookahead_threads=2 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 r
c=abr mbtree=1 bitrate=2500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'D:\EditedVideo.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.16.102
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 2500 kb/s, 12800 tbn, 25 tbc
    Stream #0:1: Audio: aac (libvo_aacenc) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, s16, 128 kb/s
Stream mapping:
  Stream #0:0 (h264) -> concat:in0:v0
  Stream #0:1 (aac) -> concat:in0:a0
  Stream #1:0 (h264) -> concat:in1:v0
  Stream #1:1 (aac) -> concat:in1:a0
  Stream #2:0 (h264) -> concat:in2:v0
  Stream #2:1 (aac) -> concat:in2:a0
  concat:out:v0 -> Stream #0:0 (libx264)
  concat:out:a0 -> Stream #0:1 (libvo_aacenc)
Press [q] to stop, [?] for help
frame=  306 fps= 43 q=-1.0 Lsize=    3557kB time=00:00:12.29 bitrate=2369.4kbits/s dup=1 drop=0
video:3353kB audio:193kB subtitle:0 global headers:0kB muxing overhead 0.288541%
[libx264 @ 04f617e0] frame I:3     Avg QP:21.78  size:173526
[libx264 @ 04f617e0] frame P:112   Avg QP:25.76  size: 17363
[libx264 @ 04f617e0] frame B:191   Avg QP:31.04  size:  5068
[libx264 @ 04f617e0] consecutive B-frames: 11.8% 14.4%  2.0% 71.9%
[libx264 @ 04f617e0] mb I  I16..4: 14.6% 82.7%  2.6%
[libx264 @ 04f617e0] mb P  I16..4:  3.5%  8.8%  0.2%  P16..4: 30.1%  5.3%  2.6%  0.0%  0.0%    skip:49.4%
[libx264 @ 04f617e0] mb B  I16..4:  0.7%  1.1%  0.0%  B16..8: 21.6%  1.2%  0.1%  direct: 1.2%  skip:74.1%  L0:47.0% L1:50.6% BI: 2.4%
[libx264 @ 04f617e0] final ratefactor: 25.69
[libx264 @ 04f617e0] 8x8 transform intra:70.8% inter:88.5%
[libx264 @ 04f617e0] coded y,uvDC,uvAC intra: 34.3% 50.2% 7.2% inter: 7.3% 13.3% 0.3%
[libx264 @ 04f617e0] i16 v,h,dc,p: 22% 33%  7% 37%
[libx264 @ 04f617e0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 17% 22% 34%  4%  5%  4%  5%  4%  5%
[libx264 @ 04f617e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 22% 18%  5%  6%  6%  5%  6%  4%
[libx264 @ 04f617e0] i8c dc,h,v,p: 60% 21% 16%  3%
[libx264 @ 04f617e0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 04f617e0] ref P L0: 62.6%  9.1% 19.8%  8.5%
[libx264 @ 04f617e0] ref B L0: 85.3% 12.6%  2.1%
[libx264 @ 04f617e0] ref B L1: 92.4%  7.6%
[libx264 @ 04f617e0] kb/s:2243.97
[libvo_aacenc @ 0420e900] 1 frames left in the queue on closing

I would like to update this command to change volume during concat and encode time:

ffmpeg.exe -threads 8 -i "D:\Temporary0.mp4"  -i "D:\Temporary1.mp4"  -i "D:\Temporary2.mp4"  -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a]  concat=n=3:v=1:a=1 [v] [a] " -map "[v]" -map "[a]"  -vcodec libx264 -b 2500000 -s 1920:1080 -af volume="volume=20dB:precision=double" -y D:\EditedVideo.mp4

This command is executed but the audio stream is not altered with the +20db

PS: If I do a simple encoding command like

ffmpeg.exe -i source -vcodec libx264 -af volume="volume=20dB:precision=double" -y output

Command work fine and audio stream is modified.

So How can I Do to concat my videos and change audio volume at the same time ?

Thanks

Upvotes: 1

Views: 2767

Answers (1)

llogan
llogan

Reputation: 133983

example

All filtering should be done in one filtergraph:

$ ffmpeg -y -i input0.mp4 -i input1.mp4 -i input2.mp4 -filter_complex \
  "[1:a]pan=stereo:c0=c0:c0=c1,aresample=48000[a1]; \
   [0:v][0:a][1:v][a1][2:v][2:a]concat=n=3:v=1:a=1[v1][a2]; \
   [v1]scale=1920:-1[v2]; \
   [a2]volume=volume=20dB:precision=double[a3]" \
   -map "[v2]" -map "[a3]" -codec:v libx264 -crf 23 -preset medium output.mp4

Note: This is an untested example.

filtering

  1. One of your inputs was mono, not stereo, so the first step is to change it to stereo with pan, and then resample it with aresample to match the other inputs.

  2. Then concat is used to concatenate everything.

  3. Although your inputs are all 1920x1080 you still included -s 1920x1080 for some reason. I moved the scaling into the filtergraph so with the scale filter you can control exactly when the scaling occurs to which specific stream(s). I only declared the width and with -1 told scale to automatically provide the height while preserving aspect.

  4. The volume is then adjusted with the volume filter.

other

  • -b is ambiguous. You should be explicit as to which stream it applies to: video (-b:v) or audio (-b:a).

  • When using libx264: -crf is generally recommended over -b:v unless you are targeting a specific output file size. See the FFmpeg and x264 Encoding Guide for more info.

Upvotes: 1

Related Questions