Simplify FFmpeg amerge and volume customization

9

4

I have 3 consecutive FFmpeg commands that will customize the volume of an audio, customize the volume of a video, and amerge audio and video to a final output.

First command, edit volume level of a mp3 File

  ffmpeg -i music.mp3 -vol 100 music2.mp3

Second command, edit volume level of a mp4 file

ffmpeg -i video.mp4 -vol 200 video2.mp4

Third command,merge music2.mp3andvideo2.mp4

ffmpeg -i music2.mp3 -i ruby.mp4 -filter_complex \
    "[0:a][1:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[out]" \
    -map 1:v -map "[out]" -c:v copy -c:a libfdk_aac -shortest video2.mp4

Is there an easy way to simplify and breakdown processes into just one process/command?

I've tried this one, but not working:

ffmpeg -i music.mp3 -vol 100 -i video.mp4 -vol 200 -filter_complex \
    "[0:a][1:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[out]" \
    -map 1:v -map "[out]" -c:v copy -c:a libfdk_aac -shortest output.mp4

Error log(s):

    ffmpeg version N-60332-ga0d5204 Copyright (c) 2000-2014 the FFmpeg developers
  built on Feb  4 2014 21:31:51 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
  configuration: --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid
  libavutil      52. 63.100 / 52. 63.100
  libavcodec     55. 49.101 / 55. 49.101
  libavformat    55. 29.101 / 55. 29.101
  libavdevice    55.  7.100 / 55.  7.100
  libavfilter     4.  1.102 /  4.  1.102
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mp3, from 'adele.mp3':
  Metadata:
    title           : Chasing Pavements
    artist          : Adele
    track           : 3
    album           : 19 (Deluxe Edition)
    date            : 2008
  Duration: 00:03:30.55, start: 0.025056, bitrate: 160 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 159 kb/s
    Stream #0:1: Video: mjpeg, yuvj420p(pc), 600x600 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
    Metadata:
      title           : 
      comment         : Other
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'Ruby on Rails 101- What is Ruby on Rails_.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-12-21 07:56:20
  Duration: 00:05:42.40, start: 0.000000, bitrate: 1214 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1020 kb/s, 30 fps, 30 tbr, 60 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #1:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
    Metadata:
      creation_time   : 2013-12-21 07:56:23
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
[Parsed_pan_1 @ 0x7fcd23d00680] This syntax is deprecated. Use '|' to separate the list items.
-vol has been deprecated. Use the volume audio filter instead.
-vol is forwarded to lavfi similarly to -af volume=0.781250.
-vol has been deprecated. Use the volume audio filter instead.
-vol is forwarded to lavfi similarly to -af volume=0.781250.
File 'output.mp4' already exists. Overwrite ? [y/N] y
[Parsed_amerge_0 @ 0x7fcd23d00000] No channel layout for input 1
    Last message repeated 1 times
[AVFilterGraph @ 0x7fcd23c0f5a0] The following filters could not choose their formats: Parsed_amerge_0
Consider inserting the (a)format filter near their input or output.

emfolorncynosure

Posted 2014-02-10T15:11:23.113

Reputation: 321

Please provide the full uncut command line output instead, not just the parts you think are relevant. Thanks. – slhck – 2014-02-10T17:22:28.027

Yup edited my post. – emfolorncynosure – 2014-02-10T17:52:17.400

Answers

14

One command to bind them

You can do this in one command using the volume audio filter instead of the old -vol option (as mentioned by your console output):

ffmpeg -i music.mp3 -i videowithaudio.mp4 -filter_complex \
"[0:a]volume=0.390625[a1];[1:a]volume=0.781250[a2]; \
 [a1][a2]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[out]" \
-map 1:v -map "[out]" -c:v copy -c:a libfdk_aac -shortest output.mp4

You may have to adjust the values for volume.


Potential problems

syntax is deprecated

[Parsed_pan_4 @ 0x244c980] This syntax is deprecated. Use '|' to separate the list items.

Don't worry – you can ignore this message.

could not choose their formats

[AVFilterGraph @ 0x26549a0] The following filters could not choose their formats: Parsed_amerge_3
Consider inserting the (a)format filter near their input or output.

All inputs must have the same sample rate and format for amerge. If they are different then you will have to use the aformat audio filter:

ffmpeg -i music.mp3 -i videowithaudio.mp4 -filter_complex \
"[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5[a1]; \
 [1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.8[a2]; \
 [a1][a2]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[out]" \
-map 1:v -map "[out]" -c:v copy -c:a libfdk_aac -shortest output.mp4

llogan

Posted 2014-02-10T15:11:23.113

Reputation: 31 929

I have the same use case and I get "No channel layout for input 1" error – Lukasz Madon – 2014-12-14T20:51:18.247

@lukas Can you show your ffmpeg command and complete console output? You can use a pastebin service and provide the link. – llogan – 2014-12-14T22:40:53.760

@LordNeckbeard https://gist.github.com/lukasz-madon/508d76d6fd5ff3635494 with the exact same command it complains about libfdk_aac

– Lukasz Madon – 2014-12-14T23:23:10.560

@lukas Can you download and test a more recent build? Your version is outdated.

– llogan – 2014-12-15T04:37:36.267

@LordNeckbeard with ffmpeg version 2.5 I have the same error for these http://test.co.s3.amazonaws.com/jingiel_bacterion_v2.mp3 http://test.co.s3.amazonaws.com/trailer.wmv

– Lukasz Madon – 2014-12-17T22:18:28.633

@LordNeckbeard check the updated solution – Amerrnath – 2017-03-31T07:29:16.900

@Amerrnath The edit was rejected before I looked at it, but my example already mentions sample_rates. – llogan – 2017-04-02T17:17:18.987

1Hi @LordNeckbeard, it still says [AVFilterGraph @ 0x7f951b42a080] The following filters could not choose their formats: Parsed_amerge_5 Consider inserting the (a)format filter near their input or output. even if I used aformat sample. – emfolorncynosure – 2014-02-11T07:55:10.373